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 -- filename HEAD不变。用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

你可能感兴趣的:(git,程序员技巧及个性,java及程序,Android,ios)