如何撤销已提交的 Git 更改

GitGitBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本教程将指导你撤销在 Git 仓库中已提交的更改。无论你是需要还原特定的提交、将仓库重置到先前的状态,还是恢复已删除的提交,我们都能为你提供帮助。在本指南结束时,你将掌握有效 “撤销提交” 并维护干净、有条理的 Git 历史记录的技能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/DataManagementGroup(["Data Management"]) git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git/BasicOperationsGroup -.-> git/commit("Create Commit") git/DataManagementGroup -.-> git/reset("Undo Changes") git/DataManagementGroup -.-> git/restore("Revert Files") git/BranchManagementGroup -.-> git/reflog("Log Ref Changes") git/BranchManagementGroup -.-> git/rebase("Reapply Commits") subgraph Lab Skills git/commit -.-> lab-392730{{"如何撤销已提交的 Git 更改"}} git/reset -.-> lab-392730{{"如何撤销已提交的 Git 更改"}} git/restore -.-> lab-392730{{"如何撤销已提交的 Git 更改"}} git/reflog -.-> lab-392730{{"如何撤销已提交的 Git 更改"}} git/rebase -.-> lab-392730{{"如何撤销已提交的 Git 更改"}} end

理解 Git 提交与变更

Git 是一个强大的版本控制系统,它允许开发者随时间追踪代码库的变更。Git 的核心是提交和变更的概念。理解这些基本概念对于有效使用 Git 以及撤销已提交的变更至关重要。

什么是 Git 提交?

Git 提交是项目文件在特定时间点的快照。当你对代码库进行更改并想要保存这些更改时,你创建一个新的提交。每个提交都有一个唯一的标识符(哈希值),并且包含自上一次提交以来你所做的更改。

使用 Git 追踪变更

Git 通过将项目的当前状态与上一次提交进行比较来追踪文件的变更。当你进行更改时,Git 会识别出修改、添加和删除的文件,并且你可以选择在下一次提交中包含哪些更改。

graph LR A[初始提交] --> B[第二次提交] B --> C[第三次提交] C --> D[第四次提交]

提交变更

要在 Git 中提交变更,你通常按以下步骤操作:

  1. 使用 git add 添加你想要包含在提交中的文件。
  2. 使用 git commit 创建一个带有描述性消息的新提交。
## 将更改添加到暂存区
git add file1.txt file2.py

## 使用消息提交更改
git commit -m "实现新功能"

通过理解 Git 提交和变更的概念,你将更有能力撤销已提交的变更,这是本教程其余部分的重点。

识别已提交的更改

在撤销已提交的更改之前,你需要能够识别已提交的更改。Git 提供了几个命令来帮助你可视化和理解提交历史记录。

查看提交历史记录

git log 命令允许你查看仓库的提交历史记录。默认情况下,它会显示每个提交的提交哈希、作者、日期和提交消息。

git log

你还可以自定义 git log 的输出以显示更多详细信息,例如更改的文件以及提交之间的差异。

git log --stat
git log -p

比较提交

git diff 命令允许你比较两个提交之间的更改。这对于识别特定提交中引入的具体更改很有用。

## 将当前工作目录与最后一次提交进行比较
git diff HEAD

## 比较两个特定的提交
git diff commit1_hash commit2_hash

可视化提交图

为了更直观地呈现提交历史记录,你可以使用 git log --graph 命令。这将显示提交历史记录的 ASCII 艺术图,展示分支结构和合并点。

git log --graph --oneline --decorate --all

通过了解如何识别已提交的更改,你将在必要时更好地准备撤销这些更改。

撤销已提交的更改

一旦你确定了想要撤销的已提交更改,Git 提供了几种方法来实现。具体使用哪种方法取决于具体情况和你的目标。

修改上一次提交

如果你刚刚提交了更改,并且想要进行一些小的调整,可以使用 git commit --amend 命令。这将允许你修改最近的提交,包括提交消息和提交中包含的更改。

## 对文件进行一些更改
git add file1.txt file2.py

## 修改上一次提交
git commit --amend -m "改进功能实现"

还原提交

如果你想撤销特定提交引入的更改,可以使用 git revert 命令。这将创建一个新的提交,撤销指定提交中的更改,同时保留提交历史记录。

## 还原上一次提交的更改
git revert HEAD

重置到上一次提交

如果你想完全丢弃一个或多个提交引入的更改,可以使用 git reset 命令。这将把分支指针移动到指定的提交,有效地丢弃该点之后的所有提交。

## 将分支重置到倒数第三个提交
git reset HEAD~3

使用 git reset 时要小心,因为它可能会永久丢弃已提交的更改。通常建议使用 git revert 代替,除非你绝对确定要丢弃提交历史记录。

通过了解这些撤销已提交更改的不同方法,你将能够有效地管理你的 Git 仓库,并纠正任何错误或不需要的更改。

还原提交

git revert 命令是撤销已提交更改的强大工具。与丢弃提交历史记录的 git reset 不同,git revert 会创建一个新提交,用于撤销特定提交引入的更改。

如何还原提交

要还原提交,你可以使用以下命令:

git revert <提交哈希>

<提交哈希> 替换为你想要还原的提交的唯一标识符。Git 将创建一个新提交,撤销指定提交中的更改。

例如,假设你有以下提交历史记录:

graph LR A[初始提交] --> B[第二次提交] B --> C[第三次提交] C --> D[第四次提交]

如果你想还原第三次提交(提交 C)中引入的更改,你可以运行:

git revert C

这将创建一个新提交,撤销提交 C 中的更改,同时保留提交历史记录。

处理冲突

如果你试图还原的更改与仓库的当前状态冲突,Git 将要求你手动解决冲突。你可以通过编辑冲突文件、选择所需的更改,然后完成还原操作来实现。

## 还原与当前状态冲突的提交
git revert C
## 解决文件中的冲突
git add resolved_file1.txt resolved_file2.py
git revert --continue

通过使用 git revert,你可以安全地撤销已提交的更改,而不会丢失提交历史记录。这使得随着时间的推移更容易跟踪和管理代码库的演变。

重置到上一次提交

git reset 命令是另一种撤销已提交更改的方法,但它的工作方式与 git revert 不同。git reset 不是创建一个新提交来撤销更改,而是将分支指针移动到指定的提交,从而有效地丢弃该点之后的所有提交。

理解git reset

git reset 命令有三种主要模式:

  1. 软重置:将分支指针移动到指定的提交,但保持工作目录和暂存区不变。
  2. 混合重置(默认):移动分支指针并将暂存区重置为与指定提交匹配,但保持工作目录不变。
  3. 硬重置:移动分支指针,重置暂存区,并丢弃工作目录中的所有更改。

重置到上一次提交

要将仓库重置到上一次提交,可以使用以下命令:

git reset [--soft|--mixed|--hard] <提交哈希>

<提交哈希> 替换为你想要重置到的提交的唯一标识符。

例如,假设你有以下提交历史记录:

graph LR A[初始提交] --> B[第二次提交] B --> C[第三次提交] C --> D[第四次提交]

如果你想丢弃第四次提交(提交 D)中引入的更改,可以运行:

git reset --hard D~1

这将把分支指针移回到第三次提交(提交 C),丢弃第四次提交的所有更改。

使用git reset时需谨慎

使用 git reset --hard 时要小心,因为它会永久丢弃工作目录中的所有更改。通常建议使用 git revert 代替,除非你绝对确定要丢弃提交历史记录。

通过了解如何将仓库重置到上一次提交,你可以有效地管理你的Git历史记录并撤销不需要的更改。

恢复已删除的提交

在某些情况下,你可能会意外地从Git仓库中删除一个提交。幸运的是,只要你还没有执行垃圾回收操作,Git提供了一种方法来恢复这些已删除的提交。

查看引用日志

Git引用日志是本地仓库中对分支引用(如 HEAD 和分支名称)所做的所有更改的记录。通过检查引用日志,你通常可以找到并恢复已删除的提交。

要查看引用日志,请使用以下命令:

git reflog

这将显示在你的仓库上执行的所有最近操作的列表,包括提交哈希和相应的分支引用。

恢复已删除的提交

一旦你在引用日志中确定了已删除的提交,就可以使用 git reset 命令来恢复它。确切的命令将取决于你想要使用的模式(软重置、混合重置或硬重置)。

例如,假设你想要恢复哈希为 abcd1234 的提交。你可以使用以下命令将你的分支重置到该提交:

git reset --hard abcd1234

这将把分支指针移回到已删除的提交,有效地恢复该提交及其引入的所有更改。

关于引用日志的注意事项

引用日志是本地记录,所以需要注意的是,引用日志信息不会与其他仓库共享。如果你已经将提交推送到远程仓库,引用日志可能不包含你恢复已删除提交所需的信息。

此外,引用日志会在有限的时间内保留(通常为90天),之后会被Git自动修剪。所以如果你需要恢复已删除的提交,要尽快行动。

通过了解如何使用Git引用日志,你可以有效地恢复已删除的提交并维护Git仓库的完整性。

总结

在本全面教程中,你已经学会了如何在Git仓库中撤销已提交的更改。从还原特定提交到将仓库重置到先前状态,甚至恢复已删除的提交,你现在拥有了有效管理Git历史记录并在必要时“取消提交”的工具。通过掌握这些技术,你可以确保你的Git仓库保持有序并符合项目需求。