使用 Git rebase
在本示例中,我们将介绍所有可用的 git rebase
命令,但 exec
除外。
我们通过在终端中输入 git rebase --interactive HEAD~7
来开始我们的 rebase。我们最喜欢的文本编辑器将显示以下行
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
。 - 使用
fixup
合并"A fix for Patch B"
提交 (c619268
) 到"Patch B"
提交 (6b2481b
),并忽略提交消息。 - 使用
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
更改为我们感兴趣的命令。
现在,保存并关闭编辑器;这将启动交互式 rebase。
Git 跳过第一个 rebase 命令 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"
)。如果你对这些提交消息感到满意,则可以保存文件并关闭编辑器。否则,你可以通过简单地更改文本来更改提交消息。
当编辑器关闭时,rebase 继续进行
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 7b36971
和 pick 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
# 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
强制推送具有严重影响,因为它会更改分支的提交历史顺序。谨慎使用它,尤其是当多个用户访问您的存储库时。