当使用git merge将主题分支“B”合并为“A”时,我得到了一些冲突。我知道所有的冲突都可以用B的版本解决。
我知道git合并是我们的。但我想要的是类似git merge -s的东西。
为什么它不存在?如何在与现有git命令冲突合并后实现相同的结果?(git从B中检出所有未合并的文件)
仅仅丢弃分支A中的任何东西(合并提交点到树的B版本)的“解决方案”不是我想要的。
当使用git merge将主题分支“B”合并为“A”时,我得到了一些冲突。我知道所有的冲突都可以用B的版本解决。
我知道git合并是我们的。但我想要的是类似git merge -s的东西。
为什么它不存在?如何在与现有git命令冲突合并后实现相同的结果?(git从B中检出所有未合并的文件)
仅仅丢弃分支A中的任何东西(合并提交点到树的B版本)的“解决方案”不是我想要的。
当前回答
请参阅Junio Hamano被广泛引用的答案:如果您要丢弃已提交的内容,那么只需丢弃提交,或者无论如何要将其排除在主历史记录之外。将来为什么要麻烦每个人从没有提供任何东西的提交中读取提交消息呢?
但有时会有管理要求,或者其他原因。对于那些你真的必须记录没有贡献的提交的情况,你想要:
(编辑:哇,我以前错了吗?这个是可行的。)
git update-ref HEAD $(
git commit-tree -m 'completely superseding with branchB content' \
-p HEAD -p branchB branchB:
)
git reset --hard
其他回答
这一个使用了git管道命令读树,但是使得整个工作流程更短。
git checkout <base-branch>
git merge --no-commit -s ours <their-branch>
git read-tree -u --reset <their-branch>
git commit
# Check your work!
git diff <their-branch>
我解决了我的问题
git checkout -m old
git checkout -b new B
git merge -s ours old
如果你在分支A上,请:
git merge -s recursive -X theirs B
在git版本1.7.8上测试
旧版本的git允许你使用“their”合并策略:
git pull --strategy=theirs remote_branch
但是这已经被删除了,正如Junio Hamano (Git维护者)在这条消息中解释的那样。正如链接中提到的,相反,你会这样做:
git fetch origin
git reset --hard origin
但是要注意,这与实际的合并不同。你的解决方案可能就是你真正在寻找的选项。
一个简单而直观的(在我看来)两步方法是
git checkout branchB .
git commit -m "Picked up the content from branchB"
紧随其后的是
git merge -s ours branchB
(将两个分支标记为合并)
唯一的缺点是它不能从当前分支中删除branchB中已删除的文件。然后,两个分支之间的简单区别将显示是否存在这样的文件。
这种方法还可以从之后的修订日志中清楚地看出所做的工作以及意图。