【转】git reset, revert, checkout介绍及区别

git reset, revert, checkout介绍及区别

原文链接:http://maiyang.github.io/git/2016/04/21/git-reset-checkout-revert

 

不知道大家对于git reset, revert, checkout几个命令了解不?

在我们日常使用git时,时常被用到,我结合我自己的经验简单介绍一下,如果有说的不对,请及时纠正。

首先,其实这3个命令的主要功能就是撤销(undo)。

基本概念

仓库

git 仓库有三个组成(components),分别是:working directory(代码仓库),staged snapshot(快照:add的缓存库),commit history(commit历史)。

git checkout

git checkout hotfix 切换到hotfix分支,仅仅是将HEAD移到一个新的分支(hotfix)上,然后更新工作目录。

因为这可能覆盖你本地修改,所以git强制你提交或缓存工作目录的所有更改,不然checkout的时候这些更改都会丢失。

git checkout HEAD~3 快速查看项目HEAD之前的第3个版本,这个对于我们查看之前的变更很有帮助的。

“git checkout – ..." to discard changes in working directory

作用于working directory

git reset

git reset 是撤销某次提交,但是此次之后的修改都会被退回到暂存区。

  1. git reset HEAD 回退所有内容到上一个版本
  2. git reset 057d 回退到某个版本

git revert

Revert撤销一个提交的同时会创建一个新的提交。这是一个安全的方法,因为它不会重写提交历史。比如,下面的命令会找出倒数第二个提交,然后创建一个新的提交来撤销这些更改,然后把这个提交加入项目中。

git revert HEAD~3:丢弃最近的三个commit,把状态恢复到最近的第四个commit,并且提交一个新的commit来记录这次改变。

git reset 和git revert的区别

  1. git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
  2. git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进
  3. 在回滚这一操作上看,虽然效果差不多,但是日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。

使用场景

下表来源于延伸阅读(1)

命令作用域常用情景
git reset 提交层面 在私有分支上舍弃一些没有提交的更改
git reset 文件层面 将文件从缓存区中移除
git checkout 提交层面 切换分支或查看旧版本
git checkout 文件层面 舍弃工作目录中的更改
git revert 提交层面 在公共分支上回滚更改
git revert 文件层面 (然而并没有)

posted @ 2017-02-08 18:00  LittleEyes  阅读(1327)  评论(0编辑  收藏  举报