在rebase之后,Git分支出现了分歧

Mar*_*ace 89 git

我已经在本地重新安装了一个已被推送的分支机构.

Git建议我的分支和远程分歧,并且:

"并分别有109和73个不同的提交"

推动我的分支会解决这个问题 - 也就是说,这是在一次变革后的预期吗?

Jas*_*run 123

当你重新分支一个分支时,你必须重新提交任何提交的提交,该提交位于你正在重新定位的分支中的提交之上.这是因为提交的一个属性是其父(或父).重新绑定时,您将更改分支上最旧的本地提交的父级 - 从而更改所有本地提交的提交哈希值,因为此更改会在传递过程中通过提交进行更新.

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

TL; DR - 如果您没有合作,请使用push -f推送分支.如果是,请将分支重置为先前的状态,然后在源分支中合并.

  • “既然你已经推送了分支,你应该在源分支中合并” - 为什么? (3认同)
  • @HamiltonVerissimo Jason 的第一句话:“当你变基分支时,你必须重写任何高于你要变基的分支中的提交的提交。” 尽管“上述”提交中捕获的更改具有相同的逻辑内容,但它们被应用于不同的基础,因此是具有不同哈希值的不同提交。如果其他开发人员在预先重新设置基础的分支上工作,那么执行 git push -f 将会极大地破坏他们的工作流程。因此,由于该分支已被推送到公共源,他应该合并。 (3认同)
  • 如果你不确定是否其他人已经推出了什么,你也可以使用push -force-with-lease. (3认同)

mim*_*lea 39

你所有的提交都改变了ID,所以转移并不是真正的分歧.

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

git push -f origin experiment
Run Code Online (Sandbox Code Playgroud)

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

说明:

看看在这个图像中C3如何在rebase之后不被置为C3,而是作为C3'.这是因为它不完全是C3,但它具有所有代码更改.

变基

在另一张图片中,您可以看到当涉及遥控器时看到什么样的底板,以及为什么会有转移.

分歧和git推

在任何情况下,在你进行强制推送之后,它会告诉你它执行了(强制更新),那时你应该没问题.

检查顶部的链接,然后搜索"git push --force".您将看到更详细的解释.

  • 对。我想这解决了问题。但是,当您与团队一起工作时,强制推送可能无法覆盖他人最近推送的任何最新工作。我对吗? (3认同)

zer*_*cog 7

通过执行以下操作,我成功地实现了 rebase diverge 的推送:

git checkout mybranch
git pull
git push origin mybranch
Run Code Online (Sandbox Code Playgroud)

拉动解决了分歧。

拉动之前

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

拉动输出

通过递归进行合并。mypath/myfile.py | 12 +++++++++++- 1 个文件已更改,11 个插入(+),1 个删除(-)

拉动后

您的分支比“origin/mybranch”领先 3 个提交。

推后

mybranch 比分支早 3 个,仍然有一个开放的拉取请求合并消息添加到提交历史记录中 将远程的 mybranch 分支合并到 mybranch

我假设这可能是强制推动的作用,但我尚未验证。

正如其他人所说,如果您已经有开放的拉取请求,请避免重新设置基准。我提供这个例子是为了对我有用。


小智 6

通过将目标分支重新定位到当前本地分支,切换到目标分支,然后将本地分支重新定位到目标,可以在不强制推送的情况下修复此问题。这不会出现分歧,因为可能丢失的提交已被添加并且不再需要创建。更容易解释的示例:

  1. 主要分支是开发
  2. 您签出一个新的分支功能/doing_stuff
  3. 团队成员推动新的开发承诺

如果您还没有更新您的开发分支,那么“git checkoutdevelopment”&&“git rebase feature/doing_stuff”将正常工作,因为自结帐以来没有添加任何提交。但是,如果您已经检查了开发并拉下了新的提交,那么如果您由于看到新的提交而尝试重新设置基准,您将看到这种分歧。无需强制推动的简单修复(在团队环境中通常不是一个好主意)是:

  1. git checkout功能/doing_stuff
  2. git rebase开发
  3. git checkout开发
  4. git rebase功能/doing_stuff

步骤 2 中的变基将缺少的提交引入到 feature/doing_stuff 中,因此当步骤 4 出现时,它是最新的,不需要为更改创建新的提交。

这是一个我知道有效的解决方案,因为我刚刚遇到了这个问题,并执行了上述步骤,成功地推动了开发,而无需强制。我在一个由 50 多名开发人员组成的团队中工作,因此禁止强制推送除我自己的测试分支之外的任何内容,因此我必须找到解决方案。