Git Rebase合并自动拍摄

时间:2018-03-27 14:41:46

标签: git git-rebase

我有

              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

2 个答案:

答案 0 :(得分:3)

那将是git rebase -X theirs master

答案 1 :(得分:0)

我认为声明中存在一些歧义

  

我很高兴从开发和覆盖中获取所有内容

(至少人们如何准备它)。

你的意思是“哪里有冲突我很乐意接受develop”中的内容?这就是junkangli的答案(git rebase -X theirs master)。虽然这是理解你所问的内容的一种方式,但结果不太可能是构建和运行的代码。

另一种阅读方式是,您希望从develop获取所有 - 冲突与否 - - 即放弃在E和{F中所做的任何更改{1}}因为develop的变化非常严重,EF不再值得麻烦。

在这种情况下,您可以选择一些选项,具体取决于您在最终历史记录中的内容。

我的建议是:

    # 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

这会保留历史记录中的EF,以及明确说明“我有意识地撤消这些更改”的提交。你最终得到了

              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选项(强制推送);这再次创造了实际上是“上游变革”的局面。这也意味着EF完全从历史记录中清除(除非您在其上添加新标记或分支)。