看日记学git

《看日记学git》之十九

今天,我们重点来探讨一下git-diff的用法。

我们知道在git提交环节,存在三大部分:working tree, index file, commit

这三大部分中:

working tree就是你所工作在的目录,每当你在代码中进行了修改,working tree的状态就改变了。

index file是索引文件,它是连接working tree和commit的桥梁,每当我们使用git-add命令来登记后,index file的内容就改变了,此时index file就和working tree同步了。

commit是最后的阶段,只有commit了,我们的代码才真正进入了git仓库。我们使用git-commit就是将index file里的内容提交到commit中。

总结一下:

git diff是查看working tree与index file的差别的。

git diff –cached是查看index file与commit的差别的。

git diff HEAD是查看working tree和commit的差别的。(你一定没有忘记,HEAD代表的是最近的一次commit的信息)

为了更加清晰的阐释这个关系,我们来给出一个实例。

首先在目录test-git下建立一个c文件,内容如下:

[rocrocket@wupengchong test-git]$ cat main.c
#include<stdio.h>
int main(int argc,char *argv[])
{
printf(“hello.\n”);
printf(“he was a student.\n”);
return 0;
}
然后git init, git add . , git commit;

之后你将源代码修改为:

[rocrocket@wupengchong test-git]$ cat main.c
#include<stdio.h>
int main(int argc,char *argv[])
{
printf(“hello.\n”);
printf(“he was a student.\n”);
printf(“he was born in finland.\n”);
return 0;
}
此时你git add .,但不用执行git commit命令。

然后你再将源代码改为:

[rocrocket@wupengchong test-git]$ cat main.c
#include<stdio.h>
int main(int argc,char *argv[])
{
printf(“hello.\n”);
printf(“he was a student.\n”);
printf(“he was born in finland.\n”);
printf(“he is very clever!\n”);
return 0;
}
这个时候,你执行如下三个命令,仔细查看,我相信你会发现它们三个的区别的!

$ git diff

$ git diff –cached

$ git diff HEAD

讲到这里,你基本上对git diff命令有了比较深入的了解了,现在你再使用git status看看输出结果,样子大概是这样:

[rocrocket@wupengchong test-git]$ git status
# On branch master
# Changes to be committed:
#   (use “git reset HEAD <file>…” to unstage)
#
#    modified:   main.c
#
# Changed but not updated:
#   (use “git add <file>…” to update what will be committed)
#
#    modified:   main.c
#
很明显可以知道:

Changes to be committed表示已经存在于index file里,但尚未提交。

Changed but not updated表示在working tree已经做修改,但还没有使用git add登记到index file里。

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

《看日记学git》之二十

《看日记学git》之二十一

《看日记学git》之二十二

over~

1条评论

发表您的评论

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