看日记学git

《看日记学git》之二十

今天,我们细细研究git branch和git checkout branchname这两个命令。

我们都知道git branch用于显示分支列表并且标识当前所在分支。这个命令比较简单。

git branch branchname 用于建立一个名字叫branchname的分支。但是你想过这个分支会根据什么来建么?是根据working tree?还是根据index file?还是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仓库里,working tree、index file和commit都是不同的。(可以用《看日记学git》之十九中介绍的方法来证实这一点。)

此时,我们运行创建分支的命令:

[rocrocket@wupengchong test-git]$ git branch experimental

此命令用来创建一个experimental分支,然后我们用git checkout experimental转移到新分支中。

这时,你使用cat main.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”);
printf(“he was born in finland.\n”);
printf(“he is very clever!\n”);
return 0;
}
答案揭晓了,原来commit/working tree/index file都会一起保持着,如果你在experimental分支中提交,那么这些修改都属于experimental分支了。

OK,今天就强调这一个概念:)记住哦,以后很有用的。

ps:如果你学有余力,我再告诉你一个信息。在你git branch一个新分支后,在目录.git/refs/heads目录下会多出一个新的文件,对应于新分支的名称,用来记录新分支下对应的“最后一次commit的信息”。

ps:如果你学有余力,我还要告诉你一个信息。当你git branch一个新分支并checkout转移到这个新分支后,.git目录下的HEAD文件会相应的改变,它的内容将对应着新分支下“最后一次commit的信息”。

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

《看日记学git》之二十一

《看日记学git》之二十二

《看日记学git》之二十三

over~

6条评论

  1. 有一个疑问,git branch 是用commit创建的分支,那是跟进当前所在分支的commit,还是默认使用master分支的commit状态来创建呢?

  2. 谢谢博主的git教程!
    不过这篇文章有错误,楼上两位已经指出,希望博主及时修改,以免误导新手!

  3. 楼上是对的。
    cat main.c 应该是:
    #include
    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;
    }

  4. 这里似乎不对吧,checkout 到另外分支的时候,working tree下面的文件如果没有commit应该会保持原有的内容不变,也就是最后一次修改的内容。

发表您的评论

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