git 撤销操作--git checkout、git reset、git revert、git commit -- amend

git 撤销操作

一、前言

在使用git过程当中经常会用到撤销一些已经完成的操作,经常会用到git checkoutgit resetgit revertgit commit -- amend。在用法上也有不同之处,简单的分析下这几种方法的不同。

首先简单看一下git的一个简单流程(简单的流程,可以结合下面的图看一下):

  • 在工作区进行修改、操作,文件一般处于modifiedUntracked
  • git add 就是把文件修改添加到暂存区
  • git commit 就是把暂存区的所有内容提交到当前分支。



二、git commit – amend

这个命令主要是修改最近一次的提交的modify message。比如我们在通过git commit -m'modify message'提交修改信息。之后发现修改信息有误可以通过git commit --amend修改已经提交的信息:


图片名称

使用vim编辑需要的信息:


图片名称


图片名称

w+q保存退出


图片名称

这样就OK了。

第一次使用git commit -- amend 默认的编辑器可能不是vim可能会遇到一个bug:There was a problem with the editor ‘vi’ bug修复传送门~点击

三、git checkout

git checkout一些常用的用法:

git checkout [-q] [< commit >] [–] \< paths >…

git checkout [< branch >]

git checkout [-m] [[-b]–orphan] < new_branch >] [< commit__id >]

今天主要讨论一下git checkout撤销的一些操作

  1. git checkout || git checkout HEAD || git checkout [< commit__id >]
  2. git checkout -- filename
  3. git checkout branch -- filename
  4. git checkout -- . || git checkout .
参数作用
git checkout || git checkout HEAD显示工作区、暂存区与HEAD的差异
git checnkout -[< commit__id >]切换至指定节点的代码库(git节点都含有一个完整的代码仓库),如 git checnkout -[3e07fd8]
git checkout -- filename用暂存区中filename文件来覆盖工作区中的filename文件。相当于取消自上次执行git add/commit以来(如果执行过)的本地修改
git checkout branch -- filenameHEAD不变。用branch所指向的提交中filename替换暂存区和工作区中相应的文件。注意会将暂存区和工作区中的filename文件直接覆盖。
git checkout -- . || git checkout .相当于用暂存区的所有文件直接覆盖本地文件,危险操作⚠️

四、git reset

简单说一下git reflog:

git reflog

显示整个本地仓储的commit, 包括所有branchcommit, 甚至包括已经撤销的commit, 只要HEAD发生了变化, 就会在reflog里面看得到. git log只包括当前分支的commit.

git reflog查询结果为下:


图片名称

参数作用
git reset HEAD任何事情都不会发生,这是因为我们告诉GIT重置这个分支到HEAD,而这个正是它现在所在的位置(上图的3e07fd8位置)。
git reset HEAD~1则意味着将HEAD从顶端的commit往下移动一个更早的commit
git reset HEAD~2则意味着将HEAD从顶端的commit往下移动两个更早的commit

在看一下各个参数:

参数作用
soft–soft参数使git重置HEAD到另外一个commit。意味着工作区、暂存区都不会做任何变化,所有的在 HEAD和重置到的那个commit之间的所有变更集仍然在暂存区(index)区域中。
hard–hard参数将会blow out everything。它将重置HEAD到另外一个commit,重置缓存区以便反映HEAD的变化,并且重置工作区也使得其完全匹配起来。这是一个比较危险的操作⚠️,具有破坏性!
mixed(default)–mixed是reset的默认参数。它将重置HEAD到另外一个commit,并且重置缓存区。工作区不会被更改。所以所有从HEAD到你重置到的那个commit之间的所有变更仍然保存在工作区中,被标示为已变更

举个简单的例子: git reset --mixed [版本号]


图片名称

1.先 git commit提交一部分内容,在通过 git reset --mixed 62aba96,撤销最后一次的提交。


图片名称

2.在通过 git diff查看修改过的内容。会发现 [62aba96]提交的内容,回到了工作区

图片名称

3.这个时候通过 git reflog查看最上面两条信息,一条是 git commit的信息,一条是 git reset的信息。

五、git revert

如果简单的说一下git revert的作用,通过创建一条新的commit,覆盖之前的某一次commit所提交的内容,但是不会影响之前的提交信息。

Given one or more existing commits, revert the changes that the related patches introduce, and record some new commits that record them. This requires your working tree to be clean (no modifications from the HEAD commit).

参数作用
git revert HEAD撤销上一次的commit
git revert HEAD^撤销上上一次的commit
git revert [commit-id]撤销到指定的某一次的commit

举个简单的例子:


图片名称

  1. commit提交一条内容。
  2. 在通过git revert HEAD
  3. 在通过git reflog(下图)和git log -p(下图)查看会发现,有条commmit覆盖了之前commit的操作。


图片名称


图片名称

六、参考

http://www.cnblogs.com/craftor/archive/2012/11/04/2754147.html

http://www.cnblogs.com/kidsitcn/p/4513297.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值