如何在不丢失更改的情况下撤销 Git 提交

GitGitBeginner
立即练习

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

简介

Git 是一个强大的版本控制系统,它允许开发者有效地管理他们的代码库。然而,有时候你可能需要撤销一个提交,同时又不丢失你所做的更改。本教程将指导你完成在保留宝贵工作的同时撤销 Git 提交的过程。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git(("Git")) -.-> git/DataManagementGroup(["Data Management"]) git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) 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-415168{{"如何在不丢失更改的情况下撤销 Git 提交"}} git/reset -.-> lab-415168{{"如何在不丢失更改的情况下撤销 Git 提交"}} git/restore -.-> lab-415168{{"如何在不丢失更改的情况下撤销 Git 提交"}} git/reflog -.-> lab-415168{{"如何在不丢失更改的情况下撤销 Git 提交"}} git/rebase -.-> lab-415168{{"如何在不丢失更改的情况下撤销 Git 提交"}} end

理解 Git 提交

Git 是一个分布式版本控制系统,它允许开发者随时间追踪其代码库中的更改。Git 的核心是提交,它代表项目在特定时间点的快照。

什么是 Git 提交?

Git 提交是对仓库中一个或多个文件所做更改的集合。当你对代码进行更改并想要保存这些更改时,你就创建一个新的提交。每个提交都有一个唯一标识符,称为提交哈希,它允许你引用和追踪该特定提交中所做的更改。

Git 提交的构成

一个 Git 提交通常由以下元素组成:

  1. 提交消息:对提交中所做更改的简短描述,通常用祈使语气书写(例如,“添加新功能”,“修复登录过程中的漏洞”)。
  2. 作者:做出更改并创建提交的人。
  3. 时间戳:创建提交的日期和时间。
  4. 提交哈希:提交的唯一标识符,通常是一长串字母和数字。
  5. 父提交:此提交所基于的前一个提交。
  6. 更改:此提交中添加、修改或删除的特定文件。

查看提交历史记录

你可以使用 git log 命令查看 Git 仓库的提交历史记录。这将以逆时间顺序显示所有提交的列表,最新的提交在顶部。

git log

这将显示仓库中每个提交的提交哈希、作者、日期和提交消息。

在 Git 中撤销提交

在 Git 中撤销提交是指撤销特定提交所引入的更改的过程。当你想要撤销已经推送到远程仓库或与其他团队成员共享的提交时,这会很有用。

撤销提交

要撤销一个提交,你可以使用 git revert 命令,后跟你想要撤销的提交哈希或分支名称。

git revert <提交哈希>

这将创建一个新的提交,该提交会撤销指定提交中所做的更改。新提交将有一个不同的提交哈希,但它会作为父提交链接到原始提交。

撤销多个提交

你也可以通过提供一系列提交哈希或分支名称来一次性撤销多个提交。

git revert <起始提交哈希>..<结束提交哈希>

这将创建一个新的提交,该提交会撤销指定起始提交和结束提交之间所有提交中所做的更改。

撤销合并提交

如果你需要撤销一个合并提交,可以使用 --mainline 选项来指定要恢复到哪个父提交。

git revert -m 1 <合并提交哈希>

-m 1 选项告诉 Git 从合并提交的第一个父提交(通常是你合并到的分支)恢复更改。

查看已撤销的提交

撤销提交后,你可以查看提交历史记录以查看撤销更改的新提交。

git log

这将显示已撤销的提交以及撤销更改的新提交。

撤销提交时保留更改

当你撤销一个提交时,Git 会撤销该提交所引入的更改。然而,如果你自被撤销的提交之后又对相同的文件做了其他更改,你可能想要保留这些更改。Git 提供了几个选项来帮助你做到这一点。

使用 git revert --no-commit

--no-commit 选项允许你撤销更改,而无需立即创建一个新的提交。这给了你审查更改并决定如何继续的机会。

git revert --no-commit <提交哈希>

运行此命令后,你可以审查更改,并决定是创建一个新的提交还是放弃已撤销的更改。

使用 git reset

如果你想完全放弃已撤销的更改并保留当前工作目录,可以使用 git reset 命令。

git reset --hard <提交哈希>

这会将你的工作目录重置到指定的提交,有效地撤销撤销操作。

解决冲突

如果已撤销的更改与你当前的更改冲突,Git 会要求你手动解决冲突。你可以通过编辑冲突文件、选择要保留的更改,然后将已解决的文件添加到暂存区来做到这一点。

git add <冲突文件>
git commit -m "撤销后解决冲突"

解决冲突后,你可以继续进行撤销操作。

保留特定更改

如果你想保留已撤销提交中的特定更改,可以使用 git cherry-pick 命令有选择地将这些更改应用到你当前的分支。

git cherry-pick <提交哈希>

这会将指定提交中的更改应用到你当前的分支,使你能够在撤销其余更改的同时保留你想要的更改。

通过使用这些技巧,你可以在有效地撤销提交的同时,保留你想要在工作目录中保留的更改。

总结

在本教程结束时,你将全面了解如何在不丢失更改的情况下撤销 Git 提交。你将学习到撤销不需要的提交的基本技巧,同时保持你来之不易的进度完好无损。这些知识将使你有信心管理你的 Git 仓库,并维护一个干净、有条理的代码库。