如何在 Git 中安全撤销提交与更改


前言

在团队开发和个人项目中,代码变更是不可避免的。有时我们可能会提交错误的代码、误操作导致文件的更改,或者在合并分支时出现问题。这时候,了解如何撤销这些不必要的更改就显得尤为重要。Git 提供了一系列强大的命令来处理不同场景下的变更撤销操作。在本文中,我们将详细介绍 git resetgit revert 的使用方法,并通过实际例子帮助你选择合适的操作方式,以便安全、快速地恢复代码状态。
在这里插入图片描述


一、Git Reset

git reset 是一个非常强大的命令,可以用于撤销提交、修改暂存区的内容,以及恢复工作区中的文件,原来指向的提交记录就跟从来没有提交过一样。根据不同的选项,git reset 可以有不同的效果,适用于不同的场景。
在这里插入图片描述

1. --soft:保留变更在暂存区

  • 场景:当你已经提交了代码,但想要撤销这个提交,同时保留所有变更在暂存区中,以便可以重新提交或修改提交信息。
  • 效果:将当前分支的指针(HEAD)移动到上一个提交,暂存区的文件保持不变,允许你对这些文件进行进一步操作。
git reset --soft HEAD~1

2. --mixed(默认选项):保留变更在工作区

  • 场景: 当你希望撤销最近的提交,并且将这些更改从暂存区移除,但保留在工作区中。
  • 效果: 将当前分支的指针移动到上一个提交,同时将暂存区的内容重置为该提交的状态,但工作区中的更改仍然存在。你可以进一步检查这些更改,然后决定如何处理。
git reset --mixed HEAD~1

3. --hard:彻底丢弃所有变更

  • 场景: 当你希望完全撤销最近的提交和所有未提交的变更,不保留任何修改。
  • 效果: 将当前分支的指针、暂存区和工作区都恢复到上一个提交的状态,所有的更改将被彻底丢弃。使用这个命令时要特别小心,以免丢失重要的工作。
git reset --hard HEAD~1

二、Git Revert

git revert 是另一种常用的撤销方法,它的特点是通过创建一个新的提交来反转之前的提交,而不会直接修改提交历史。这使得 git revert 非常适合在已经推送到远程仓库的提交上使用,特别是在团队协作中。

1. 撤销单个提交

  • 场景: 当你发现最近的一次或某个历史提交中有错误,需要撤销该提交的更改,但保留提交历史。
  • 效果: 生成一个新的提交,内容是对 <commit_hash> 所指向的提交的反转。这个新提交将被添加到当前分支的末尾,历史记录将完整保留,并且撤销操作是可追踪的。

在这里插入图片描述
假设C2的<commit_hash>e5f6g7h8,运行下面的命令会得到

git revert e5f6g7h8

在我们要撤销的提交记录后面居然多了一个新提交,是因为新提交记录 C2' 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的。
在这里插入图片描述

2. 撤销多个提交

  • 场景:当不止撤销一个提交时,要撤销多个连续的提交
  • 该命令会依次对从 <start_commit_hash> (不包括)到 <end_commit_hash> (包括)之间的每一个提交进行反转,并创建对应的新提交。
git revert <start_commit_hash>..<end_commit_hash>

3. 撤销合并提交

  • 场景: 在处理合并时,如果发现合并有误,需要撤销合并提交,但保留分支的其余部分。
  • 效果: 这个命令将撤销指定的合并提交,同时保留一个父分支的内容。-m 1 参数指定了要保留的父分支编号(通常为 1),这确保了合并的另一部分内容不会被撤销。
git revert -m 1 <merge_commit_hash>

三、实际例子

当不小心推送了不能上传的文件到远程仓库中,直接删除记录该怎么删掉呢,使用git revert会保留历史记录,那我们只能使用git reset来“改写历史”

  1. 用以下git log命令查看要撤回的提交哈希是什么,输出的commit 后跟着的字符串就是版本号
commit 91089df9cc4581d82d454a16fc15b8501d239128
  1. --hard参数将本地仓库回滚到之前某版本,此时本地已经回滚,远程仓库还未回滚
git reset --hard 版本号
  1. --force (或 -f): 强制推送选项。这会覆盖远程仓库的提交历史,即使本地分支的提交历史不是远程分支的子集也会强制推送。也就可以将本地仓库的历史直接覆盖掉远程仓库的历史
git push -f 

注意:强制推送会覆盖远程仓库的现有内容,因此团队成员的提交可能会丢失。确保所有相关人员已经备份或同意这个操作。如果其他人已经从远程仓库拉取了代码,强制推送可能会导致他们的本地分支和远程分支不一致。


总结

撤销变更是 Git 日常使用中的一项重要操作。无论是通过 git reset 重置提交历史,还是使用 git revert 创建新的反转提交,这些命令都能帮助我们在不同的场景中有效地处理代码问题。在进行这些操作时,理解每个命令的作用和潜在影响尤为重要,特别是在团队协作环境中。希望通过本文的讲解,你能够更加熟练地使用 Git 来管理项目中的代码变更,确保代码库的整洁和稳定。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花花花1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值