.gitattributes 合并策略不起作用
.gitattributes merge strategy not working
我在 .gitattributes 中使用合并策略来在合并期间保留文件。我还使用 git config --global merge.ours.driver true;
在我的配置中设置驱动程序(我检查了 [merge "ours"] driver = true
的配置,它就在那里)。
我的合并策略设置正确:
src/public/bundle.js merge=ours
src/public/main.min.css merge=ours
server/middlewares/https_redirect.js merge=ours
但是当我合并时,我仍然从正在合并的分支中获取文件。
我做错了什么?
你需要的是自定义"merge strategy"
参见 git: How do I add a custom merge strategy?(编辑补充:编写合并策略处理程序比编写自定义合并驱动程序要困难得多。但这是获得我认为您想要的行为的唯一方法。)
您拥有的是自定义合并驱动程序
您的设置看起来确实正确(尽管有点 "cheat-y",使用 /bin/true
或内置的 shell 等效于只保留 %A
文件并成功退出:-))。但我怀疑您 运行 遇到了常见问题,即:
Git 仅在有 两个差异要合并时才调用 three-way 合并驱动程序。
也就是说,假设我们实际上在进行 three-way 合并。这意味着有一些文件的合并基础版本,例如 src/public/bundle.js
,因为有一个 merge-base 提交不同于两个分支提示提交。我们在某个分支上,它的 tip 提交是 1111111
,我们正在合并一些其他提交,它的哈希 ID 是 2222222
,git merge-base 1111111 2222222
是 bbbbbbb
。因此,Git 已完成 git diff bbbbbbb 1111111
将零钱从基地转移到我们的,git diff bbbbbbb 2222222
将零钱从基地转移到他们的。
src/public/bundle.js
的基础版本是提交 bbbbbbb
中的版本。但是,也许从 bbbbbbb:src/public/bundle.js
到 1111111:src/public/bundle.js
的差异是 empty,而从 bbbbbbb:src/public/bundle.js
到 2222222:src/public/bundle.js
的差异是 non-empty.
在这种情况下,Git 不会 对文件进行 three-way 合并。它没有必要,所以它不会打扰。它根本不会调用您的自定义合并驱动程序;它只是获取文件的 2222222
版本并显示 "I'm done, all merged!"
无论您是让 Git 使用自己的 built-in 合并代码,还是指定自定义驱动程序,这都是正确的:它永远不会打扰 调用 合并代码在它可以——或者认为它可以——根本不进行合并的情况下逃脱。它只需要一个更改的版本并称其为好。
(我个人认为这是错误的 / 一个错误,但是 Git 已经这样做了很多年,Git 的人似乎不愿意改变它。)
我在 .gitattributes 中使用合并策略来在合并期间保留文件。我还使用 git config --global merge.ours.driver true;
在我的配置中设置驱动程序(我检查了 [merge "ours"] driver = true
的配置,它就在那里)。
我的合并策略设置正确:
src/public/bundle.js merge=ours
src/public/main.min.css merge=ours
server/middlewares/https_redirect.js merge=ours
但是当我合并时,我仍然从正在合并的分支中获取文件。
我做错了什么?
你需要的是自定义"merge strategy"
参见 git: How do I add a custom merge strategy?(编辑补充:编写合并策略处理程序比编写自定义合并驱动程序要困难得多。但这是获得我认为您想要的行为的唯一方法。)
您拥有的是自定义合并驱动程序
您的设置看起来确实正确(尽管有点 "cheat-y",使用 /bin/true
或内置的 shell 等效于只保留 %A
文件并成功退出:-))。但我怀疑您 运行 遇到了常见问题,即:
Git 仅在有 两个差异要合并时才调用 three-way 合并驱动程序。
也就是说,假设我们实际上在进行 three-way 合并。这意味着有一些文件的合并基础版本,例如 src/public/bundle.js
,因为有一个 merge-base 提交不同于两个分支提示提交。我们在某个分支上,它的 tip 提交是 1111111
,我们正在合并一些其他提交,它的哈希 ID 是 2222222
,git merge-base 1111111 2222222
是 bbbbbbb
。因此,Git 已完成 git diff bbbbbbb 1111111
将零钱从基地转移到我们的,git diff bbbbbbb 2222222
将零钱从基地转移到他们的。
src/public/bundle.js
的基础版本是提交 bbbbbbb
中的版本。但是,也许从 bbbbbbb:src/public/bundle.js
到 1111111:src/public/bundle.js
的差异是 empty,而从 bbbbbbb:src/public/bundle.js
到 2222222:src/public/bundle.js
的差异是 non-empty.
在这种情况下,Git 不会 对文件进行 three-way 合并。它没有必要,所以它不会打扰。它根本不会调用您的自定义合并驱动程序;它只是获取文件的 2222222
版本并显示 "I'm done, all merged!"
无论您是让 Git 使用自己的 built-in 合并代码,还是指定自定义驱动程序,这都是正确的:它永远不会打扰 调用 合并代码在它可以——或者认为它可以——根本不进行合并的情况下逃脱。它只需要一个更改的版本并称其为好。
(我个人认为这是错误的 / 一个错误,但是 Git 已经这样做了很多年,Git 的人似乎不愿意改变它。)