如何通过获取当前分支中的版本来自动解决Git冲突?

问题描述 投票:0回答:3

假设我在运行此命令时在

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

git merge automation conflict
3个回答
29
投票

您可以将合并策略 option

ours
指定为
recursive
(默认)合并策略。它将执行正常的合并,但如果有冲突,它将选择当前分支的版本(即我们的)。

git checkout A
git merge -X ours B

请注意,这与

-s ours
有很大不同,后者选择不同的合并策略。这样做会丢弃其他分支的所有更改,只保留我们的版本。请参阅如何“覆盖”而不是“合并”Git 中另一个分支上的一个分支?了解更多详细信息。


20
投票

如果您想一次性执行此操作,单行命令是:

$ 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
,这些适用于整个合并。


-1
投票

检出目标分支并与主分支合并,并自动解决他们的冲突

git merge -X theirs master
© www.soinside.com 2019 - 2024. All rights reserved.