31

假设我foo/bar.txt在运行时遇到了合并冲突:

$ git checkout A
$ git merge B

我想通过foo/bar.txt从分支 A 自动解决冲突。(我知道我在做什么,我确实需要这个。分支 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如果该文件中没有冲突,它也不会更改。

4

2 回答 2

24

您可以oursrecursive(默认)合并策略指定合并策略选项。它会做一个正常的合并,但如果发生冲突,帅哥会选择当前分支的版本。

git checkout A
git merge -Xours B
于 2013-01-06T12:51:28.153 回答
19

如果你想一次性完成,单行命令是:

$ 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上面只是 unixtrue命令,它的成功表明它使本地版本看起来正确,在这种情况下,什么都不做。你当然可以用你的合并命令变得更复杂。)

我认为您不希望merge --strategy=oursor --strategy-option=ours,这些适用于整个合并。

于 2013-01-06T19:38:59.580 回答