Skip to main content

Rebase

压缩多个 commit 为 1 个 commit

# 压缩多个commit 为1个 commit
git rebase -i HEAD~4

合并两个之间有间隔的 commit

是的,您可以使用 git rebase -i HEAD~6 这个命令来启动交互式变基,假设您想要编辑的提交范围是最近的六个提交。HEAD~6 表示从当前 HEAD 往回数的第六个提交,这将包括最近的六个提交在内的范围。

在您的例子中,如果提交 F 是最新的提交,那么 HEAD~6 将会选中提交 A 之前的一个提交作为变基的起点,从而包含了从提交 A 到提交 F 的所有提交。

使用这个命令后,您会进入一个文本编辑器,其中列出了从旧到新的提交列表,就像这样:

pick a1b2c3 Commit A
pick b3c4d5 Commit B
pick c5d6e7 Commit C
pick c5d6e1 Commit D
pick c5d6e2 Commit E
pick c5d6e0 Commit F

在这个列表中,您可以通过剪切和粘贴来重新排列这些行,以及改变 picksquashfixup 来合并提交。在您的情况下,您想要将提交 E 合并到提交 C,所以您会将它们排列在一起,并将提交 E 的 pick 改为 squashfixup

pick a1b2c3 Commit A
pick b3c4d5 Commit B
pick c5d6e7 Commit C
squash c5d6e2 Commit E
pick c5d6e1 Commit D
pick c5d6e0 Commit F

然后保存并关闭编辑器,Git 会开始执行变基,并在需要时提示您解决冲突或编辑提交信息。

注意:顺序是反的,我想将 C 合并到 E

如果您想要将提交 C (c5d6e7) 合并到提交 E (c5d6e2) 并且保持其他提交的顺序不变,您可以使用 git rebase -i HEAD~6(或者适当的数字,以确保包含了所有相关提交)开始交互式变基。在编辑器中,您需要将提交 C 的行移动到提交 E 的下面,并将 pick 改为 squashfixup(如果您不想保留原始提交信息)。

编辑器中的内容将类似如下:

pick a1b2c3 Commit A
pick b3c4d5 Commit B
pick c5d6e7 Commit C
pick c5d6e1 Commit D
pick c5d6e2 Commit E
pick c5d6e0 Commit F

您需要调整为:

pick a1b2c3 Commit A
pick b3c4d5 Commit B
pick c5d6e1 Commit D
pick c5d6e2 Commit E
squash c5d6e7 Commit C
pick c5d6e0 Commit F

在这个例子中,提交 C (c5d6e7) 被标记为 squash,意味着它将被合并到紧挨着它上面的提交 E (c5d6e2) 中。保存并关闭编辑器后,Git 会开始执行变基。如果使用 squash,它将提示您编辑新的提交信息,合并提交 C 和 E 的信息。如果使用 fixup,提交 C 的信息将被丢弃,只保留提交 E 的信息。

完成后,如果您之前已经将这些提交推送到了远程仓库,您需要使用强制推送来更新远程仓库:

git push origin <branch_name> --force

请记得,在执行强制推送之前,确保没有其他协作者正在该分支上工作,或者您已经与他们协调好了这个操作,因为这会重写远程仓库的历史。

修改前

alt text

修改后

alt text

想删除某个 commit

想修改某个 commit 的 message 不改内容

修改中

alt text

修改后

alt text

想修改某个 commit 的内容