如何通过获取当前分支中的版本来自动解决 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 冲突?的主要内容,如果未能解决你的问题,请参考以下文章

git如何拉取主版本中的最新代码到自己空间的分支

git常用命令

Git使用详解Egit的常用操作详解

如何在 Git 的当前分支中获取最新的标签名称?

如何手写一个 webpack 插件:实现 vuecli3 打包时生成一个 git 分支版本信息的文件?

git fetch后怎么比较差异