在变基和拉/推之后我的 git 回购发生了什么?

What happened to my git repo after rebase and pull / push?

我在本地和远程 git 存储库中有 masterfun 分支。为了在对 master 提交一些新修复后保持整洁,我决定尝试 rebase 命令:

git checkout fun
git rebase master
git push

Git 给出了错误:更新被拒绝,因为你当前分支的尖端落后于它的远程分支,所以我做到了:

git pull
git push

这需要我在拉动时合并,但似乎工作正常。虽然 git 的历史开始看起来与似乎重复的提交混淆。我创建了一个小的测试提交给 master:

git checkout master
git commit -a
git push

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

  1. 我做错了什么导致重复提交?
  2. 如何清理存储库以删除重复项并返回到只有两个分支?
  3. 以后如何让历史看起来简单?

--

编辑:

TL;DR 回答:不要rebase 已经pushed 的内容。

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

在这种情况下,唯一的区别可能是新副本(实际上是下方显示的粉红色副本)指向提交 abf0c11 作为它们的开始-point,而旧的(黄色和更高)指向提交 4009ff9 作为他们的起点。1

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

如果你想摆脱这些链中的一个,你也必须摆脱合并(提交603c2f0),然后强制远程改变 fun branch-name 指向两个剩余的提示提交之一(3316703141cef4)——无论你想保留哪个。然后你也可以强制 your git 改变 your fun branch-name 指向相同的提示提交。

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

做这一切没有错,只是很痛苦。这就是为什么通常建议只对 unpublished 历史进行变基:每个拥有旧历史的人都必须选择新历史。对于未发表的历史,您是唯一拥有旧历史的人,因此没有其他人需要做额外的工作。


1这掩盖了另一个很大的区别,即 new 链中每个提交的源代码树都有任何更新4009ff9abf0c11 之间更改的任何文件。旧链中提交的源代码树没有。