rebase 后 Git 分支发散

我在本地重新 rebase 了一个已经 push 了的分支。

Git 通知我,我的分支和远程分支已经分道扬镳:

“分别有109次和73次不同的提交”

推送我的分支能够解决这个问题吗? 也就是说,在 rebase 之后这个问题就会出现吗?

99203 次浏览

当您重新建立一个分支的基础时,您必须重写任何提交的提交,这些提交在您重新建立基础的分支的提交之上。这是因为提交的属性之一是它的父级(或父级)。当您重建基础时,您正在更改分支上最早的本地提交的父级——从而更改所有本地提交的提交散列,因为这种更改会通过提交传递地冒泡。

既然您已经推送了分支,那么您就应该合并到源分支中,而不是根据它重新定位。可以“强制推送”您的新分支(使用 -f标志) ,但是普通的推送不起作用,因为分支历史记录的完整性将受到干扰。如果你在这个分支上与其他人合作,强制推进是一个坏主意,因为当其他合作者的历史突然不匹配时,它会导致他们变得非常困惑。

DR-如果您没有进行协作,那么使用 push-f 推送分支。如果是,请将分支重置为以前的状态,然后在源分支中合并。

所有的提交都改变了 id,所以转移不是 真的分歧。

要解决您的问题,您必须覆盖您的远程分支:

git push -f origin experiment

Http://git-scm.com/book/ch3-6.html

说明:

看看在这个图像 C3是如何不作为 C3后,基地,而是作为 C3’。这是因为它不完全是 C3,但它有它的所有代码更改。

Rebase

在这个另一个图像中,您可以看到当涉及到远程时,基地是什么样子的,以及为什么会有转移。

diverge and git push

在任何情况下,在您进行强制推送之后,它会告诉您它进行了(强制更新) ,您应该在这一点上没有问题。

查看顶部的链接,搜索“ git push-force”,你会看到更详细的解释。

通过以下操作,我成功地推出了再基础分歧:

git checkout mybranch
git pull
git push origin mybranch

拉力解决了分歧。

在拉之前

Your branch and 'origin/mybranch' have diverged,
and have 2 and 1 different commit(s) each, respectively.

输出

使用递归. mypath/myfile.py 进行合并 + + + + + + + + +-1个文件更改,11个插入(+) ,1个删除(-)

拉之后

你的分支比“原点/我的分支”提交多3次。

推后

我的分支在分支前面3个仍然有一个打开的拉请求 添加到提交历史的 Merge 消息

我假设这可能就是力推的作用,我还没有证实。

正如其他人所说,如果您已经有一个打开的拉请求,请避免使用 rebase。我提供的这个例子对我很有用。

通过将目标分支重新定基为当前的本地分支,切换到目标分支,然后将本地分支重新定基为目标分支,可以在无需强制推送的情况下解决这个问题。这不会发生分歧,因为可能丢失的提交已经添加,不再需要创建。简单解释的例子:

  1. 主要分支是 开发
  2. 你签出一个新的分支 Feature/doing _ stuff 特性/做事情
  3. 团队成员向 开发推送新的提交

如果你还没有更新你的开发分支,那么一个“ git checkout development”& & “ git rebase Feature/doing _ stuff”将会正常工作,因为自从你的结帐后没有添加提交。但是,如果您已经签出了 development 并下拉了新的提交,那么如果您尝试重建基础,因为看到了新的提交,那么您将看到这种分歧。一个不需要强行推动的简单解决方法(在团队环境中通常不是一个好主意)是:

  1. Git 检验 Feature/doing _ stuff 特性/做事情
  2. Git 重定基 开发
  3. Git 检验 开发
  4. Git 重定基 Feature/doing _ stuff 特性/做事情

步骤2中的 rebase 将缺少的提交带到 Feature/doing _ stuff 中,因此当步骤4出现时,它是最新的,不需要为更改创建新的提交。

我知道这是一个有效的解决方案,因为我刚刚遇到了这个问题,并且完成了上面的步骤,成功地在不强制的情况下推动了开发。我在一个有50多名开发人员的团队中工作,所以除了我自己的测试分支之外,禁止强行推送任何东西,所以我必须找到一个解决方案。