首页 > 解决方案 > 如何在不使用交互式 git rebase 的情况下将两个 git 提交合并为一个提交?

问题描述

我正在开发一个也被其他团队使用的功能分支,他们有很多开发人员,所以从他们的末端发生了很多提交。我最后一次提交是在大约 10 天前,我计划今天再次提交,但我想确保从我的最后一次提交。

我知道我可以使用“git rebase -i HEAD~n”来实现这一点,但我不知道用什么数字代替 n,因为在这 10 天内有超过 20 次来自其他团队的提交。这个命令很好如果您有连续提交,但它不适合我的场景。

虽然我已经完成了 git 提交的哈希码,但除了 git 交互式 rebase 之外,还有什么方法可以将我的 git 哈希码之一用作“pick”,另一个用作“squash”。它将为我省去 20 多个 git 提交的麻烦。

标签: gitgithubrebase

解决方案


无需使用即可达到您想要的结果git rebase -i。无论您是否使用该选项,都值得研究该方法,以便您真正了解它的作用。git rebase-i

完全达到您想要的结果可能是不明智的,尽管只有您和您的同事才能真正确定这一点。

手动执行此操作的一种方法是git checkout通过哈希 ID 进行特定提交,并创建一个指向此提交的新分支名称。您在此处选择的提交应该是有问题的两个提交之前的那个。

然后,您将要git cherry-pick -n压缩的两个提交合并为一个新提交,并用于git commit提交结果。

现在您面临另外使用git cherry-pick将每个后续提交复制到新分支的问题。这并不是那么困难——事实上,只要给定正确的哈希 ID,它就应该自动进行。您只需要找到正确的哈希 ID。

完成后,您需要说服您的同事放弃现有的功能分支并使用您重新构建的新功能分支。这个新分支具有原始提交的副本,但它们是新的和改进的,因为它们是基于您对原始两个提交的压缩替换而构建的。

如果这听起来有点令人费解,那么它和你会做的一样——git rebase -i除了当你git rebase -i. ,这有点令人困惑!feature/foofeature/foo


要做到这一点git rebase -i而不必计算提交(如HEAD~20),请使用:

git log --decorate --oneline --graph

好好看看你打算变基的提交。您将获得带有缩写哈希 ID 及其提交主题的提交的单行列表,以及提交图的 ASCII 图形。确保它在您将复制的提交中没有分支和合并模式(或者如果有,则丢弃所有合并也没关系)——在这种情况下,这意味着它只是*之前的一系列标记您打算复制和替换的提交。然后,而不是count,使用:

git rebase -i <hash>

其中是您不会复制或修改hash的第一次提交。

请注意,像这样的变基的最终结果是一系列新的提交,即使您使用的分支名称来识别它。这就是为什么这通常是一个坏主意:您将丢弃和替换的不仅仅是您的提交,还有其他人正在使用并且现在仍在进行的其他提交。所以他们也必须切换到你对他们的提交所做的这些新副本。


推荐阅读