git 使用(9)git pull和git fetch、git reset 和 git revert 的区别用法

原创 2015年11月20日 10:34:30

前面有学到git中的大部门知识,基本够用,但是,代码回滚也是平时遇到的最多的。这一节就来仔细的说下git中的比较容易搞混淆的几个命令:

git pullgit fetch, git resetgit revert

git reset 和 git revert

reset根据这个英文单词的意思直译的就是重置,就是还原的意思,在git中也是一样,用来将HEAD指针还原(指向)到某个提交(commit)。他是还原一段的,也就是说,如果这个commit 在log的中间位置,那么这个commit 之后的提交有可能都会消失掉!所以这个命令是蛮危险的。

revert根据这个英文单词的意思直译的就是恢复,撤销。git里面,用来撤销某一次提交(commit) 。他只会撤销这一次提交,无论这个commit在log的哪个位置,不会影响上下的提交。而且他会将撤销的作为一个新的commit提交。

下面,举例子来说吧:

➜  shop git:(master) git log --oneline

git log 前面已经讲过,这个命令用来显示提交的log 记录,加上-- oneline 表示,在一行精简的显示log信息。

我在项目下运行下:

643a5ee 关闭老爷
3deb0e4 add 3
c755be6 new 
889b027 + 聊天窗口右侧公告样式.
896ccee 仓鼠日志
be3b53a Merge remote-tracking branch 'origin/dev' into dev
5921f2d 移动端

上面是一部分log。比如,我刚错误提交了关闭老爷(643a5ee)功能,这一步,我想撤销,怎么办呢?可以用上面的哪个命令呢?其实2个都可以用。

git reset 3deb0e4 或者 git reset HEAD~1把指针移动643a5ee到的上一次提交,就表示还原了。

或者git revert 643a5ee 表示撤销这次提交。也可以。

git reset 还原已经commit的用法

git reset 命令的使用最多的2种形式是:

git reset commitId
git reset –hard commitId

不加任何参数 表示是软重置,它会改变本地HEAD的指针, 指向3deb0e4, 并把643a5ee这一步的提交,还原到工作区,我们可以再加工或者其他的操作。所以它是非常安全的。

--hard commitId 强制移动指针到这个分支,会销毁它前面的所有的信息,本地也没有了,是蛮危险的一种行为。

我们分别试一下:

 ➜  shop git:(master) git reset 3deb0e4
Unstaged changes after reset:
M   1.php
➜  shop git:(master) ✗ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   1.php

no changes added to commit (use "git add" and/or "git commit -a")
➜  shop git:(master) ✗

它提示我们:
Unstaged changes after reset:
M 1.php

表示,643a5ee的提交已经被放入到工作区了。所以,我们可以重新修改后再提交。

我们再来试一下 --hard模式。

➜  shop git:(master) git log --oneline
a98bbd3 add 4
5ca7693 add 3
c755be6 new
➜  shop git:(master) git reset --hard 5ca7693
HEAD is now at 5ca7693 new
➜  shop git:(master) git status
On branch master
nothing to commit, working directory clean
➜  shop git:(master)
➜  shop git:(master) git log --oneline
5ca7693 add 3
c755be6 new

可以看出,我们,加上--hard后,它把本地的修改也给还原了,所有要慎重加。

git reset命令还原暂缓区的用法

就是把暂缓区的修改还原到工作区,加入到暂缓区就是你已经使用git add命令了,那么用这个命令也可以的。

➜  shop git:(master) vi 1.php
➜  shop git:(master) ✗ git add --all
➜  shop git:(master) ✗ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   1.php

➜  shop git:(master) ✗

上面命令修改后加入到了暂缓区,那么我们就可以使用它提示的命令将这个文件或者所有的文件全部移除暂缓区到工作区:

➜  shop git:(master) ✗ git reset HEAD
Unstaged changes after reset:
M   1.php
➜  shop git:(master) ✗ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   1.php

no changes added to commit (use "git add" and/or "git commit -a")
➜  shop git:(master) ✗

上面就成功将缓存区的修改还原到了工作区了。

总结下:

如果暂缓区是干净的,可以用 git reset HEAD~ 或者 {id} 还原到上一次 或者 几次前 的修改,加 –hard 强制还原。

如果暂存区有数据没有commit,用git reset HEAD {file} 来移除暂缓区。

git revert 命令移除某一次提交

git revert命令就温和的多,它仅仅是移除这个commit,而不是将指针移动到这个分支,所以这个命令常常用来会滚操作。

我们继续实验:我们继续修改这个文件,

~ shop git:(master) git log --oneline
79a2501 add 5
f56215c add 4
5ca7693 add 3
c755be6 new

我现在想将5ca7693 add 3这个修改移除掉,注意,它在log的中间,用git reset命令会不太好使。那么用git revert就很好了。

➜  shop git:(master) git revert 5ca7693

Revert "add 3"

This reverts commit 5ca76938b4ec5313aa7a3260bcdb802d3a767e73.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
#       modified:   1.php
#

确定推出后,就会成功了:

shop git:(master) git revert 5ca7693
[master 39268a5] Revert "add 3"
 1 file changed, 1 deletion(-)

我们看了下内容,确实将3给删除掉了,而且还重新提交了一次

➜  shop git:(master) git log --oneline
39268a5 Revert "add 3"
79a2501 add 5
f56215c add 4
5ca7693 add 3
c755be6 new

git fetch

 download new branches and data from a remote repository.
 可以git fetch [alias]取某一个远程repo,也可以git fetch --all取到全部repo
 fetch将会取到所有你本地没有的数据,所有取下来的分支可以被叫做remote branches,它们和本地分支一样(可以看diff,log等,也可以merge到其他分支),但是Git不允许你checkout到它们. 

git pull

 fetch from a remote repo and try to merge into the current branch.
 pull == fetch + merge FETCH_HEAD
 git pull会首先执行git fetch,然后执行git merge,把取来的分支的head merge到当前分支.这个merge操作会产生一个新的commit.    
 如果使用--rebase参数,它会执行git rebase来取代原来的git merge.

http://blog.csdn.net/hudashi/article/details/7664460

http://hittyt.iteye.com/blog/1961386

http://www.douban.com/note/189603387/

相关文章推荐

git命令之git fetch的用法

 而理解 fetch 的关键, 是理解 FETCH_HEAD. 这里需要解释下什么是FETCH_HEAD?? FETCH_HEAD指的是: 某个branch在服务器上的最新状态'. ...
  • sidely
  • sidely
  • 2014年10月16日 09:54
  • 52466

git各种状态下撤销修改的方法

使用git时会出现各种各样的问题,下面是几种情况下怎么反悔的操作 一,未加入缓存区,撤销文件修改      git checkout -- file 二,已加入缓存区,撤销文件提交      git ...
  • lkl713
  • lkl713
  • 2015年04月03日 11:12
  • 3376

Git pull 后恢复到原来版本

git pull 恢复 1、git reflog master 2、git reset --hard (恢复到之前位置) git reset --hard master@{1}...

git revert和git reset的区别

原文:http://blog.csdn.net/koffuxu/article/details/6731876 git revert 是撤销某次操作,此次操作之前的commit都会被保留 git r...
  • hudashi
  • hudashi
  • 2012年06月14日 20:56
  • 149976

git 回滚错误的pull origin操作

git remote show origin   其中的origin表示自己的项目根目录了。 $ git remote show origin * remote origin Fetch URL:...
  • arkblue
  • arkblue
  • 2013年08月03日 22:03
  • 17221

git reset操作:回滚pull和merge

回滚merge和pull操作  引用 $ git pull                         (1)  Auto-merging nitfol  CONFLICT (co...
  • ytzys
  • ytzys
  • 2014年09月29日 19:42
  • 4310

git fetch拉取他人分支

git fetch拉取他人分支 有时候我们需要得到其它人的代码仓库,将别人(未push到远程仓库上的)修改与自己的修改进行合并,或者查看别人某个分支下的代码(而不真正切换别人的分支),本文介绍了...

git(三) git fetch 妙用

git fetch从远程分支拉取代码。 fetch常结合merge一起用,git fetch + git merge == git pull 一般要用git fetch+git merge,因为g...

Git多用Fetch少用Pull

Git 少用 Pull 多用 Fetch 和 Merge 本文有点长而且有点乱,但就像Mark Twain Blaise Pascal的笑话里说的那样:我没有时间让它更短些。在Git的邮...

如何撤销git pull

如题如何撤销git pull 声明:本文为作者自身实践,如因此操作导致了其他问题概不负责。场景, 我们在本地branch A上修改了,然后commit and push(假设commit后的id 是...
  • russle
  • russle
  • 2016年08月31日 19:01
  • 4966
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:git 使用(9)git pull和git fetch、git reset 和 git revert 的区别用法
举报原因:
原因补充:

(最多只允许输入30个字)