> 技术文档 > 【Git “revert“ 命令详解】_git revert

【Git “revert“ 命令详解】_git revert


本章目录:

    • 1. 命令简介
      • 常见用途:
    • 2. 命令的基本语法和用法
      • 基本语法:
      • 使用场景与实际例子
        • 示例 1:撤销最后一次提交
        • 示例 2:撤销指定提交
        • 示例 3:撤销多个提交
    • 3. 命令的常用选项及参数
      • 常用选项:
    • 4. 命令的执行示例
      • 示例 1:撤销最后一次提交
      • 示例 2:撤销指定的提交
      • 示例 3:撤销多个提交
      • 示例 4:撤销提交但不提交更改
    • 5. 命令的进阶用法
      • 用法 1:撤销合并提交
      • 用法 2:撤销多个不连续的提交
    • 6. 命令的常见问题与解答
      • 问题 1:撤销某次提交后,如何将其更改应用回去?
      • 问题 2:如何撤销一个合并提交?
      • 问题 3:撤销提交后,如何合并多个反向提交?
    • 7. 总结与建议
      • 最佳实践建议:

1. 命令简介

git revert 是 Git 中用于撤销一个或多个历史提交的命令。与 git reset 不同,git revert 不会直接修改 Git 历史,而是通过创建一个新的提交来“反向”应用某个提交的内容,撤销该提交的所有修改。因此,git revert 是一个安全的操作,尤其适合在多人协作的项目中使用,因为它不会改变历史提交记录,而是以新的提交形式记录撤销的操作。

常见用途:

  • 撤销某次提交:可以撤销某次提交的修改内容,而不破坏历史。
  • 在公开分支上撤销提交:因为 git revert 不会改变提交历史,所以适合在公开分支(如 mastermain)上撤销不需要的提交,而不影响其他开发者的工作。
  • 创建反向提交:通过 git revert,可以创建一个新的提交,该提交是撤销某个错误提交的反向修改。

2. 命令的基本语法和用法

基本语法:

git revert [<options>] <commit>
  • :指定要撤销的提交,可以是提交的哈希值、引用(如分支名)或 HEAD 等。
  • :可选的命令参数,进一步控制命令的行为。

使用场景与实际例子

示例 1:撤销最后一次提交

如果你想撤销最后一次提交,可以使用以下命令:

git revert HEAD

此命令会生成一个新的提交,撤销上一次提交的所有修改,并把它们作为一个新的提交记录在历史中。

示例 2:撤销指定提交

假设你要撤销的提交的哈希是 abc1234,可以使用:

git revert abc1234

这将生成一个新的提交,撤销 abc1234 提交所做的更改。

示例 3:撤销多个提交

如果你需要撤销多个提交,可以提供多个提交的哈希值或通过 .. 指定一个范围。例如,撤销从 abc1234def5678 之间的所有提交:

git revert abc1234..def5678

这会为每个撤销的提交生成一个新的提交,反向应用这些提交的更改。


3. 命令的常用选项及参数

git revert 提供了多个选项来帮助你更精确地控制撤销行为。

常用选项:

  • --no-commit:执行撤销操作,但不创建提交,而是将更改保留在工作区和暂存区。此选项允许你在查看更改后决定是否提交。

    示例:

    git revert --no-commit abc1234

    该命令会撤销 abc1234 提交的更改,但不会立即创建提交,你可以检查修改并决定是否提交。

  • --edit:默认情况下,git revert 会自动生成提交信息。使用 --edit 选项可以手动编辑提交信息,通常用于当你需要详细描述撤销操作时。

    示例:

    git revert --edit abc1234

    该命令会在撤销 abc1234 提交后,打开编辑器让你修改提交信息。

  • --no-edit:如果你希望跳过编辑提交信息的步骤,可以使用该选项。

    示例:

    git revert --no-edit abc1234

    该命令会直接创建撤销 abc1234 提交的提交,而不打开编辑器。

  • -n--no-commit:与 --no-commit 相同,将更改保留在工作区和暂存区,而不自动提交。

    示例:

    git revert -n abc1234
  • --strategy=:指定合并策略。默认情况下,git revert 会使用 recursive 合并策略,但你可以根据需要指定其他策略。

    示例:

    git revert --strategy=ours abc1234

4. 命令的执行示例

示例 1:撤销最后一次提交

git revert HEAD

输出:

[master abc1234] Revert \"fix bug in login\" 1 file changed, 2 deletions(-)

解释

  • 该命令撤销了上一次提交(HEAD),并创建了一个新的提交,提交信息为 “Revert ‘fix bug in login’”。
  • 修改内容已反向应用,提交记录被保留。

示例 2:撤销指定的提交

git revert abc1234

输出:

[master def5678] Revert \"add new feature\" 2 files changed, 5 insertions(+), 3 deletions(-)

解释

  • 该命令撤销了 abc1234 提交的更改,并生成了一个新的提交(def5678),描述为“Revert ‘add new feature’”。
  • 与提交相关的文件变动已被反向应用。

示例 3:撤销多个提交

git revert abc1234..def5678

输出:

[master ghijklm] Revert \"add new feature\" 2 files changed, 5 insertions(+), 3 deletions(-)[master mnopqr] Revert \"fix bug in login\" 1 file changed, 2 deletions(-)

解释

  • 该命令撤销了 abc1234def5678 范围内的所有提交。
  • 对每个提交创建了一个新的撤销提交,并自动应用了反向修改。

示例 4:撤销提交但不提交更改

git revert --no-commit abc1234

输出:

(no output)

解释

  • 撤销了 abc1234 提交的更改,但没有自动提交。
  • 修改已经应用到工作区和暂存区,可以检查这些更改并手动提交。

5. 命令的进阶用法

用法 1:撤销合并提交

撤销合并提交时,git revert 会尝试生成一个合并提交的反向操作。可以使用 -m 选项来指定主父提交。例如,要撤销合并提交 abc1234,并指定第一个父提交为主父:

git revert -m 1 abc1234

这将撤销合并提交的变更并将其反向应用。

用法 2:撤销多个不连续的提交

如果你需要撤销多个不连续的提交,可以在命令中指定多个提交哈希:

git revert abc1234 def5678 ghi9012

这将分别撤销 abc1234def5678ghi9012 提交,并为每个提交生成一个新的反向提交。


6. 命令的常见问题与解答

问题 1:撤销某次提交后,如何将其更改应用回去?

解答:如果你撤销了某次提交,并希望恢复该提交的更改,可以再次执行 git revert 该提交的哈希,或者通过 git cherry-pick 将其更改重新应用。

问题 2:如何撤销一个合并提交?

解答:撤销合并提交时,可以使用 -m 选项来指定父提交。通常,-m 1 表示保留第一个父提交,-m 2 表示保留第二个父提交。

问题 3:撤销提交后,如何合并多个反向提交?

解答:你可以使用 git rebase -igit merge 命令将多个反向提交合并成一个提交,清理历史记录。


7. 总结与建议

git revert 是 Git 中一个非常安全且强大的命令,适用于撤销某个错误提交,同时保留提交历史。它特别适合在多人协作的项目中使用,因为它不会破坏已有的提交历史。

最佳实践建议:

  • 在公开的分支(如 mastermain)上撤销提交时,建议使用 git revert,避免直接使用 git reset 来修改历史。
  • 使用 --no-commit--edit 选项可以帮助你更灵活地控制撤销的行为,尤其在处理多个提交时非常有用。
  • 若需要撤销合并提交,确保使用 -m 选项指定正确的