协慌网

登录 贡献 社区

是否有 “他们的” 版本的“git merge -s ours”?

当使用git merge将主题分支 “B” 合并到 “A” 时,我会遇到一些冲突。我知道使用 “B” 中的版本可以解决所有冲突。

我知道git merge -s ours 。但我想要的是像git merge -s theirs这样的东西。

它为什么不存在?在与现有git命令冲突合并后,如何获得相同的结果? ( git checkout B 中每个未合并的文件)

更新:从分支 A(合并提交点到树的 B 版本)丢弃任何东西的 “解决方案” 不是我想要的。

答案

-X选项添加到theirs选项中。例如:

git checkout branchA
git merge -X theirs branchB

一切都会以理想的方式融合。

我见过的唯一问题是文件是否从 branchB 中删除。如果 git 之外的其他东西都被删除,它们就会显示为冲突。

修复很容易。只需运行git rm ,其中包含已删除的任何文件的名称:

git rm {DELETED-FILE-NAME}

在那之后, -X theirs应该按预期工作。

当然,使用git rm命令进行实际删除可以防止冲突首先发生。


注意 :还存在更长的表单选项。要使用它,请替换:

-X theirs

有:

--strategy-option=theirs

一种可行且经过测试的解决方案,用于将 branchB 合并到我们的签出分支 A 中:

# in case branchA is not our current branch
git checkout branchA

# make merge commit but without conflicts!!
# the contents of 'ours' will be discarded later
git merge -s ours branchB    

# make temporary branch to merged commit
git branch branchTEMP         

# get contents of working tree and index to the one of branchB
git reset --hard branchB

# reset to our merged commit but 
# keep contents of working tree and index
git reset --soft branchTEMP

# change the contents of the merged commit
# with the contents of branchB
git commit --amend

# get rid off our temporary branch
git branch -D branchTEMP

# verify that the merge commit contains only contents of branchB
git diff HEAD branchB

要自动化它,您可以使用 branchA 和 branchB 作为参数将其包装到脚本中。

此解决方案保留了合并提交的第一个和第二个父级,就像您期望的git merge -s theirs branchB

较旧版本的 git 允许您使用 “他们的” 合并策略:

git pull --strategy=theirs remote_branch

但是这已被删除,正如Junio Hamano (Git 维护者)在此消息中所解释的那样。如链接中所述,您可以这样做:

git fetch origin
git reset --hard origin

但要注意,这与实际合并不同。您的解决方案可能是您真正想要的选择。