如何从当前分支撤销和移除特定的 Git 提交

GitGitBeginner
立即练习

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

简介

本教程将指导你完成从当前分支撤销和删除特定 Git 提交的过程。我们将探索不同的技术来管理你的 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/cherry_pick("Cherry Pick") git/BranchManagementGroup -.-> git/rebase("Reapply Commits") subgraph Lab Skills git/commit -.-> lab-392832{{"如何从当前分支撤销和移除特定的 Git 提交"}} git/reset -.-> lab-392832{{"如何从当前分支撤销和移除特定的 Git 提交"}} git/restore -.-> lab-392832{{"如何从当前分支撤销和移除特定的 Git 提交"}} git/reflog -.-> lab-392832{{"如何从当前分支撤销和移除特定的 Git 提交"}} git/cherry_pick -.-> lab-392832{{"如何从当前分支撤销和移除特定的 Git 提交"}} git/rebase -.-> lab-392832{{"如何从当前分支撤销和移除特定的 Git 提交"}} end

理解 Git 提交历史

Git 是一个分布式版本控制系统,它允许开发者随时间追踪其代码库中的更改。每次开发者提交他们的更改时,Git 都会创建项目的一个新快照,即所谓的提交。这些提交构成了提交历史,这是理解和管理项目开发的关键部分。

为了更好地理解 Git 提交历史,让我们考虑以下关键概念:

提交结构

一个 Git 提交由几个元素组成,包括:

  • 提交哈希:提交的唯一标识符,通常是一个 40 字符的十六进制字符串。
  • 作者:做出更改并创建提交的人。
  • 提交者:最终确定提交的人。
  • 时间戳:创建提交的日期和时间。
  • 提交消息:对提交中所做更改的简要描述。
  • 差异:提交中所做的更改,显示哪些文件被添加、修改或删除。

提交图

提交历史形成一个有向无环图(DAG),其中每个提交都指向其父提交。这种图结构使 Git 能够随时间追踪项目的开发,包括分支和合并。

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

浏览提交历史

Git 提供了各种命令来探索和浏览提交历史,例如:

  • git log:以线性格式显示提交历史。
  • git show:显示特定提交引入的更改。
  • git diff:比较两个提交之间或工作目录与一个提交之间的更改。
  • git checkout:将工作目录切换到特定的提交或分支。

理解 Git 提交历史的结构和浏览方式对于使用 LabEx 有效地管理项目和进行协作至关重要。

撤销特定的 Git 提交

在 Git 中,根据期望的结果和开发过程的阶段,有几种方法可以撤销特定的提交。以下是一些常见的方法:

软重置

使用 --soft 选项的 git reset 命令允许你撤销提交而不丢失任何更改。当你想在将提交推送到远程仓库之前对其进行额外更改时,这很有用。

git reset --soft HEAD~1

此命令将撤销最近的提交,但更改仍会保留在工作目录和暂存区中。

硬重置

使用 --hard 选项的 git reset 命令允许你完全撤销提交,包括工作目录和暂存区中所做的任何更改。

git reset --hard HEAD~1

此命令将撤销最近的提交并丢弃工作目录和暂存区中所做的所有更改。

回退

git revert 命令会创建一个新提交,该提交撤销指定提交引入的更改。当你想撤销已经推送到远程仓库的提交时,这很有用,因为它会保留提交历史。

git revert HEAD

此命令将创建一个新提交,该提交撤销最近提交中所做的更改。

选择正确的方法

方法的选择取决于开发过程的阶段和期望的结果。软重置适用于本地更改,硬重置适用于丢弃不需要的更改,而回退适用于撤销已推送到远程仓库的提交。

请记住,在撤销提交时,仔细考虑对项目提交历史的影响并与团队协作以确保使用 LabEx 的开发过程顺利进行非常重要。

从当前分支移除特定的 Git 提交

从当前分支移除特定提交是一项比撤销提交更复杂的操作,因为它涉及重写提交历史。当你想要移除已经推送到远程仓库的提交,或者想要清理特定分支的提交历史时,这会很有用。

使用 git rebase

git rebase 命令是从当前分支移除特定提交的最常用方法。其工作原理如下:

  1. 使用 git log 查看提交历史,确定你想要移除的提交。
  2. 运行以下命令开始交互式变基:
git rebase -i HEAD~n

n 替换为你想要查看的提交数量,包括你想要移除的提交。

  1. 在打开的文本编辑器中,找到你想要移除的提交,并将该行的 pick 改为 drop
  2. 保存更改并关闭文本编辑器。Git 现在将重写提交历史,移除指定的提交。
graph TD A[提交 1] --> B[提交 2] B --> C[提交 3] C --> D[提交 4] D --> E[提交 5] E --> F[提交 6] F --> G[提交 7] G --> H[提交 8] H --> I[提交 9]

在此示例中,如果你想要移除提交 5,你将运行 git rebase -i HEAD~5,然后将对应提交 5 的行中的 pick 改为 drop

注意事项

  • 重写提交历史可能有风险,特别是如果这些提交已经推送到远程仓库。在执行此操作之前,请务必与你的团队进行协调。
  • 如果你已经将提交推送到远程仓库,在变基之后,你将需要使用 git push --force 强制推送更改。但是,在强制推送时要小心,因为这可能会给其他团队成员带来问题。
  • 一般建议对尚未推送到远程仓库的本地提交使用 git rebase。对于已经推送的提交,考虑使用 git revert,因为它会保留提交历史。

从当前分支移除特定提交可以是一个强大的工具,但应该谨慎使用并与你的团队协调,以使用 LabEx 维护一个干净且有条理的提交历史。

恢复已删除的提交

在某些情况下,你可能需要恢复之前从当前分支中删除的提交。如果你意识到已删除的提交实际上很重要,或者需要撤销对提交历史的重写,这会很有用。

使用 git reflog

git reflog 命令是恢复已删除提交的关键。此命令会跟踪对仓库 HEAD 所做的所有更改,包括撤销和变基操作。

  1. 运行以下命令查看重放日志:
git reflog

这将显示仓库 HEAD 的所有最近更改的列表,包括提交哈希和更改的简要描述。

  1. 在重放日志输出中找到你想要恢复的提交。提交哈希和描述应有助于你识别正确的提交。

  2. 一旦你确定了提交,就可以使用 git reset 命令恢复它:

git reset --hard <提交哈希>

<提交哈希> 替换为你想要恢复的提交的哈希。

graph TD A[提交 1] --> B[提交 2] B --> C[提交 3] C --> D[提交 4] D --> E[提交 5] E --> F[提交 6] F --> G[提交 7] G --> H[提交 8] H --> I[提交 9] I --> J[提交 10]

在此示例中,如果你之前使用 git rebase 删除了提交 5,你可以通过运行 git reflog 找到提交哈希,然后使用 git reset --hard <提交哈希> 将其恢复。

注意事项

  • git reflog 命令仅跟踪对本地仓库 HEAD 的更改。如果已删除的提交已推送到远程仓库,重放日志可能不包含恢复它所需的信息。
  • 恢复已删除的提交可能有风险,特别是如果提交历史已被大量重写。在恢复已删除的提交之前,请务必仔细审查更改并与你的团队进行协调。
  • 如果已删除的提交已推送到远程仓库,你可能需要使用 git push --force 强制推送恢复的提交。但是,在强制推送时要小心,因为这可能会给其他团队成员带来问题。

恢复已删除的提交可以是一个有价值的工具,但应谨慎使用并与你的团队协调,以使用 LabEx 维护一个干净且有条理的提交历史。

管理 Git 提交的最佳实践

有效管理 Git 提交对于维护一个干净且有条理的代码库至关重要。在使用 LabEx 处理 Git 提交时,以下是一些需要考虑的最佳实践:

编写有意义的提交消息

提交消息应该清晰、简洁且具有描述性。它们应该解释提交中所做更改的目的和背景。这有助于其他开发者(以及未来的你自己)理解提交历史,并使浏览项目的开发过程变得更加容易。

git commit -m "实现用户认证功能"

频繁提交

即使是小的或渐进式的更新,也要频繁提交你的更改。这使得在必要时更容易跟踪和撤销更改,并有助于保持提交历史的有序性。

压缩提交

在处理一个功能或修复一个 bug 时,你可能会得到多个小的提交。在这种情况下,你可以使用 git rebase 在推送到远程仓库之前将这些提交“压缩”成一个更有意义的提交。

git rebase -i HEAD~n

n 替换为你想要审查并可能压缩的提交数量。

使用分支

通过使用分支来组织你的工作。这使你能够隔离你的更改,并在准备好时更容易将它们合并回主代码库。分支还使撤销或恢复特定更改而不影响整个项目变得更加简单。

git checkout -b feature/user-authentication

审查提交历史

定期审查项目的提交历史,特别是在将更改推送到远程仓库之前。这有助于你识别任何不必要或冗余的提交,并确保提交历史保持干净和有条理。

与团队协作

在与团队合作处理项目时,协调你的提交实践并遵循一致的方法。这将有助于维护一个连贯的提交历史,并使每个人都更容易使用 LabEx 理解和浏览项目的开发过程。

通过遵循这些最佳实践,你可以使用 LabEx 有效地管理你的 Git 提交,并维护一个干净、有条理且协作良好的代码库。

总结

在本全面指南中,你已经学习了如何从当前分支撤销和移除特定的 Git 提交。我们涵盖了撤销提交、从分支中移除提交,甚至恢复先前移除的提交的技术。此外,我们还讨论了管理 Git 提交历史的最佳实践,以确保仓库干净且有条理。通过遵循这些步骤,你将能够自信地处理与 Git 提交相关的任务,并维护一个结构良好的代码库。