跳至主要内容

关于 Git rebase

git rebase 命令允许您轻松更改一系列提交,修改存储库的历史记录。您可以重新排序、编辑或将提交压缩在一起。

通常,您会使用 git rebase

  • 编辑之前的提交消息
  • 将多个提交合并为一个
  • 删除或撤销不再需要的提交

警告:由于更改提交历史记录可能会让使用该存储库的其他人感到困难,因此在您已将提交推送到存储库后,变基提交被认为是不好的做法。要了解如何在 GitHub.com 上安全地变基,请参阅 "关于拉取请求合并"。

将提交变基到分支

要将另一个分支和当前分支状态之间的所有提交变基,您可以在 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 通过告诉你变基提交时可用的命令来提供一些帮助。

进一步阅读