假设我在运行此命令时在
foo/bar.txt
上遇到合并冲突:
$ git checkout A
$ git merge B
我想通过从分支A获取
foo/bar.txt
来自动解决冲突。(我知道我在做什么,我确实需要这个。分支B中的版本是错误的,我不在乎丢失在这种情况下,工作树发生了变化。)看来我可以通过运行这些命令来做到这一点:
$ git reset foo/bar.txt
$ git checkout foo/bar.txt
有更简单的单命令解决方案吗?
不幸的是,即使没有冲突,这些命令也会改变
foo/bar.txt
,我不希望这样。如果没有冲突,我想将 foo/bar.txt
保持在 git merge B
离开的任何状态。
所以我需要一个Unix shell命令,它会检测
foo/bar.txt
中是否存在冲突,如果存在,它将通过从当前分支中获取foo/bar.txt
的版本来解决冲突。它不会做任何其他事情,即它不会修改其他文件,它不会提交更改,并且如果该文件中没有冲突,它也不会更改foo/bar.txt
。
您可以将合并策略 option
ours
指定为 recursive
(默认)合并策略。它将执行正常的合并,但如果有冲突,它将选择当前分支的版本(即我们的)。
git checkout A
git merge -X ours B
请注意,这与
-s ours
有很大不同,后者选择不同的合并策略。这样做会丢弃其他分支的所有更改,只保留我们的版本。请参阅如何“覆盖”而不是“合并”Git 中另一个分支上的一个分支?了解更多详细信息。
如果您想一次性执行此操作,单行命令是:
$ git checkout --ours foo/bar.txt # <-- resets it only if the merge found conflicts in this file
$ git checkout HEAD -- foo/bar.txt # <-- resets it to that specific version no matter what
配置 git 的合并以永久忽略对本地更改文件的所有上游更改:
$ git config merge.pin.driver true
$ echo foo/bar.txt merge=pin >> .git/info/attributes
(上面的
true
只是unix true
命令,它的成功表明它使本地版本看起来正确,在这种情况下,无需对其执行任何操作。当然,您可以使用合并命令变得更复杂。)
我认为你不想要
merge --strategy=ours
或 --strategy-option=ours
,这些适用于整个合并。
检出目标分支并与主分支合并,并自动解决他们的冲突
git merge -X theirs master