如何在 GitHub 上撤销提交

GitBeginner
立即练习

简介

本教程将指导你完成在 GitHub 上撤销提交的过程,这是使用 Git 进行有效版本控制的一项关键技能。无论你是需要撤销最新的提交、较旧的提交,甚至是恢复已删除的提交,我们都能为你提供帮助。通过本教程的学习,你将对如何管理 Git 提交历史以及掌控项目开发有深入的理解。

使用 Git 进行版本控制简介

版本控制是软件开发的一个关键方面,它使开发者能够跟踪变更、高效协作并管理项目历史记录。Git 作为一种分布式版本控制系统,已成为管理源代码和进行项目协作的行业标准。

Git 的核心是一个强大的工具,它允许你创建、管理和维护一个文件仓库,每个文件都有独特的变更历史记录。这个历史记录可以被查看、导航和操作,以满足项目的需求。

Git 的主要优势之一是它处理分支和合并的能力。开发者可以创建多个分支,同时处理不同的功能或修复漏洞,然后将这些变更合并回主代码库。这种工作流程促进了协作、实验和高效的开发实践。

graph LR A[工作目录] --> B[暂存区] B --> C[本地仓库] C --> D[远程仓库]

要开始使用 Git,你需要在系统上安装它。在 Ubuntu 22.04 上,你可以在终端中运行以下命令来完成安装:

sudo apt-get update
sudo apt-get install git

安装完成后,你可以初始化一个新的 Git 仓库,添加文件,提交变更,并将你的工作推送到远程服务器,如 GitHub 或 GitLab。基本的 Git 工作流程包括以下步骤:

  1. git init:在项目目录中初始化一个新的 Git 仓库。
  2. git add <文件>:将变更暂存,以便包含在下一次提交中。
  3. git commit -m "提交消息":使用暂存的变更创建一个新的提交。
  4. git push:将本地提交推送到远程仓库。

通过理解 Git 的基础知识,你将能够有效地管理项目的版本历史记录,并与其他开发者进行协作。

理解 Git 提交历史记录

Git 的提交历史记录是一个基本概念,它使你能够随着时间的推移跟踪和管理项目的变更。每次提交都代表了项目在特定时间点的状态快照,具有唯一标识符(哈希值)以及相关元数据,如作者、时间戳和提交消息。

提交历史记录可以可视化为有向无环图(DAG),其中每个提交都是一个节点,提交之间的关系由边表示。这种结构使你能够浏览项目历史、探索不同分支,并了解代码库的演变。

graph LR A[提交 1] --> B[提交 2] B --> C[提交 3] C --> D[提交 4] D --> E[提交 5]

要查看 Git 仓库中的提交历史记录,你可以使用 git log 命令。这将显示所有提交的列表,从最新的提交开始,并显示提交哈希值、作者、日期和提交消息。

$ git log
提交 5d8a7c2(HEAD -> 主分支)
作者:John Doe <john.doe@example.com>
日期:2023 年 4 月 25 日星期二 14:30:00 +0000

    实现新功能

提交 2b9f1e8
作者:Jane Smith <jane.smith@example.com>
日期:2023 年 4 月 24 日星期一 10:15:00 +0000

    修复登录功能中的漏洞

提交 1a4c6f3
作者:Bob Johnson <bob.johnson@example.com>
日期:2023 年 4 月 21 日星期五 16:45:00 +0000

    添加初始项目结构

通过理解提交历史记录,你可以浏览项目的过去,识别特定变更,甚至在必要时撤销或还原提交。这些知识对于有效管理基于 Git 的项目以及与其他开发者协作至关重要。

撤销 Git 提交的场景

在处理基于 Git 的项目时,有时你可能需要撤销或还原一次提交。这可能是由于各种原因,例如引入了一个漏洞、提交了敏感信息,或者只是想从项目历史记录中删除一次提交。Git 提供了几种方法来处理这些场景,每种方法都有其自己的用例和影响。

撤销最新提交

最常见的场景是当你想要撤销最新提交时。这可以使用带有 --soft 选项的 git reset 命令来实现,该命令会将分支指针移回上一次提交,同时保留工作目录和暂存区中的更改。

$ git reset --soft HEAD~1

此命令将撤销最后一次提交,但更改仍会保留在你的工作目录中,使你能够在再次提交之前进行进一步的修改。

撤销较旧的提交

在某些情况下,你可能需要撤销不是最新的提交。这可以使用 git revert 命令来完成,该命令会创建一个新提交,撤销指定提交所引入的更改。

$ git revert <提交哈希值>

此命令将创建一个新提交,反转指定提交中所做的更改,保留项目的提交历史记录。

在 GitHub 上恢复已删除的提交

如果你不小心从本地仓库中删除了一次提交,并将更改推送到了远程仓库,如 GitHub,你仍然可以恢复已删除的提交。GitHub 维护了一个引用日志(reflog),它记录了对仓库引用(如分支指针和标签)所做的所有更改。

要从引用日志中恢复已删除的提交,你可以使用 git reflog 命令查看更改历史记录,然后使用 git resetgit cherry-pick 将已删除的提交带回你的本地仓库。

$ git reflog
$ git reset --hard <提交哈希值>

通过了解这些场景以及相应的 Git 命令,你可以在基于 Git 的项目中有效地管理和撤销提交,确保提交历史记录干净且易于维护。

撤销最新提交

撤销提交最常见的情况是,你刚进行了最新的提交,然后意识到需要进行一些更改或完全撤销该提交。Git 提供了一种简单直接的方法来处理这种情况,即使用 git reset 命令。

使用 git reset 撤销最新提交

要撤销最新提交,你可以使用带有 --soft 选项的 git reset 命令。这会将分支指针移回上一次提交,但会保留工作目录和暂存区中的更改,使你能够在再次提交之前进行进一步修改。

以下是使用 git reset 撤销最新提交的方法:

$ git reset --soft HEAD~1

此命令将撤销最后一次提交,但更改仍会存在于你的工作目录和暂存区中。

可视化提交历史记录

你可以使用 git log 命令可视化提交历史记录。这会显示从最新提交开始的提交列表。

$ git log
提交 5d8a7c2(HEAD -> 主分支)
作者:John Doe <john.doe@example.com>
日期:2023 年 4 月 25 日星期二 14:30:00 +0000

    实现新功能

提交 2b9f1e8
作者:Jane Smith <jane.smith@example.com>
日期:2023 年 4 月 24 日星期一 10:15:00 +0000

    修复登录功能中的漏洞

提交 1a4c6f3
作者:Bob Johnson <bob.johnson@example.com>
日期:2023 年 4 月 21 日星期五 16:45:00 +0000

    添加初始项目结构

使用 git reset --soft HEAD~1 之后,提交历史记录将如下所示:

$ git log
提交 2b9f1e8(HEAD -> 主分支)
作者:Jane Smith <jane.smith@example.com>
日期:2023 年 4 月 24 日星期一 10:15:00 +0000

    修复登录功能中的漏洞

提交 1a4c6f3
作者:Bob Johnson <bob.johnson@example.com>
日期:2023 年 4 月 21 日星期五 16:45:00 +0000

    添加初始项目结构

通过了解如何使用 git reset 撤销最新提交,你可以有效地管理项目的提交历史记录,并纠正任何错误或不必要的更改。

在 GitHub 上撤销较旧的提交

在某些情况下,你可能需要撤销不是最新的提交,尤其是在像 GitHub 这样的平台上托管的协作项目中工作时。Git 提供了 git revert 命令来处理这种情况。

使用 git revert 撤销较旧的提交

git revert 命令会创建一个新提交,该提交会撤销指定提交所引入的更改。这种方法保留了项目的提交历史记录,使理解代码库的演变更加容易。

要在 GitHub 上撤销较旧的提交,请按照以下步骤操作:

  1. 确定你要撤销的提交的哈希值。你可以使用 git log 命令查看提交历史记录。
$ git log
提交 5d8a7c2(HEAD -> 主分支)
作者:John Doe <john.doe@example.com>
日期:2023 年 4 月 25 日星期二 14:30:00 +0000

    实现新功能

提交 2b9f1e8
作者:Jane Smith <jane.smith@example.com>
日期:2023 年 4 月 24 日星期一 10:15:00 +0000

    修复登录功能中的漏洞

提交 1a4c6f3
作者:Bob Johnson <bob.johnson@example.com>
日期:2023 年 4 月 21 日星期五 16:45:00 +0000

    添加初始项目结构
  1. 使用 git revert 命令撤销指定的提交。将 <提交哈希值> 替换为你在前面步骤中确定的提交哈希值。
$ git revert <提交哈希值>

这将创建一个新提交,该提交会撤销指定提交中所做的更改。

  1. 将更改推送到 GitHub 上的远程仓库。
$ git push

推送更改后,GitHub 上的提交历史记录将反映出撤销指定较旧提交的新提交。

可视化提交历史记录

你可以使用 git log 命令可视化更新后的提交历史记录。这将显示提交列表,包括撤销较旧提交的新提交。

$ git log
提交 7c2a9b1(HEAD -> 主分支)
作者:John Doe <john.doe@example.com>
日期:2023 年 4 月 26 日星期三 11:00:00 +0000

    撤销 “实现新功能”

提交 5d8a7c2
作者:John Doe <john.doe@example.com>
日期:2023 年 4 月 25 日星期二 14:30:00 +0000

    实现新功能

提交 2b9f1e8
作者:Jane Smith <jane.smith@example.com>
日期:2023 年 4 月 24 日星期一 10:15:00 +0000

    修复登录功能中的漏洞

提交 1a4c6f3
作者:Bob Johnson <bob.johnson@example.com>
日期:2023 年 4 月 21 日星期五 16:45:00 +0000

    添加初始项目结构

通过了解如何使用 git revert 在 GitHub 上撤销较旧的提交,你可以有效地管理项目的提交历史记录,并与其他开发者协作,同时保持代码库的干净和可维护。

在 GitHub 上恢复已删除的提交

有时,你可能会不小心从本地仓库中删除了一次提交,并将更改推送到远程仓库,比如 GitHub。幸运的是,GitHub 维护了一个引用日志(reflog),它记录了对仓库引用(如分支指针和标签)所做的所有更改。这使你能够恢复已删除的提交。

使用 git reflog 恢复已删除的提交

要从引用日志中恢复已删除的提交,请按以下步骤操作:

  1. 打开终端并导航到你的本地 Git 仓库。

  2. 使用 git reflog 命令查看仓库引用的更改历史记录。

$ git reflog
7c2a9b1(HEAD -> 主分支) HEAD@{0}: 撤销: 撤销 “实现新功能”
5d8a7c2 HEAD@{1}: 提交: 实现新功能
2b9f1e8 HEAD@{2}: 提交: 修复登录功能中的漏洞
1a4c6f3 HEAD@{3}: 提交: 添加初始项目结构

git reflog 的输出显示了提交哈希值以及在仓库上执行的相应操作。

  1. 确定你要恢复的已删除提交的哈希值。

  2. 使用 git reset 命令恢复已删除的提交。将 <提交哈希值> 替换为你在前面步骤中确定的提交哈希值。

$ git reset --hard <提交哈希值>

这会将已删除的提交恢复到你的本地仓库。

  1. 将恢复的提交推送到 GitHub 上的远程仓库。
$ git push

推送更改后,GitHub 上的提交历史记录将更新以包含恢复的提交。

可视化恢复后的提交历史记录

你可以使用 git log 命令来验证已删除的提交是否已成功恢复。

$ git log
提交 5d8a7c2(HEAD -> 主分支)
作者:John Doe <john.doe@example.com>
日期:2023 年 4 月 25 日星期二 14:30:00 +0000

    实现新功能

提交 2b9f1e8
作者:Jane Smith <jane.smith@example.com>
日期:2023 年 4 月 24 日星期一 10:15:00 +0000

    修复登录功能中的漏洞

提交 1a4c6f3
作者:Bob Johnson <bob.johnson@example.com>
日期:2023 年 4 月 21 日星期五 16:45:00 +0000

    添加初始项目结构

通过了解如何使用 git reflog 在 GitHub 上恢复已删除的提交,你可以有效地从意外的提交删除中恢复,并为你的项目维护完整且准确的提交历史记录。

总结

在本全面指南中,你已经学习了如何在 GitHub 上撤销提交,从最新的到较旧的提交,以及如何恢复已删除的提交。通过掌握这些技术,你将能够有效地管理你的 Git 提交历史记录,并掌控项目的开发过程。请记住,使用 Git 进行版本控制是一个强大的工具,而理解如何撤销提交是任何在 GitHub 上工作的开发者的一项关键技能。