git 撤销操作--git checkout、git reset、git revert、git commit -- amend
2017-07-16 14:46
561 查看
git 撤销操作
一、前言
在使用git过程当中经常会用到撤销一些已经完成的操作,经常会用到git checkout、
git reset、
git revert、
git commit -- amend。在用法上也有不同之处,简单的分析下这几种方法的不同。
首先简单看一下git的一个简单流程(简单的流程,可以结合下面的图看一下):
在工作区进行修改、操作,文件一般处于
modified或
Untracked
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撤销的一些操作
git checkout||
git checkout HEAD||
git checkout [< commit__id >]
git checkout -- filename
git checkout branch -- filename
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, 包括所有
branch的
commit, 甚至包括已经撤销的
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 |
先
commit提交一条内容。
在通过
git revert HEAD
在通过
git reflog(下图)和
git log -p(下图)查看会发现,有条
commmit覆盖了之前
commit的操作。
六、参考
http://www.cnblogs.com/craftor/archive/2012/11/04/2754147.htmlhttp://www.cnblogs.com/kidsitcn/p/4513297.html
相关文章推荐
- git 操作实例(git commit, git push, git branch, git checkout, git reset)
- 详解Git工作区、暂存区、历史记录区以及git reset、git revert、git checkout等撤销命令的区别
- [git]撤销的相关命令:reset、revert、checkout
- Git开发实战(三)之撤销操作(reset、checkout)
- 详解Git工作区、暂存区、历史记录区以及git reset、git revert、git checkout等撤销命令的区别
- Git快速入门-git stash 暂存变更,git reset 撤销commit,git revert 回退远程版本库
- git撤销大全(reset、reflog、revert、checkout、rebase、rm)
- git撤销操作(git checkout; git reset)
- git revert、git reset和git checkout的区别
- Git Commit前取消add 操作(利用git reset操作)
- git reset, git checkout, git revert 区别
- 代码回滚:git reset、git checkout和git revert区别和联系
- Git撤销Commit操作
- 【转】git reset, revert, checkout介绍及区别
- 第一次使用git,撤销git add操作 (undo git add before commit)
- git reset撤销操作
- Git的纯命令操作,Install,Clone , Commit,Push,Pull,版本回退,撤销更新,分支的创建/切换/更新/提交/合并,代码冲突
- Git 初接触 (三) Git的撤销操作 git reset HEAD -- <file>
- Git log(可以显示所有提交过的版本信息)和reflog(可以查看所有分支的所有操作记录(包括commit和reset的操作))
- git checkout reset revert