65.9K
CodeProject 正在变化。 阅读更多。
Home

高级 GIT 教程 - 交互式 Rebase

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2020 年 3 月 20 日

CPOL

4分钟阅读

viewsIcon

7820

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 个提交的顺序

  1. 键入 git rebase --interactive HEAD~10

  2. 现在你在默认编辑器中看到提交列表。按照你想要的顺序更改它们。

  3. 保存此文件,解决所有冲突

很有可能你需要解决一些变基冲突,在这种情况下,修改它们,使用 git add 添加更改的文件,并在最后键入 git rebase --continue。由于变基是基于提交的,所以你可能需要多次修复同一个文件中的类似冲突。

移除不必要的提交

有时你可能想移除一个提交及其内容,请执行以下操作:

  1. 键入 git rebase --interactive HEAD~10(移除最后 10 个中的一些提交)。

  2. 将要移除的提交行中的“pick”更改为“drop”。

  3. 保存文件并解决冲突。

这样,你就删除了不必要的提交及其所有内容。

一个提交代替多个提交

有时,你创建了太多简单的提交,想通过减少提交数量来使历史记录更清晰。你可以简单地将多个提交的内容合并到一个提交中。

  1. 键入 git rebase --interactive HEAD~10(合并最后 10 个中的一些提交)。

  2. 将要合并到前一个提交中的提交行中的“pick”更改为“fixup”。

  3. 保存文件。

更改旧提交的提交消息

如果你想更改旧提交的提交消息怎么办?

  1. 键入 git rebase --interactive HEAD~10(更改最后 10 个中的一些提交的消息)。

  2. 将要重命名的提交行中的“pick”更改为“reword”。

  3. 保存文件。

  4. 当前的提交消息会出现在你的编辑器中,修改它并保存。

编辑旧提交

如何更改旧提交的内容?

  1. 键入 git rebase --interactive HEAD~10(更改最后 10 个中的一些提交)。

  2. 将要编辑的提交行中的“pick”更改为“edit”。

  3. 保存文件。

  4. 进行你想要的更改,使用 git add 添加它们,并使用 git commit --amend 提交它们。

  5. 键入 git rebase --continue

  6. 解决所有冲突。

拆分提交

如何拆分一个已存在的提交?

  1. 键入 git rebase --interactive HEAD~10(拆分最后 10 个中的一个提交)。

  2. 将要拆分的提交行中的“pick”更改为“edit”。

  3. 保存文件。

  4. 键入 git reset

  5. 添加第一个提交的更改并提交。

  6. 添加第二个提交的更改并提交。

  7. git rebase --continue

摘要

在我看来,Git 的交互式变基是一个非常强大的选项,可以使许多场景更容易、更快捷。但要有效地使用它,你必须真正了解它的工作原理。

历史

  • 2020年3月20日:初始版本
© . All rights reserved.