当前位置:澳门贵宾厅 > 澳门贵宾厅 > 一、撤销提交,下面我们来学习一下
一、撤销提交,下面我们来学习一下
2020-03-23

时间: 2019-12-23阅读: 76标签: git

版本控制的关键是可撤销性,即可以使项目回退到某些操作之前状态。Git作为一款非常优秀的版本控制软件具备了丰富的撤销的命令来应对不同的场景,下面我们来学习一下。

Git 版本管理时,往往需要撤销某些操作。本文介绍几种最主要的情况,给出详细的解释。更多的命令可以参考《常用 Git 命令清单》一文。

1.修改最后一次提交

  1. 未修改直接提交

    图片 1

    未修改直接再次提交

    一、撤销提交,下面我们来学习一下。值得注意的是,两次提交的项目内容和提交人没有变化,但是由于提交的时间不同,导致commit对象的内容不同,因此产生内容的ID也不相同。

  2. 修改后再提交

    图片 2

    修改后再提交

一、撤销提交

2. reset、revert和checkout

Git使用reset、revert和checkout三个命令来回退项目到某一个历史快照。
回退有两个影响级别:

一种常见的场景是,提交代码以后,你突然意识到这个提交有问题,应该撤销掉,这时执行下面的命令就可以了。

2.1 commit级别回退

$ git revert HEAD
1)回退Git仓库

图片 3

恢复git仓库到上一次提交

重新根据reset命令撤销刚才的撤销操作(是不是有点绕口)

图片 4

撤销刚才的撤销操作

图片 5

恢复到撤销前的状态

上面命令的原理是,在当前提交后面,新增一次提交,抵消掉上一次提交导致的所有变化。它不会改变过去的历史,所以是首选方式,没有任何丢失代码的风险。

2)回退Git仓库和暂存区

图片 6

回退Git仓库和暂存区

git revert命令只能抵消上一个提交,如果想抵消多个提交,必须在命令行依次指定这些提交。比如,抵消前两个提交,要像下面这样写。

3)回退Git仓库、暂存区和工作区
$ git revert [倒数第一个提交] [倒数第二个提交]
git reset

图片 7

git reset --hard

图片 8

未跟踪文件不被清除

git revert命令还有两个参数。

git revert

图片 9

git revert

图片 10

revert的冲突情况

--no-edit--no-commit
4)reset和revert的区别

图片 11

初始状态

![](https://upload-images.jianshu.io/upload_images/7914265-1ff8d0d307ca1574.png)

初始状态执行git rest HEAD~后结果
![](https://upload-images.jianshu.io/upload_images/7914265-3eb6e0585b3316dd.png)

初始状态执行git revert HEAD后结果
命令 git reset git revert
原理 改变分支的commit的引用 对已有commit引用打反补丁
副作用 改变commit历史 不会改变commit历史
适用性 本地分支 公共分支
冲突 无冲突 会有冲突
优点 无冲突的恢复到某次历史快照 可针对中间的某次提交进行撤销操作
本质 覆盖操作 修补操作

二、丢弃提交

2.2 文件级别回退

如果希望以前的提交在历史中彻底消失,而不是被抵消掉,可以使用git reset命令,丢弃掉某个提交之后的所有提交。

1)回退暂存区文件
$ git reset [last good SHA]
2)回退工作区文件

git reset的原理是,让最新提交的指针回到以前某个时点,该时点之后的提交都从历史中消失。

3.提交树

Git中每次提交都会存储在Git仓库,只是有些提交经过reset、删除分支、删除储藏等操作后不被分支和标签引用,变成悬挂状态(dangling)。我们可以通过以下命令查看这些提交(Git的提交树和vim的undo树异曲同工)。

默认情况下,git reset不改变工作区的文件(但会改变暂存区),--hard参数可以让工作区里面的文件也回到以前的状态。

1)完整提交树
$ git reset --hard [last good SHA]
2)有效提交树

执行git reset命令之后,如果想找回那些丢弃掉的提交,可以使用git reflog命令,具体做法参考这里。不过,这种做法有时效性,时间长了可能找不回来。

3)撤销的悬挂提交(dangling commit)

三、替换上一次提交

4)一图以蔽之

图片 12

提交树

提交以后,发现提交信息写错了,这时可以使用git commit命令的--amend参数,可以修改上一次的提交信息。

4.储藏和恢复

由于revert、分支合并等场景下的操作会与工作区和暂存区的内容产生冲突,若不想提交当前工作区和暂存区的修改内容,可以通过储藏命令将其储藏起来,然后在合适的时候恢复工作区和暂存区。

git stash       # 储藏当前工作区和暂存区
git stash list  # 查看当前的储藏列表
git stash apply # 恢复上一次的储藏内容
git stach pop   # 恢复上一次的储藏内容,并将其从储藏区删除
$ git commit --amend -m "Fixes bug #42"

5.清除未跟踪文件

git reset --hard commit  # 恢复git仓库、暂存区和工作区(不包含未跟踪内容)到指定commit
git clean -df # 删除当前处于未跟踪状态的文件和目录
git status # 当前处于commit,且暂存区和工作区都处于clean状态

它的原理是产生一个新的提交对象,替换掉上一次提交产生的提交对象。

参考

  1. 代码回滚:git reset、git checkout和git revert区别和联系
  2. 在 git 中找回丢失的 commit
  3. Git 工具 - 储藏(Stashing)
  4. Git的"~"和"^"的区别

这时如果暂存区有发生变化的文件,会一起提交到仓库。所以,--amend不仅可以修改提交信息,还可以整个把上一次提交替换掉。

四、撤销工作区的文件修改

如果工作区的某个文件被改乱了,但还没有提交,可以用git checkout命令找回本次修改之前的文件。

$ git checkout -- [filename]

它的原理是先找暂存区,如果该文件有暂存的版本,则恢复该版本,否则恢复上一次提交的版本。

注意,工作区的文件变化一旦被撤销,就无法找回了。

五、从暂存区撤销文件

如果不小心把一个文件添加到暂存区,可以用下面的命令撤销。

$ git rm --cached [filename]

上面的命令不影响已经提交的内容。

六、撤销当前分支的变化

你在当前分支上做了几次提交,突然发现放错了分支,这几个提交本应该放到另一个分支。

# 新建一个 feature 分支,指向当前最新的提交# 注意,这时依然停留在当前分支$ git branch feature# 切换到这几次提交之前的状态$ git reset --hard [当前分支此前的最后一次提交]# 切换到 feature 分支$ git checkout feature

上面的操作等于是撤销当前分支的变化,将这些变化放到一个新建的分支。

原文:-undo.html