跳至主要内容

在命令行中使用 Git rebase

这是一个关于如何在命令行中使用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 再次打开您的文本编辑器。它打开的文件看起来像这样

# This is a combination of two commits.
# The first commit's message is:

Patch A

# This is the 2nd commit message:

something to add to patch A

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
# modified:   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),因为它不需要任何交互。fixupc619268中的更改合并到其之前的提交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

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD^1 <file>..." to unstage)
#
# modified:   a
#

与之前一样,Git 显示提交消息供您编辑。您可以更改文本("i cant' typ goods"),保存文件并关闭编辑器。Git 将完成重新整理并返回到终端。

将重新整理的代码推送到 GitHub

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

# Don't override changes
$ git push origin main --force-with-lease

# Override changes
$ git push origin main --force

强制推送具有严重影响,因为它会更改分支的提交历史顺序。请谨慎使用,尤其是在多个用户访问您的存储库时。

进一步阅读