如何在 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/log("Show Commits") git/BranchManagementGroup -.-> git/reflog("Log Ref Changes") subgraph Lab Skills git/commit -.-> lab-415499{{"如何在 Git 中识别和检索已删除的提交"}} git/reset -.-> lab-415499{{"如何在 Git 中识别和检索已删除的提交"}} git/restore -.-> lab-415499{{"如何在 Git 中识别和检索已删除的提交"}} git/log -.-> lab-415499{{"如何在 Git 中识别和检索已删除的提交"}} git/reflog -.-> lab-415499{{"如何在 Git 中识别和检索已删除的提交"}} end

理解 Git 提交

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

什么是 Git 提交?

Git 提交是 Git 仓库中更改的基本单元。当你对项目文件进行更改并决定保存这些更改时,你就创建了一个新的提交。每个提交包含以下信息:

  1. 唯一标识符:每个提交都被分配一个唯一的 40 字符十六进制字符串,称为提交哈希或提交 SHA。此标识符用于唯一引用该提交。
  2. 作者:进行更改并创建提交的人。
  3. 时间戳:创建提交的日期和时间。
  4. 提交消息:对提交中所做更改的简要描述。
  5. 文件快照:提交时项目目录中所有文件的完整状态。
  6. 父提交:当前提交所基于的前一个提交。

Git 提交剖析

当你在 Git 仓库中创建一个新提交时,会发生以下步骤:

  1. 暂存更改:你首先需要使用 git add 命令暂存你想要包含在提交中的更改。
  2. 创建提交:一旦更改被暂存,你可以使用 git commit 命令创建一个新提交。这将捕获项目的当前状态并创建一个新提交。
  3. 更新分支:然后,新提交会被添加到当前分支,将分支指针推进到新提交。
graph LR A[工作目录] --> B[暂存区] B --> C[Git 仓库]

查看提交历史记录

你可以使用 git log 命令查看 Git 仓库的提交历史记录。这将显示仓库中所有提交的列表,包括它们的提交哈希、作者、时间戳和提交消息。

$ git log
提交 1234567890abcdef1234567890abcdef12345678
作者:John Doe <[email protected]>
日期:2023 年 4 月 24 日 星期一 12:34:56 +0000

    实现新功能 X

提交 fedcba0987654321fedcba0987654321fedcba
作者:Jane Smith <[email protected]>
日期:2023 年 4 月 21 日 星期五 09:87:65 +0000

    修复模块 Y 中的错误

识别已删除的提交

在软件开发过程中,开发人员意外从 Git 仓库中删除提交的情况并不罕见。对于任何 Git 用户来说,识别这些已删除的提交都是一项必不可少的技能。

理解 Git 引用日志

Git 引用日志是一个强大的工具,可以帮助你识别和检索已删除的提交。引用日志记录了对仓库分支引用所做的所有更改,包括提交的删除。

要查看引用日志,你可以使用 git reflog 命令:

$ git reflog
1234567 HEAD@{0}: commit: 实现新功能 X
fedcba0 HEAD@{1}: commit: 修复模块 Y 中的错误
abcd123 HEAD@{2}: commit: 更新文档

引用日志中的每个条目都代表仓库状态的一次更改,包括提交哈希、更改类型(例如 commit)和简要描述。

识别已删除的提交

要使用引用日志识别已删除的提交,你可以查找表明提交已被删除的条目。例如,如果你看到这样的条目:

abcd123 HEAD@{2}: commit (amend): 更新文档

这意味着哈希为 abcd123 的提交之前被修改过(即被修改并替换为一个新的提交)。

或者,你可能会看到这样的条目:

abcd123 HEAD@{2}: commit (delete): 更新文档

这表明哈希为 abcd123 的提交已从仓库中删除。

通过检查引用日志,你可以识别已删除提交的提交哈希,并使用它来检索该提交,如下一节所述。

检索已删除的提交

使用 Git 引用日志识别出已删除的提交后,你可以检索该提交并将其恢复到你的仓库中。此过程涉及创建一个新分支或将该提交挑选到当前分支。

恢复已删除的提交

要恢复已删除的提交,你可以使用 git checkout 命令基于已删除的提交创建一个新分支:

$ git checkout -b restored-commit abcd123
切换到一个新分支'restored-commit'

这将创建一个名为 restored-commit 的新分支,它指向哈希为 abcd123 的已删除提交。然后你可以根据需要继续在这个分支上工作。

或者,你可以使用 git cherry-pick 命令将已删除提交中的更改直接应用到当前分支:

$ git cherry-pick abcd123
[master 1234567] 更新文档
日期:2023 年 4 月 26 日 星期三 10:23:45 +0000
1 个文件被更改,2 处插入(+)

这会将哈希为 abcd123 的提交中的更改应用到当前分支(在此示例中为 master)。

验证恢复的提交

恢复已删除的提交后,你可以使用 git log 命令验证该提交是否已成功检索到:

$ git log
提交 1234567890abcdef1234567890abcdef12345678
作者:John Doe <[email protected]>
日期:2023 年 4 月 26 日 星期三 10:23:45 +0000

    更新文档

提交 fedcba0987654321fedcba0987654321fedcba
作者:Jane Smith <[email protected]>
日期:2023 年 4 月 21 日 星期五 09:87:65 +0000

    修复模块 Y 中的错误

恢复的提交现在应该会在提交历史记录中可见。

注意事项

请记住,默认情况下,Git 引用日志仅存储过去 30 天的信息。如果已删除的提交早于 30 天,它可能不在引用日志中,你可能无法使用此方法检索它。

此外,如果已删除的提交已经被推送到远程仓库并且远程仓库已经更新,你可能无法从本地仓库中检索到已删除的提交。在这种情况下,你可能需要与你的团队协调,从远程仓库中检索已删除的提交。

总结

在本教程中,你已经学习了如何在 Git 中有效地识别和检索已删除的提交。通过了解可用的各种技术和命令,你现在可以恢复丢失的代码,维护完整的提交历史记录,并确保项目开发过程的完整性。Git 强大的版本控制功能使其成为现代软件开发的关键工具,而掌握管理已删除提交的能力对于任何使用 Git 的开发者来说都是一项宝贵的技能。