我们经常发布文档更新,此页面的翻译可能仍在进行中。有关最新信息,请访问英文文档。如果此页面上的翻译有问题,请告诉我们

此版本的 GitHub Enterprise 将停止服务 此版本的 GitHub Enterprise 已停止服务 2020-01-22. 即使针对重大安全问题,也不会发布补丁。 要获得更好的性能、改进的安全性和新功能,请升级到 GitHub Enterprise 的最新版本。 如需升级方面的帮助,请联系 GitHub Enterprise 支持

在命令行中使用 Git rebase

以下是在命令行中使用 git rebase 的简短教程。

本文内容

在本例中,我们将涵盖所有可用的 git rebase 命令,exec 除外。

我们将通过在终端上输入 git rebase --interactive HEAD~7 开始变基。 首选的文本编辑器将显示以下行:

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

在本例中,我们将:

  • 使用 squash 将第五个提交 (fa39187) 压缩到 "Patch A" 提交 (1fc6c95) 中。
  • 将最后一个提交 (7b36971) 向上移动到 "Patch B" 提交 (6b2481b) 之前,并将其保留为 pick
  • "A fix for Patch B" 提交 (c619268) 合并到 "Patch B" 提交 (6b2481b) 中,并使用 fixup 忽略提交消息。
  • 使用 edit 将第三个提交 (dd1475d) 拆分成两个较小的提交。
  • 使用 reword 修复拼写错误的提交 (4ca2acc) 的提交消息。

唷! 这听起来像是有好多工作,但一步一步来,我们可以轻松地进行这些更改。

首先,我们需要修改文件中的命令,如下所示:

pick 1fc6c95 Patch A
squash fa39187 something to add to patch A
pick 7b36971 something to move before patch B
pick 6b2481b Patch B
fixup c619268 A fix for Patch B
edit dd1475d something I want to split
reword 4ca2acc i cant' typ goods

我们将每行的命令从 pick 更改为我们感兴趣的命令。

现在,保存并关闭编辑器,这将开始交互式变基。

Git 跳过第一条变基命令 pick 1fc6c95,因为该命令无需任何操作。 它转到下一条命令 squash fa39187。 由于此操作需要您的输入,因此 Git 再次打开您的文本编辑器。 其打开的文件类似如下:

# 这是两个提交的组合。
# 第一个提交的消息是:

Patch A

# 这是第二个提交消息:

something to add to patch A

# 请输入您的更改的提交消息。 开头
# 为 '#' 的行将被忽略,并且空消息会中止提交。
# 当前不在任何分支中。
# 要进行提交的更改:
#   (使用 "git reset HEAD <file>..." 取消暂存)
#
# 已修改:a
#

此文件是用 Git 的方式表明“嗨,这就是我要使用这条 squash 完成的操作”。它列出了第一个提交的消息 ("Patch A") 和第二个提交的消息 ("something to add to patch A")。 如果对这些提交消息感到满意,您可以保存该文件,然后关闭编辑器。 否则,您可选择更改提交消息,只需更改文本即可。

编辑器关闭后,变基继续:

pick 1fc6c95 Patch A
squash fa39187 something to add to patch A
pick 7b36971 something to move before patch B
pick 6b2481b Patch B
fixup c619268 A fix for Patch B
edit dd1475d something I want to split
reword 4ca2acc i cant' typ goods

Git 会处理两条 pick 命令(针对 pick 7b36971pick 6b2481b)。 它会处理 fixup 命令 (fixup c619268),因为该命令不需要任何交互。 fixup 会将来自 c619268 的更改合并到其之前的提交 6b2481b 中。 这些更改都有相同的提交消息:"Patch B"

Git 开始 edit dd1475d 操作,停止,然后将以下消息打印到终端:

You can amend the commit now, with

        git commit --amend

Once you are satisfied with your changes, run

        git rebase --continue

此时,您可以编辑项目中的任何文件以进行任何额外的更改。 对于您进行的每个更改,您都需要通过输入 git commit --amend 命令执行新提交。 完成所有更改后,您可以运行 git rebase --continue

Git 随后开始执行 reword 4ca2acc 命令。 它会再次打开您的文本编辑器,并显示以下信息:

i cant' typ goods

# 请输入您的更改的提交消息。 开头
# 为 '#' 的行将被忽略,并且空消息会中止提交。
# 当前不在任何分支中。
# 要进行提交的更改:
#   (使用 "git reset HEAD^1 <file>..." 取消暂存)
#
# 已修改:a
#

和以前一样,Git 显示提交消息供您进行编辑。 您可以更改文本 ("i cant' typ goods"),保存该文件,然后关闭编辑器。 Git 将完成变基并将您返回终端。

将变基的代码推送到 GitHub

由于您已更改 Git 历史记录,因此通常的 git push origin 不起作用。 您需要通过“强制推送”最新更改来修改命令:

$ git push origin master --force

强制推送有严重的影响,尤其是您的仓库被多人访问时。 至少,您的拉取请求中的提交顺序可能不正确。 有关更多信息,请查看“为什么我的提交顺序不正确?

延伸阅读

问问别人

找不到要找的内容?

联系我们