Git rebase - 我压扁没有删除提交

Git rebase - i squashing didn't remove commit

我在 origin master 的 head 之后有一个本地提交,想合并最后两个提交。那么假设历史是这样的:

* e9199ba - (HEAD -> master)
|           test
* c4e3b53 - (origin/master, origin/HEAD)
|           Saturn ring angle change in X and Y

并且想要提交一次而不是 e9199bac4e3b53。 我做了 git git rebase -i HEAD~2 并压缩了第二次提交:

pick c4e3b53 Saturn ring angle change in X and Y
squash e9199ba test

因此我有两个独立的提交 - 新的压扁的和旧的主的:

* 216b314 - (HEAD -> master)
|           Suqashed commits
| * c4e3b53 - (origin/master, origin/HEAD)
|/            Saturn ring angle change in X and Y

这是怎么回事?难道是源主脑袋的原因?在这种情况下如何组合它们?或者可能有一些历史显示问题?

正如你所说:

... I've got two independent commits - the new squashed one and old master's one

这是您应该期待的,因为 git rebase 通过 复制 提交(可能在此过程中进行一些修改,例如压缩),然后让您的 Git 将自己的分支名称指向新副本。

但是 origin/master 不是你自己的,rebased,分支。这是您的 remote-tracking 分支,它会记住某些 other Git 在 other[=46 中的内容=] Git 的 master。因此,您的 origin/master 会继续记住其他 Git 拥有的内容,即在您制作略微修改的副本之前的原始提交。

另一个 Git 存储库本身——你称之为 origin 的存储库——有另一个提交。因为 origin 有它,任何从 origin 复制的人也有它。您必须说服 origin 以及从 origin 复制的任何人切换到您闪亮的新提交。

如果您可以控制 origin,您可能会使用 "force push" 用闪亮的新提交覆盖它现在在 master 中的任何内容。 (origin 存储库仍然会有旧的提交,尽管可能非常短暂,直到它通过 "garbage collection"。)然后你还必须说服 all 用户origin 也要切换,就像您所做的那样,就像您强迫 origin 那样做一样。具体如何您可以并且愿意这样做取决于您。

请注意,如果其他人也正在推送 origin,您的强制推送可能会擦除 他们 添加的提交,这取决于 c4e3b53。在强制推动之前,您应该与这些其他人协调。 (如果没有这样的其他人,协调起来会容易很多。)