高级 GIT 教程 - 交互式 Rebase





5.00/5 (1投票)
GIT 中的交互式 Rebase 工具
交互式变基的概念
Git 的 rebase 命令可以修改当前 HEAD
和一个指定提交之间的提交。你可以通过提交的哈希值或相对于当前 HEAD
的索引来定义提交,通过指定 HEAD~n
,其中 n
是索引。所以 HEAD~10
表示当前 HEAD
前的第 10 个提交。
要修改当前 HEAD
前的最后 3 个提交,请键入 git rebase --interactive HEAD~3
或 git rebase --interactive HEAD
后第三个提交的哈希值。请注意,HEAD
后的第三个提交在 git log 中实际上是第四个提交,因为第一个是 HEAD
本身。除了 --interactive,你还可以键入 -i
。这个命令会打开你的默认编辑器,并列出你最近的三个提交。格式类似
对每个提交来说,格式是 pick hash_id commit_message
。
你可以做的第一件事就是改变这个文件中的提交顺序。这很简单,只需改变行的顺序即可。
除此之外,你还可以对每个提交使用以下选项:
-
Pick (
p
): 你想保持该提交不变,这是默认操作。 -
Reword (
r
): 你想更改该提交的提交消息。 -
Edit (
e
): 你想更改该提交的内容。 -
Squash (
s
): 它将该提交与前一个提交合并,保留两个提交的消息。 -
Fixup (
f
): 与 squash 相同,但它只保留前一个提交的消息。 -
Exec (
x
): 执行自定义 shell 命令。 -
Break (
b
): 它会在该提交处停止变基,你之后可以用 git rebase --continue 继续。 -
Drop (
d
): 它会丢弃该提交及其内容。这是摆脱提交的最佳方式。 -
Label (
l
): 它给定的提交附加一个标签,该提交是实际的HEAD
:请注意!这里的参数不是提交 ID。 -
Reset (
t
): 它重置当前HEAD
提交的标签。它也不接受提交 ID。 -
Merge (
m
): 它创建一个合并提交。
你只需在提交 ID 前写下正确的关键字或其缩写(括号内)。
通过交互式变基解决问题
这里有一系列可以通过交互式变基解决的实际场景。
更改提交顺序
如前所述,你可以更改提交的顺序。如果你想改变最后 10 个提交的顺序
-
键入
git rebase --interactive HEAD~10
-
现在你在默认编辑器中看到提交列表。按照你想要的顺序更改它们。
-
保存此文件,解决所有冲突
很有可能你需要解决一些变基冲突,在这种情况下,修改它们,使用 git add 添加更改的文件,并在最后键入 git rebase --continue
。由于变基是基于提交的,所以你可能需要多次修复同一个文件中的类似冲突。
移除不必要的提交
有时你可能想移除一个提交及其内容,请执行以下操作:
-
键入
git rebase --interactive HEAD~10
(移除最后 10 个中的一些提交)。 -
将要移除的提交行中的“
pick
”更改为“drop
”。 -
保存文件并解决冲突。
这样,你就删除了不必要的提交及其所有内容。
一个提交代替多个提交
有时,你创建了太多简单的提交,想通过减少提交数量来使历史记录更清晰。你可以简单地将多个提交的内容合并到一个提交中。
-
键入
git rebase --interactive HEAD~10
(合并最后 10 个中的一些提交)。 -
将要合并到前一个提交中的提交行中的“
pick
”更改为“fixup
”。 -
保存文件。
更改旧提交的提交消息
如果你想更改旧提交的提交消息怎么办?
-
键入
git rebase --interactive HEAD~10
(更改最后 10 个中的一些提交的消息)。 -
将要重命名的提交行中的“
pick
”更改为“reword
”。 -
保存文件。
-
当前的提交消息会出现在你的编辑器中,修改它并保存。
编辑旧提交
如何更改旧提交的内容?
-
键入
git rebase --interactive HEAD~10
(更改最后 10 个中的一些提交)。 -
将要编辑的提交行中的“
pick
”更改为“edit
”。 -
保存文件。
-
进行你想要的更改,使用
git add
添加它们,并使用git commit --amend
提交它们。 -
键入
git rebase --continue
-
解决所有冲突。
拆分提交
如何拆分一个已存在的提交?
-
键入
git rebase --interactive HEAD~10
(拆分最后 10 个中的一个提交)。 -
将要拆分的提交行中的“
pick
”更改为“edit
”。 -
保存文件。
-
键入
git reset
。 -
添加第一个提交的更改并提交。
-
添加第二个提交的更改并提交。
-
git rebase --continue
摘要
在我看来,Git 的交互式变基是一个非常强大的选项,可以使许多场景更容易、更快捷。但要有效地使用它,你必须真正了解它的工作原理。
历史
- 2020年3月20日:初始版本