撤销最后一次 Git 提交的步骤

GitBeginner
立即练习

简介

本教程将指导你撤销上一次 Git 提交的过程。无论你是犯了错误,还是只是想撤销最近的更改,我们都将介绍撤销上一次提交并将存储库恢复到先前状态所需的步骤。

理解 Git 提交

Git 是一个分布式版本控制系统,它允许开发者跟踪代码库中的更改、与他人协作以及管理项目历史记录。Git 功能的核心是提交(commit),它代表了项目在特定时间点的状态快照。

每个 Git 提交包含以下关键组件:

提交哈希(Commit Hash)

提交的唯一标识符,通常是一个 40 字符的十六进制字符串。这个哈希用于引用提交并跟踪其历史记录。

作者(Author)和提交者(Committer)

分别是做出更改的人和提交更改的人。在某些情况下,比如有人提交拉取请求时,这两者可能不同。

提交消息(Commit Message)

对提交中所做更改的简要描述。这条消息有助于其他开发者理解更改的目的和背景。

时间戳(Timestamp)

提交的日期和时间。

差异(Diff)

提交中所做的更改集,包括对代码库的添加、修改和删除。

理解 Git 提交的结构和组件对于有效地管理和浏览项目历史记录,以及执行诸如撤销、挑选提交(cherry-picking)和变基(rebasing)等操作至关重要。

graph TD A[Git 仓库] --> B[提交 1] B --> C[提交 2] C --> D[提交 3] D --> E[提交 4]
提交哈希(Commit Hash) 作者(Author) 提交者(Committer) 时间戳(Timestamp) 消息(Message)
1234567890abcdef 约翰·多伊 简·多伊 2023-04-01 12:00:00 实现新功能
0987654321fedcba 简·多伊 约翰·多伊 2023-04-02 13:30:00 修复上一次提交中的错误
fedcba1234567890 约翰·多伊 简·多伊 2023-04-03 15:45:00 重构代码库

识别上一次提交

要撤销上一次 Git 提交,你首先需要识别本地仓库中最近的提交。有几种方法可以做到这一点:

使用 git log 命令

git log 命令会显示仓库的提交历史记录。最近的提交会列在输出的顶部。

[object Object]

在这个例子中,最后一次提交的哈希是 1234567890abcdef

使用 git reflog 命令

git reflog 命令会显示本地仓库中执行的所有操作的历史记录,包括提交、合并和重置。如果你在执行其他 Git 操作后仍需要识别最后一次提交,这会很有帮助。

$ git reflog
1234567 (HEAD -> main) HEAD@{0}: commit: Implement new feature
0987654 HEAD@{1}: commit: Fix bug in previous commit

最近的提交列在顶部,引用为 HEAD@{0}

使用 git show 命令

git show 命令会显示特定提交的详细信息,包括提交哈希、作者、日期以及所做的更改。你可以使用这个命令快速查看最后一次提交。

[object Object]

识别出最后一次提交后,你就可以继续进行撤销或回退更改的下一步操作。

撤销上一次提交

一旦你识别出了上一次提交,就可以使用 git revert 命令来撤销其更改。git revert 命令会创建一个新的提交,该提交会撤销指定提交所引入的更改。

使用 git revert

要撤销上一次提交,可以使用以下命令:

$ git revert HEAD

这将创建一个新的提交,该提交会撤销上一次提交中所做的更改。如果有任何冲突,你需要在撤销完成之前解决它们。

理解 git revert

git revert 命令的工作方式是创建一个与指定提交相反的新提交。这意味着,如果上一次提交添加了一个新文件,那么撤销提交将删除该文件。如果上一次提交修改了一个文件,那么撤销提交将把该文件恢复到其先前的状态。

graph TD A[提交 1] --> B[提交 2] B --> C[提交 3] C --> D[提交 4] D --> E[撤销提交]

在上面的图表中,“撤销提交”会撤销“提交 4”中所做的更改。

处理冲突

如果上一次提交对与较新提交相同的代码行进行了更改,那么在尝试撤销上一次提交时可能会遇到冲突。在这种情况下,你需要在撤销完成之前手动解决冲突。

运行 git revert 之后,Git 会暂停并要求你解决冲突。解决冲突后,可以通过运行 git revert --continue 来完成撤销操作。

通过了解如何撤销上一次提交,你可以轻松地撤销更改并维护干净的 Git 历史记录。

在本地撤销更改

除了撤销上一次提交外,你还可以在不创建新提交的情况下撤销本地工作目录中的更改。如果你进行了不想提交的更改,或者想要撤销特定文件或代码行,这会很有用。

使用 git restore

git restore 命令允许你丢弃工作目录中的更改。要丢弃工作目录中的所有更改,可以使用以下命令:

$ git restore.

这会将所有修改和删除的文件恢复到它们之前的状态。

你也可以选择性地恢复特定文件或目录:

$ git restore file1.txt file2.txt
$ git restore directory/

使用 git checkout

另一种撤销本地更改的方法是使用 git checkout 命令。这个命令允许你在代码库的不同分支或版本之间切换。

要丢弃工作目录中的所有更改并恢复到上一次提交的状态,可以使用以下命令:

$ git checkout.

这会丢弃所有修改和删除的文件,将它们恢复到之前的状态。

你也可以检出特定文件或目录:

$ git checkout file1.txt
$ git checkout directory/

git restoregit checkout 的比较

git restoregit checkout 都可用于撤销本地更改,但它们有一些区别:

  • git restore 是 Git 2.23 中引入的较新命令,它设计得更专注于恢复文件。
  • git checkout 是一个更通用的命令,也可用于在分支和版本之间切换。
  • 一般认为 git restore 是撤销本地更改的首选命令,因为它更明确且更易于理解。

通过了解如何在本地撤销更改,你可以轻松地在代码库中进行试验并丢弃任何不需要的修改。

推送已撤销的提交

在本地撤销上一次提交之后,下一步是将已撤销的提交推送到远程仓库。这可确保共享代码库中反映出这些更改,并且其他协作者也知晓此次撤销操作。

推送已撤销的提交

要将已撤销的提交推送到远程仓库,可以使用以下命令:

$ git push

这会将你本地的所有提交(包括已撤销的提交)推送到远程仓库。

处理强制推送

如果你已经推送了你想要撤销的提交,并且其他协作者已经拉取了这些更改,那么你可能需要使用强制推送来更新远程仓库。但是,使用强制推送时要谨慎,因为这可能会覆盖其他人的工作。

$ git push --force

在进行强制推送之前,最好与你的团队进行沟通,确保没有其他人做出会因强制推送而丢失的更改。

验证已撤销的提交

推送已撤销的提交之后,可以通过检查远程仓库来验证更改是否已成功推送。你可以使用以下命令:

$ git fetch
$ git log --oneline origin/main

这将从远程仓库获取最新更改并显示提交历史记录,包括已撤销的提交。

通过推送已撤销的提交,你确保了共享代码库中反映出这些更改,并且其他协作者也知晓此次撤销操作。

撤销操作期间处理冲突

当你撤销一个提交时,如果被撤销提交中的更改与代码库中更新的更改存在重叠,Git 可能会遇到冲突。在这种情况下,你需要在完成撤销之前手动解决冲突。

识别冲突

如果在撤销过程中出现冲突,Git 会暂停撤销进程并显示类似以下的消息:

Auto-merging file1.txt
CONFLICT (content): Merge conflict in file1.txt
error: could not revert 1234567... Implement new feature
Resolve the conflicts and then run "git revert --continue".

这表明 file1.txt 文件中存在冲突,你需要在完成撤销之前解决这些冲突。

解决冲突

要解决冲突,你可以在文本编辑器中打开冲突文件。你会看到诸如 <<<<<<< HEAD=======>>>>>>> 1234567... Implement new feature 这样的标记,它们指示了冲突部分。

手动编辑文件以保留你想要保留的更改,并删除冲突标记。例如,file1.txt 中的冲突部分可能如下所示:

<<<<<<< HEAD
new feature implementation
=======
bug fix
>>>>>>> 1234567... Implement new feature

然后你可以编辑文件以保留所需的更改:

bug fix

完成撤销

解决冲突后,你可以暂存已解决的文件并完成撤销过程:

$ git add file1.txt
$ git revert --continue

这将完成撤销并创建一个新的提交,该提交会撤销原始提交中的更改,同时保留导致冲突的更新的更改。

使用 git revert -n 处理冲突

或者,你可以使用 git revert -n(无提交)选项来撤销更改而不创建新的提交。这使你能够解决冲突,然后创建一个包含撤销和冲突解决的单个提交。

$ git revert -n 1234567
## 解决冲突
$ git add.
$ git commit -m "Revert commit 1234567 and resolve conflicts"

通过了解如何在撤销过程中处理冲突,你可以确保 Git 提交的撤销过程顺利且成功。

恢复已撤销的提交

在某些情况下,你可能想要恢复在前面步骤中被撤销的更改。如果你意识到被撤销的更改实际上是必要的,或者由于某种原因需要重新应用这些被撤销的更改,这会很有用。

使用 git revert --no-commit

要恢复已撤销的提交,可以使用 git revert --no-commit 命令。这将撤销撤销操作,有效地恢复原始更改而不创建新的提交。

$ git revert --no-commit HEAD

此命令将撤销上一个撤销提交所做的更改,但不会创建新的提交。然后你可以查看这些更改并决定如何继续。

解决冲突

如果被撤销的更改与代码库中更新的更改冲突,那么在尝试恢复已撤销的提交时可能会遇到冲突。在这种情况下,你需要在完成恢复之前手动解决冲突。

$ git revert --no-commit HEAD
## 解决冲突
$ git add.
$ git revert --continue

解决冲突后,可以运行 git revert --continue 来完成恢复过程。

创建新提交

恢复被撤销的更改后,可以创建一个新提交来保存这些更改并将它们推送到远程仓库。

$ git commit -m "Restore reverted changes"
$ git push

通过了解如何恢复已撤销的提交,你可以在必要时轻松撤销撤销操作并重新应用原始更改。

总结

通过遵循本教程中概述的步骤,你将能够成功撤销你的上一次 Git 提交,确保你的仓库恢复到之前的状态。这些知识将帮助你掌控版本控制系统,并轻松从任何不需要的更改中恢复。