如何通过获取当前分支中的版本来自动解决 Git 冲突?
Posted
技术标签:
【中文标题】如何通过获取当前分支中的版本来自动解决 Git 冲突?【英文标题】:How to automatically resolve a Git conflict by taking the version in the current branch? 【发布时间】:2012-12-20 08:58:49 【问题描述】:假设我在运行时遇到了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
。
【问题讨论】:
远程:***.com/questions/528659/… 【参考方案1】:您可以将合并策略选项ours
指定为recursive
(默认)合并策略。它会进行正常的合并,但如果发生冲突,hunks 会选择当前分支的版本。
git checkout A
git merge -Xours B
【讨论】:
感谢您提供更多信息。不幸的是,它没有回答我的问题,因为git merge B
命令(可能还有许多其他未提交的文件系统更改)已经运行。
如果你已经运行了merge命令,那么你必须使用reset && checkout
方法。
reset+checkout 方法也不是我的问题的答案,因为如果没有冲突,它不是空操作(详见问题)。
@pts:是的,但我没有说你必须无条件地这样做。而且这不是无操作,因为可能会有不冲突的更改通过 Git 的自动冲突解决方案很好地合并。【参考方案2】:
如果你想一次性完成,单行命令是:
$ 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 冲突?的主要内容,如果未能解决你的问题,请参考以下文章