在rebase和pull / push之后我的git repo发生了什么?

时间:2016-01-29 00:51:45

标签: git merge rebase

我的本​​地和远程git repos中有b_assetSelmaster个分支。为了在向fun提交一些新修补程序后保持清洁,我决定尝试master命令:

rebase

Git给出了错误:更新被拒绝,因为您当前分支的提示落后于其远程对手,所以我做了:

git checkout fun
git rebase master
git push

这要求我合并拉,但似乎工作正常。尽管git的历史看起来似乎与看似重复的提交相混淆。我创建了一个很小的测试提交来掌握:

git pull
git push

现在我有一个令人困惑的git历史记录,似乎是三个分支和重复的提交:

Confusing git history

  1. 创建重复提交的错误是什么?
  2. 如何清理回购以删除重复项并返回仅两个分支?
  3. 将来如何保持历史简单?
  4. -

    编辑:

    TL; DR回答:不要git checkout master git commit -a git push 已经rebase编辑的内容。

1 个答案:

答案 0 :(得分:2)

您的git rebase制作副本。这实际上是git rebase的工作方式:它会复制,因为它必须,因为新的提交与旧的提交不同。

在这种情况下,可能仅 的区别在于新副本(实际上是粉红色的副本显示为低位)指向提交abf0c11作为起点,而旧的(黄色和更高的)指向提交4009ff9作为起点。 1

合并很容易,因为重复项是重复的,但现在您已将这两个历史记录嵌入到合并结果中。这两个历史记录现在也被复制到您的远程存储库中。

如果你想摆脱其中一个链,你还必须摆脱合并(提交603c2f0),然后强制远程更改 {{1 } branch-name指向两个剩余的提示提交之一(fun3316703) - 无论您希望保留哪一个。然后,您还可以强制您的 git更改您的 141cef4分支名称,以指向相同的提示提交。

此时,您和远程将就哪个提交fun指向(这两个分支提示之一)达成一致。但是,如果任何人在其fun指向合并期间从您的遥控器克隆或获取,他们将同时拥有两个副本,并且您还必须他们来执行这些步骤。

做这一切并没有错,这只是一种痛苦。这就是为什么通常建议仅重新定义未发布的历史记录:拥有旧历史记录的每个人都必须获取新历史记录。由于未发表历史记录,您是唯一具有旧历史的人,因此没有其他人需要做额外的工作。

1 这掩盖了另一个巨大的差异,即 new 链中每个提交的源代码树都对任何文件之间的更改进行了更新。 fun4009ff9。旧链中提交的源代码树没有。