看日记学git

《看日记学git》之二十五

这次重点讲解git reset这条命令。这个命令主要是用在恢复代码上。当你发现自己编写的一段已提交的代码是错误的,那么你就会用到git reset了!

1 讲解git reset –soft

2 讲解git reset –hard

3 讲解git reset –mixed

4 讲解git reset

5 讲解git reset —

开始:

1 讲解git reset –soft

[rocrocket@wupengchong ~]$ mkdir git25
[rocrocket@wupengchong ~]$ cd git25/
[rocrocket@wupengchong git25]$ vi roc.c
[rocrocket@wupengchong git25]$ cat -n  roc.c
1  #include<stdio.h>
2  int main()
3  {
4          printf(“He is a young man.\n”);
5          return 0;
6  }
[rocrocket@wupengchong git25]$ git init
Initialized empty Git repository in .git/
[rocrocket@wupengchong git25]$ git add .
[rocrocket@wupengchong git25]$ git commit -m “1”
Created initial commit a2909db: 1
1 files changed, 6 insertions(+), 0 deletions(-)
create mode 100644 roc.c
[rocrocket@wupengchong git25]$ git log
commit a2909db30720fe7bb85724fdfad89b5ffd280b05
Author: rocrocket <wupengchong@gmail.com>
Date:   Wed Oct 15 08:46:20 2008 +0800

1
[rocrocket@wupengchong git25]$ vi roc.c
[rocrocket@wupengchong git25]$ cat -n roc.c
1  #include<stdio.h>
2  int main()
3  {
4          printf(“He is a young man.\n”);
5          printf(“He is 24 years old.\n”);
6          return 0;
7  }
[rocrocket@wupengchong git25]$ git commit -a -m “2”
Created commit 5fcb5ab: 2
1 files changed, 1 insertions(+), 0 deletions(-)
[rocrocket@wupengchong git25]$ git log
commit 5fcb5abeee4dea39da8946bd39c6daea19977558
Author: rocrocket <wupengchong@gmail.com>
Date:   Wed Oct 15 08:47:10 2008 +0800

2

commit a2909db30720fe7bb85724fdfad89b5ffd280b05
Author: rocrocket <wupengchong@gmail.com>
Date:   Wed Oct 15 08:46:20 2008 +0800

1
[rocrocket@wupengchong git25]$

到目前为止,我们建立了一个git仓库,并进行了两次commit。

此时,我发现我的commit是错误的,此人不是24岁,而是25,我想撤销第二次commit。看看用–soft会是什么效果:

[rocrocket@wupengchong git25]$ git reset –soft HEAD^
[rocrocket@wupengchong git25]$ git log
commit a2909db30720fe7bb85724fdfad89b5ffd280b05
Author: rocrocket <wupengchong@gmail.com>
Date:   Wed Oct 15 08:46:20 2008 +0800

1
[rocrocket@wupengchong git25]$ git diff
[rocrocket@wupengchong git25]$ git diff –cached
diff –git a/roc.c b/roc.c
index b089322..ee25766 100644
— a/roc.c
+++ b/roc.c
@@ -2,5 +2,6 @@
int main()
{
printf(“He is a young man.\n”);
+       printf(“He is 24 years old.\n”);
return 0;
}
[rocrocket@wupengchong git25]$ git diff HEAD
diff –git a/roc.c b/roc.c
index b089322..ee25766 100644
— a/roc.c
+++ b/roc.c
@@ -2,5 +2,6 @@
int main()
{
printf(“He is a young man.\n”);
+       printf(“He is 24 years old.\n”);
return 0;
}
[rocrocket@wupengchong git25]$ cat -n roc.c
1  #include<stdio.h>
2  int main()
3  {
4          printf(“He is a young man.\n”);
5          printf(“He is 24 years old.\n”);
6          return 0;
7  }
[rocrocket@wupengchong git25]$

你如果一步一步按照我的设计运行了上面的命令,你会发现git reset之后,git diff返回空,而git diff –cached和git diff HEAD会返回有效信息。这说明使用–soft选项后,只回退了commit的信息,而不会回复到index file一级。哈哈,这就明了了!你如果想撤销commit,并且只回退commit的信息,那么就用–soft吧!

而且你可以观察到git reset的意思是“撤销哪个位置”,。也就是说代码管理者需要在后面的参数中指定一个之前的commit位置。如上面提到的HEAD^。

2 讲解git reset –hard

有了–soft的试验思路,我想你也应该知道如何测试–hard了。有意思的工作留给你去自己完成吧。我只说结论:

–hard会完全撤销一个commit,彻底的回复到上一次commit的状态。连working tree的源代码也会完全倒退到上次commit之时的状态。所以使用–hard后,git diff,git diff –cached和git diff HEAD都会返回空。

有了这个–hard好工具,你可以这样做:在当前的current working tree中修改了代码,你可以选择git add或者不add,然后使用git reset –hard HEAD命令就可以恢复到修改之前的最初状态了。你修改的代码和git add的信息都会被丢弃。这个用法记住它,早晚你会用到它。但往往你会武断的认为git reset只能恢复到之前的commit状态,但你往往想不到git reset还可以恢复到当前的HEAD所指定的commit状态。

3 讲解git reset –mixed

–mixed选项会撤销最近的一次commit,只保留working tree的源代码级的修改,而index file和commit都会回复到上一次commit的状态。所以使用–mixed后,git diff和git diff HEAD会有有效信息的输出,而git diff –cached会输出空。

4 讲解git reset

我只需要告诉你–mixed是git reset的默认选项。你应该知道了,git reset和git reset –mixed效果是完全一样的。

5 讲解git reset —

如果你想从index file中删除一个已登记的文件,那么就用这个命令。

比如,我想删除index file里登记的roc.c,那么就$ git reset — roc.c就可以了!

这个功能似乎很奇怪,什么时候会用到呢?哦!是这样,如果你刚刚git add了一个文件到index file里,但是你突然发现这是错误的,那么就要用到git reset –喽!

===
如果你对git感兴趣,请继续阅读:

《看日记学git》之二十六

《看日记学git》系列文章优化中

《看日记学git》系列文章汇总

over~

3条评论

  1. 现在看到25了
    #2和#5讲到的技巧都很受用,以前都不知道也没用过
    这两个技巧,谢谢了…
    再看四篇文章,今天就可以把目前的
    都看完了,写的真的很精彩,以后继续关注,而且学到的
    东西还在慢慢消化当中…

发表您的评论

请您放心,您的信息会被严格保密。必填项已标识 *