【Git】git reset 和 git revert 的用法及示例讲解

前言

git resetgit revert 都是用来撤销某一次的提交操作,但是他们撤销的方法有所不同。

1.git revert

git revert的撤销操作是通过一个新的提交来完成的,这个提交中的改动和要撤销的改动是相反的,以此实现指定提交的撤销。

举例:

  从图片中可以看到我的操作是在代码中依次填入两行改动并进行了两次本地的提交(蓝色是本地仓库我的分支,紫色是远程仓库我的分支)。

接下来我会执行 git revert <指定操作的commit ID>

arduino 复制代码
git revert 8700d52fbda866a1c481eca607b2f2a759297a8c //改动二
按下 Esc 键
输入 :wq
然后按 Enter

  从图片中可以看出git revert的操作就是向本地仓库生成一个新的Revert提交,其内容就是需要撤销的提交的反操作。

后三行的操作对应的是下图这个区域:

特点:

  • 不会修改历史: 由于git revert是通过一个新提交来撤销之前的提交,所以它会保留住之前的提交历史。
  • 适合公共分支: 如果你和他人都在一个公共分支上协作,由于git revert会保留提交历史,每次改动记录都存在,是十分安全的操作。
  • 其他操作:
  1. git revert --continue:冲突发生之后,解决冲突之后git add解决后的文件(提交到暂存区),然后输入git revert --continue继续操作(前文我revert 改动一 就会发生冲突);
  2. git revert --abort:冲突发生之后,不想继续这次的revert操作;
  3. git revert -n <改动一的commit ID>^..<改动三的commit ID>:撤销改动一到改动三(包含)之间的所有提交,它会将所有反向更改暂时保存在暂存区中,但不会立即提交。你可以手动编辑这些更改,并最终一起提交。

2.git reset

git reset的撤销操作是通过回退本地分支指针实现,回退到指定的一次提交之后,之前的提交操作会被丢弃。

举例:

  从图片中可以看到我的操作是在代码中依次填入三行改动并进行了三次本地的提交(蓝色是本地仓库我的分支,紫色是远程仓库我的分支)。

接下来我会执行 git reset --hard <指定操作的commit ID> : 改动二的commit ID:7b1b296e83530bd016c5787d2de7da77ac48ee79

css 复制代码
git reset --hard 7b1b296e83530bd016c5787d2de7da77ac48ee79

  从图片中可以看出我们本地仓库的提交中改动三没有了,说明上述git reset --hard的操作是实现的效果是分支本地指针指向选定的提交,之后的其他提交都丢弃。

终端返回的内容HEAD is now at 7b1b296e8 🐛 change:改动二

特点:

  • 会修改历史: 由于git reset会丢弃一些后面的提交,所以这个操作是会改变提交历史。
  • 适用于本地操作: 由于git reset改动大,会修改历史,所以更适合回滚自己本地的提交,不适合对已经推送到远程仓库的提交进行改动。
  • 其它操作:
  1. HEAD~X : 撤销最近X次提交
perl 复制代码
git reset HEAD~2

可以看到把改动一和改动二的提交给撤销了,但是在改动区保留了这两次提交的改动。

  1. git reset --soft <commit ID> : 只移动分支指针,暂存区和工作目录中的更改都会保留,以便再次提交。
scss 复制代码
git reset --soft 8700d52fbda866a1c481eca607b2f2a759297a8c //改动二的ID

可以看到左边将改动放到了暂存区,右边工作区修改同样保留了改动三。

  1. git reset --mixed(或不带选项默认) <commit ID> :移动分支指针,不会修改工作区,撤销了提交和暂存的更改,但保留了工作区的修改。

可以看到左边将改动放在改动区,并没有放入暂存区,右边工作区是保留了改动三。

附录:

在已经提交到远程仓库的情况下,使用git reset之后,只有本地指针会回退,如果想让远端仓库也同样回退可以使用git push origin HEAD --force:强制推送到远程仓库覆盖远程历史(慎用!)。

相关推荐
三坛海会大神55510 分钟前
CICD(一)CI/CD概述及GitLab部署和一些Git命令
git·ci/cd·1024程序员节
荣光波比8 小时前
CICD(一)—— 从零搭建 GitLab 全流程(Docker 部署 + 实战指南)
git·ci/cd
摇滚侠20 小时前
VScode 提交代码 Git
git
YuforiaCode1 天前
移除原有 Git 仓库关联,在IDEA中重新初始化 Git 并推送到新仓库(详细图解、包含相关问题的解决办法)
git
UIUV1 天前
Git程序员入门笔记:从零开始掌握分布式版本控制
git
星光不问赶路人1 天前
彻底清理 Git 分支:从查看到批量删除无效分支的全流程指南
git·github
如果是君1 天前
【git使用】ubuntu下利用git工具提交一个工程
linux·git·ubuntu
吃鱼吃鱼吃不动了1 天前
常用的 git 命令
git
迷路爸爸1801 天前
Git Commit Message 规范:写出清晰、可维护的提交记录
git·python
前端赵哈哈1 天前
Git 本地仓库操作指南:将未提交文件复刻至新分支(无需关联远端)
前端·git·github