我的本地和远程git repos中有b_assetSel
和master
个分支。为了在向fun
提交一些新修补程序后保持清洁,我决定尝试master
命令:
rebase
Git给出了错误:更新被拒绝,因为您当前分支的提示落后于其远程对手,所以我做了:
git checkout fun
git rebase master
git push
这要求我合并拉,但似乎工作正常。尽管git的历史看起来似乎与看似重复的提交相混淆。我创建了一个很小的测试提交来掌握:
git pull
git push
现在我有一个令人困惑的git历史记录,似乎是三个分支和重复的提交:
-
编辑:
TL; DR回答:不要git checkout master
git commit -a
git push
已经rebase
编辑的内容。
答案 0 :(得分:2)
您的git rebase
制作副本。这实际上是git rebase
的工作方式:它会复制,因为它必须,因为新的提交与旧的提交不同。
在这种情况下,可能仅 的区别在于新副本(实际上是粉红色的副本显示为低位)指向提交abf0c11
作为起点,而旧的(黄色和更高的)指向提交4009ff9
作为起点。 1
合并很容易,因为重复项是重复的,但现在您已将这两个历史记录嵌入到合并结果中。这两个历史记录现在也被复制到您的远程存储库中。
如果你想摆脱其中一个链,你还必须摆脱合并(提交603c2f0
),然后强制远程更改 {{1 } branch-name指向两个剩余的提示提交之一(fun
或3316703
) - 无论您希望保留哪一个。然后,您还可以强制您的 git更改您的 141cef4
分支名称,以指向相同的提示提交。
此时,您和远程将就哪个提交fun
指向(这两个分支提示之一)达成一致。但是,如果任何人在其fun
指向合并期间从您的遥控器克隆或获取,他们将同时拥有和两个副本,并且您还必须他们来执行这些步骤。
做这一切并没有错,这只是一种痛苦。这就是为什么通常建议仅重新定义未发布的历史记录:拥有旧历史记录的每个人都必须获取新历史记录。由于未发表历史记录,您是唯一具有旧历史的人,因此没有其他人需要做额外的工作。
1 这掩盖了另一个巨大的差异,即 new 链中每个提交的源代码树都对任何文件之间的更改进行了更新。 fun
和4009ff9
。旧链中提交的源代码树没有。