通常,您会使用 git rebase
来
- 编辑以前的提交消息
- 将多个提交合并为一个
- 删除或回退不再需要的提交
警告
由于更改提交历史记录可能会使使用该存储库的所有其他用户感到困难,因此在已将提交推送到存储库后重新设置提交基础的做法被认为是不好的做法。要了解如何安全地重新设置基础,请参阅“关于拉取请求合并”。
针对分支重新设置提交基础
要重新设置另一个分支和当前分支状态之间的所有提交的基础,您可以在 shell 中输入以下命令(Windows 的命令提示符或 Mac 和 Linux 的终端)
git rebase --interactive OTHER-BRANCH-NAME
针对某个时间点重新设置提交基础
要重新设置当前分支中最后几个提交的基础,您可以在 shell 中输入以下命令
git rebase --interactive HEAD~7
重新设置基础时可用的命令
在进行变基时,可以使用六个命令。
pick
pick
仅仅表示包含该提交。重新排列pick
命令的顺序会改变变基过程中提交的顺序。如果你选择不包含某个提交,则应删除整行。reword
reword
命令类似于pick
,但使用它之后,变基过程会暂停,并给你机会修改提交信息。提交所做的任何更改都不会受到影响。edit
- 如果你选择
edit
一个提交,你将有机会修改该提交,这意味着你可以完全添加或更改该提交。你也可以在继续变基之前进行更多提交。这允许你将一个大的提交拆分成更小的提交,或者删除提交中错误的更改。 squash
- 此命令允许你将两个或多个提交合并成一个提交。一个提交会被压缩到它上面的提交中。Git 会让你有机会编写一个新的提交信息来描述这两个更改。
fixup
- 这类似于
squash
,但要合并的提交其信息会被丢弃。该提交只是合并到它上面的提交中,并且使用前面提交的信息来描述这两个更改。 exec
- 这允许你对提交运行任意 shell 命令。
使用 git rebase
的示例
无论你使用哪个命令,Git 都会启动 你默认的文本编辑器 并打开一个文件,其中详细列出了你选择的范围内的提交。该文件看起来像这样
pick 1fc6c95 Patch A
pick 6b2481b Patch B
pick dd1475d something I want to split
pick c619268 A fix for Patch B
pick fa39187 something to add to patch A
pick 4ca2acc i cant' typ goods
pick 7b36971 something to move before patch B
# Rebase 41a72e6..7b36971 onto 41a72e6
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
从上到下分解这些信息,我们可以看到
- 列出了七个提交,这表示在我们的起点和我们当前的分支状态之间有七个更改。
- 你选择变基的提交按从最旧的更改(顶部)到最新的更改(底部)的顺序排序。
- 每一行都列出一个命令(默认情况下为
pick
)、提交 SHA 和提交信息。整个git rebase
过程都围绕着你对这三列的操作。你所做的更改会被变基到你的仓库中。 - 在提交之后,Git 会告诉你我们正在处理的提交范围(
41a72e6..7b36971
)。 - 最后,Git 通过告诉你变基提交时可用的命令来提供一些帮助。
进一步阅读
- "在命令行中使用 Git 变基"
- 来自 Pro Git 书籍的“Git 分支”章节
- 来自 Pro Git 书籍的“交互式变基”章节
- "使用变基压缩提交"
- "在 GitHub Desktop 中同步你的分支" 在 GitHub Desktop 文档中