对有许多提交的特性分支进行回溯可能会很累人。 你可能会有几个提交与你的主分支发生冲突。 在回溯这些分支之前,你可能想把你的提交压在一起,然后回溯这一个提交,这样你就可以一次处理所有的冲突。 下面是如何做的。
假设你一直在特性分支show_birthday 上工作,你想把它压碎并重新归档到main 上。
首先,切换到特性分支。
$ git switch show_birthday
其次,使用 rebase 将该分支压制在其原始基础提交之上。
$ git rebase --keep-base -i main
这两个标志是做什么的?
--keep-base 标志告诉 Git 在创建该分支时将其重新写入 的基础提交。这与使用 中的main main最新提交的默认行为不同。
-i的简称 --interactive这将打开你的文本编辑器,你可以用它来选择 rebase 的操作。
第三,修改rebase文件,把所有提交都压入第一个 "fixup "的提交中。 当文件打开时,你会看到这样的内容。
pick e81a5f1 start on showing birthday
pick 72c9e48 database migration
pick 65cb164 template change
# Rebase fc63cec..65cb164 onto fc63cec (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amendingx
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup [-C | -c] <commit> = like "squash" but keep only the previous
# commit's log message, unless -C is used, in which case
# keep only this commit's message; -c is same as -C but
# opens the editor
...
(为简洁起见,进一步的评论被删除)。
第一行显示了当前分支上的提交,以及要对它们进行的 rebase 操作。 剩下的几行是注释,包括可能的操作的小抄。
要告诉 rebase 把所有的提交都压缩到第一行,把所有的提交行都改成以 "f "开头,除了第一行。
pick e81a5f1 start on showing birthday
f 72c9e48 database migration
f 65cb164 template change
# Rebase fc63cec..65cb164 onto fc63cec (3 commands)
#
# Commands:
...
(你也可以写 "fixup "的全称,但这不值得打字。)
注意,还有一个 "s"/"squash "命令,它允许你合并编辑被压扁的提交信息。 一般来说,我更喜欢用 "f"/"fixup",然后在必要时用 "r"/"reword "修正第一个提交信息。
第四,保存并关闭该文件,Git 将执行重写,把所有的提交压成一个。 完成后,你可以查看 git 日志,看看你的单个提交。
第五,现在可以把单个提交重新归入主干分支了。 你可能想先拉出主干分支的最新版本。
$ git switch main
$ git pull
$ git switch show_birthday
然后,再将特性分支重定向。
$ git rebase -i main
其实没有必要在这里使用 -i但我鼓励你养成使用交互式模式的习惯,以仔细检查你正在重命名的内容。
当Git应用重命名时,你可能需要处理冲突,并完成提交。 git rebase --continue不过这比压制前要容易,因为现在所有的分支变化都在一个提交中。
然后,嗒嗒嗒,你就完成了,你已经压制并重设了你的分支了