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

时间:2017-10-10 22:22:55

标签: git github commit rebase squash

我有一个本地提交的原始主人的头,并想要结合最后两个提交。所以假设历史如下:

* 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

这里有什么问题?这是由于原始主人的头部原因吗?在这种情况下如何组合它们?或者也许有一些历史显示问题?

1 个答案:

答案 0 :(得分:2)

就像你说的那样:

  

......我有两个独立的提交 - 新的压缩的一个和老主人的一个

这是你应该期待的,因为git rebase通过复制提交工作(可能会进行一些修改,比如挤压),然后让你的Git指向你自己的分支名称到新的副本。

但是origin/master不是你自己的,重新定位的分支。它是您的远程跟踪分支,它会记住其他 Git master其他 Git的内容。因此,您的origin/master会继续记住其他Git所拥有的内容,这是您在进行略微修改后的副本之前的原始提交。

其他Git存储库本身 - 您调用的origin - 具有另一个提交。由于origin拥有它,因此从origin复制的任何人都拥有它。您必须说服origin以及从origin复制的任何人切换到您闪亮的新提交内容。

如果您可以控制origin,则可以使用“强制推送”来覆盖其master中现有的任何内容,并使用闪亮的新提交。 (origin存储库仍将具有旧提交,但可能非常短暂,直到它执行“垃圾收集”传递。)然后,您还必须说服 {{1}的所有用户也可以像你一样切换,就像你强迫origin一样。完全如何你可以做什么取决于你。

请注意,如果其他人也推送到origin,您的强制推送可能会删除他们添加的提交,这取决于origin。你应该在强迫推进之前与其他人协调。 (如果没有这样的其他人,这使得协调变得更加容易。)