我有
G---H---I---J Develop
/
A---B---C---D---E---F Master
我想用master来重新开发,所以:
G---H---I---J Develop
/
A---B---C---D---E---F Master
所以,如果我做git checkout develop & git rebase master
但是,它会在每次提交时执行rebase,它会发现它将停止的合并冲突。
我很乐意从开发和覆盖中获取所有内容。开发时已经发生了很大的变化,但每次提交都会构建并通过所有测试,所以我可以假设如果我只是覆盖master中的所有内容它应该没问题。
那我怎么说git rebase master --choose develop side
答案 0 :(得分:3)
那将是git rebase -X theirs master
答案 1 :(得分:0)
我认为声明中存在一些歧义
我很高兴从开发和覆盖中获取所有内容
(至少人们如何准备它)。
你的意思是“哪里有冲突我很乐意接受develop
”中的内容?这就是junkangli的答案(git rebase -X theirs master
)。虽然这是理解你所问的内容的一种方式,但结果不太可能是构建和运行的代码。
另一种阅读方式是,您希望从develop
获取所有 - 冲突与否 - - 即放弃在E
和{F
中所做的任何更改{1}}因为develop
的变化非常严重,E
和F
不再值得麻烦。
在这种情况下,您可以选择一些选项,具体取决于您在最终历史记录中的内容。
我的建议是:
# make sure you're on master
git checkout master
# revert the commits that are going to be clobbered
git revert -n HEAD^ HEAD
git commit
# merge the branch
git merge develop
这会保留历史记录中的E
和F
,以及明确说明“我有意识地撤消这些更改”的提交。你最终得到了
G - H -- I -- J Develop
/ \
A - B - C - D - E - F - ~EF - M Master
由于你想要变基,你可能不喜欢那种结束状态。另一个选择是如上所述进行还原,然后将rebase发展为master;由于TREE
处的内容(~EF
)与D
处的树匹配,因此 应该没有冲突地工作,并且会给您
A - B - C - D - E - F - ~EF - G` - H` - I` - J` Develop , Master
假设develop
先前被推过,在这之后你必须“强制推”它(push -f
);这将为回购的所有其他用户创造一个“上游反叛”的局面;请参阅git rebase
文档以获取更多信息,包括他们恢复的步骤,并了解如果您不与受影响的每个人协调,那么采取错误的步骤进行恢复的人可以撤消您的内容已经完成了。
为了完整性,实际上最简单的方法(但不是我推荐的方法,特别是如果其他人共享回购)将仅reset
master
参考J
。
git checkout master
git reset --hard develop
这将重写master
分支的历史记录,因此要推送master
,您必须使用-f
选项(强制推送);这再次创造了实际上是“上游变革”的局面。这也意味着E
和F
完全从历史记录中清除(除非您在其上添加新标记或分支)。