Git Rebase 合并自动获取

Git Rebase merge auto take

我有

              G---H---I---J    Develop
             /
A---B---C---D---E---F    Master

我想和master一起rebase Develop,所以:

                      G---H---I---J    Develop
                     /
A---B---C---D---E---F    Master

所以如果我这样做 git checkout develop & git rebase master

它将进行变基,但是,在每次提交时发现合并冲突时它将停止。

我很高兴从开发中获取所有内容并用它覆盖。 develop 发生了巨大的变化,但每次提交都会构建并通过所有测试,所以我可以假设如果我只是覆盖 master 中的所有内容应该没问题。

所以我怎么说 git rebase master --choose develop side

那就是 git rebase -X theirs master

我认为声明中有些歧义

I'm happy just to take everything from develop and overwrite with that

(或者至少人们准备的方式)。

你是说 "where there's a conflict I'm happy taking what's in develop" 吗?这就是junkangli(git rebase -X theirs master)的回答。虽然这是理解您所问内容的一种方式,但结果不太可能是构建和运行的代码。

另一种阅读方式是您想要从 develop 获取 一切 - 冲突与否 - 即丢弃在 [=] 中所做的任何更改17=] 和 F 因为 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,以及明确说明 "I'm consciously undoing these changes" 的提交。你最终会得到

              G - H -- I -- J    Develop
             /               \
A - B - C - D - E - F - ~EF - M    Master

既然你想变基,你可能不喜欢那个最终状态。另一种选择是像上面那样做 revert,然后 rebase develop 到 master;由于 ~EF 处的内容 (TREE) 与 D 处的树匹配,因此 应该 可以正常工作并给你

A - B - C - D - E - F - ~EF - G` - H` - I` - J`    Develop , Master

假设之前已推送 develop,执行此操作后您将必须 "force push" 它 (push -f);这将为回购的所有其他用户创造 "upstream rebase" 情况;请参阅 git rebase 文档了解更多信息,包括他们恢复的步骤,并了解如果您不与受影响的每个人协调,有人采取 错误的 恢复步骤可能撤销你所做的。

为了完整起见,实际最简单的方法(但不是我推荐的方法,特别是如果其他人共享回购协议)只是 reset masterJ 的引用。

git checkout master
git reset --hard develop

这将重写 master 分支的历史,因此要推送 master 您必须使用 -f 选项(强制推送);这又一次造成了 "upstream rebase" 的情况。这也意味着 EF 完全从历史记录中删除(除非你在它们上面放置一个新的标签或分支)。