在变基和拉/推之后我的 git 回购发生了什么?
What happened to my git repo after rebase and pull / push?
我在本地和远程 git 存储库中有 master
和 fun
分支。为了在对 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 历史,似乎是三个分支和重复提交:
- 我做错了什么导致重复提交?
- 如何清理存储库以删除重复项并返回到只有两个分支?
- 以后如何让历史看起来简单?
--
编辑:
TL;DR 回答:不要rebase
已经push
ed 的内容。
您的 git rebase
制作了副本。这实际上是 git rebase
的工作方式:它制作副本,因为它必须这样做,因为新提交与旧提交不同。
在这种情况下,唯一的区别可能是新副本(实际上是下方显示的粉红色副本)指向提交 abf0c11
作为它们的开始-point,而旧的(黄色和更高)指向提交 4009ff9
作为他们的起点。1
合并很容易,因为重复项是重复项,但现在您已将两个历史记录都嵌入到合并结果中。这两个历史现在也被复制到您的远程存储库。
如果你想摆脱这些链中的一个,你也必须摆脱合并(提交603c2f0
),然后强制远程改变它 fun
branch-name 指向两个剩余的提示提交之一(3316703
或 141cef4
)——无论你想保留哪个。然后你也可以强制 your git 改变 your fun
branch-name 指向相同的提示提交。
此时,您和远程将就 fun
指向哪个提交(这两个分支提示之一)达成一致。但是,如果有人在 fun
指向合并期间从您的遥控器克隆或获取,他们 将同时拥有两个副本 和 合并,您还必须让 他们 执行这些步骤。
做这一切没有错,只是很痛苦。这就是为什么通常建议只对 unpublished 历史进行变基:每个拥有旧历史的人都必须选择新历史。对于未发表的历史,您是唯一拥有旧历史的人,因此没有其他人需要做额外的工作。
1这掩盖了另一个很大的区别,即 new 链中每个提交的源代码树都有任何更新4009ff9
和 abf0c11
之间更改的任何文件。旧链中提交的源代码树没有。
我在本地和远程 git 存储库中有 master
和 fun
分支。为了在对 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 历史,似乎是三个分支和重复提交:
- 我做错了什么导致重复提交?
- 如何清理存储库以删除重复项并返回到只有两个分支?
- 以后如何让历史看起来简单?
--
编辑:
TL;DR 回答:不要rebase
已经push
ed 的内容。
您的 git rebase
制作了副本。这实际上是 git rebase
的工作方式:它制作副本,因为它必须这样做,因为新提交与旧提交不同。
在这种情况下,唯一的区别可能是新副本(实际上是下方显示的粉红色副本)指向提交 abf0c11
作为它们的开始-point,而旧的(黄色和更高)指向提交 4009ff9
作为他们的起点。1
合并很容易,因为重复项是重复项,但现在您已将两个历史记录都嵌入到合并结果中。这两个历史现在也被复制到您的远程存储库。
如果你想摆脱这些链中的一个,你也必须摆脱合并(提交603c2f0
),然后强制远程改变它 fun
branch-name 指向两个剩余的提示提交之一(3316703
或 141cef4
)——无论你想保留哪个。然后你也可以强制 your git 改变 your fun
branch-name 指向相同的提示提交。
此时,您和远程将就 fun
指向哪个提交(这两个分支提示之一)达成一致。但是,如果有人在 fun
指向合并期间从您的遥控器克隆或获取,他们 将同时拥有两个副本 和 合并,您还必须让 他们 执行这些步骤。
做这一切没有错,只是很痛苦。这就是为什么通常建议只对 unpublished 历史进行变基:每个拥有旧历史的人都必须选择新历史。对于未发表的历史,您是唯一拥有旧历史的人,因此没有其他人需要做额外的工作。
1这掩盖了另一个很大的区别,即 new 链中每个提交的源代码树都有任何更新4009ff9
和 abf0c11
之间更改的任何文件。旧链中提交的源代码树没有。