看日记学git

《看日记学git》之二十七

本原创文章属于《Linux大棚》博客,博客地址为http://roclinux.cn。文章作者为rocrocket。
为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅。

===

[正文开始]

在经过了数天的总结、复习之后,我们到了继续前进的时候了。

在本次讲解中,我们重点关注git-show-branch这个命令。它和git branch不一样,后者的功能是列出当前所有的分支。

我们先来看看这两个命令的不同之处:

[rocrocket@wupengchong cloneteset]$ git show-branch
* [master] 1
 ! [wukong] 5
--
+ [wukong] 5
+ [wukong^] bajie
+ [wukong~2] 2
*+ [master] 1
[rocrocket@wupengchong cloneteset]$ git branch
* master
wukong
[rocrocket@wupengchong cloneteset]$

显而易见,git show-branch会输出很多很晦涩的东西。好,下面我们就通过一个实例来搞定这个晦涩的命令!
首先新建一个git仓库,如下:

[rocrocket@wupengchong showbranch]$ cat roc.c
int main()
{
printf("Firstly");
return 0;
}
[rocrocket@wupengchong showbranch]$ git branch
* master
[rocrocket@wupengchong showbranch]$ git show-branch
[master] Firstly
[rocrocket@wupengchong showbranch]$ git log
commit b11be45d63226eac8b89fa05119d4282cfd73df2
Author: rocrocket ;
Date:   Fri Nov 14 12:00:18 2008 +0800

Firstly
[rocrocket@wupengchong showbranch]$

可以看到,我只提交了一次commit,在git show-branch时会显示分支名称和其开发日志的内容。(我的第一个commit的开发日志就是一个单词”Firstly”)
之后,我们修改一下roc.c文件再提交一次,开发日志设定为”Secondly”:

[rocrocket@wupengchong showbranch]$ cat roc.c
int main()
{
printf("Firstly");
printf("Secondly");
return 0;
}
[rocrocket@wupengchong showbranch]$ git log
commit 5102e1a2c812dfa6539d77f1ecede46faaa26c4f
Author: rocrocket ;
Date:   Fri Nov 14 12:04:54 2008 +0800

Secondly

commit b11be45d63226eac8b89fa05119d4282cfd73df2
Author: rocrocket ;
Date:   Fri Nov 14 12:00:18 2008 +0800

Firstly
[rocrocket@wupengchong showbranch]$ git show-branch
[master] Secondly
[rocrocket@wupengchong showbranch]$

如上可见,此时git show-branch输出的是master分支第二次commit的开发日志,而第一次的”Firstly”并没有再出现了。
下面,我们新建一个分支,老规矩,叫做wukong:

[rocrocket@wupengchong showbranch]$ git branch wukong
[rocrocket@wupengchong showbranch]$ git branch
* master
wukong
[rocrocket@wupengchong showbranch]$ git show-branch
* [master] Secondly
 ! [wukong] Secondly
--
*+ [master] Secondly
[rocrocket@wupengchong showbranch]$ git checkout wukong
Switched to branch "wukong"
[rocrocket@wupengchong showbranch]$ git-show-branch
! [master] Secondly
 * [wukong] Secondly
--
+* [master] Secondly
[rocrocket@wupengchong showbranch]$

看,这时再git show-branch就出现了稍微复杂一点的输出。里面有*和!,还有–,这都是什么乱七八糟的阿?!
如果你仔细观察了上面的输出信息,你会看到两次git-show-branch之后的!和*调换了位置,对,这是因为我切换分支所造成的。所以可以断定!和*是和当前分支有关的。
不卖关子了,告诉你:*(星号)代表HEAD所指的分支,而其他分支则会标识为!(叹号)。这两个符号有些特别,你可能已经观察到了!和*是有缩进区别的,这是因为!和*不仅要标识本行是否为“当前分支”,而且还用来标识一列。比如说,!标识第一列,也就是说下面的输出中只要在第一列有符号的,都是在指示master分支的;而*在第二列,只要下面的输出中有符号的,都表示在指示wukong分支。(OK,好好观察观察,自己做做实验,这个知识点不搞定,后面的内容可看不懂哦)
接下来,你会看到“–”符号,不要紧张,这个符号只是一个分隔符,用于更清晰的区分各个列用的,没有什么特殊意义的。呵呵,草木皆兵可不好…
我现在要告诉你,“–”符号上部内容主要用于显示分支列表,而“–”下部的内容为分支commit的关系。(看不懂没关系,看完全文再回来品品,保你能看懂)
了解了“–”上面的内容了,下面来研究“–”下面的内容,这里面内容比较花哨,又有空格,又有加号,其实还会有减号呢!
开门见山:
+(加号)表示所在分支包含此行所标识的commit
(空格)表示所在分支不包含此行所标识的commit
-(减号)表示所在分支是经过merge得到的,而所在行的内容即是merge的基本信息。
*(星号)表示如果需要在某列标识+(加号),且此列为当前分支所在列,那么则将+(加号)转变为*(星号)。
我们来分析一个例子:

[rocrocket@wupengchong showbranch]$ git-show-branch
* [master] merge
 ! [wukong] wukong:Thirdly
--
-  [master] merge
*+ [wukong] wukong:Thirdly

可以看到:
结论一:当前分支为master分支,而wukong分支并非当前分支。
结论二:master分支的HEAD所指向的commit的开发日志的首行为“merge”字符串,而wukong分支的HEAD所指commit的开发日志的首行信息为“wukong: Thirdly”
结论三:根据“-”符号可以知道,master分支的HEAD的最近一次commit是由merge得到的,且此次merge后commit的信息为“merge”字符串。你可能看到了在“-”后面还有一个空格,这说明当前行所指的这次commit对wukong分支(第二列)是没有影响的,所以用“空格”表示。
结论四:根据“*+”所在列可知,当前行的commit影响范围波及到了master分支和wukong分支,也就是说此次commit在两个分支都有效。这是为什么呢?很简单,这是merge的力量,这说明我在wukong分支的这一次commit(其开发日志的后行为“wukong: Thirdly”)被merge到了master分支。
ok~ 看懂这几段后,你基本上已经掌握了git-show-branch命令了!
最后给你一个例子,来分析分析,看看到底发生了什么:

[rocrocket@wupengchong showbranch]$ git-show-branch
! [bajie] shaseng:Secondly
 * [master] Fourth
  ! [shaseng] shaseng:Secondly
   ! [wukong] shaseng:Secondly
----
 -   [master] Fourth
+*++ [bajie] shaseng:Secondly

over~

11条评论

  1. 为什么master这一行,前面都是加号(×其实也是加号,只不过因为这列代表的分支是当前head所指向的分支)

    加号的话,git show-branch显示的时候,如果这条commit在这个分支中的时候,才有加号的

    问题是,这个commit是在master主干的分支上的

    那么在表示其他分支的列中,应该是空格,而不是加号

    为什么master分支前面都是加号呢,不理解?

  2. 我看那个* ! – +就已经糊了~~~
    搞死了,看不懂是什么意思。
    总觉得您的语句没有写通~~~

  3. 非常感谢,使用git一段时间了,总是搞不懂git-show-branch这条命令输出信息
    前边的各种符号含义,今天看完你的这篇文章终于搞明白了,再说一声感谢你!!!

  4. wordpress的缩进功能还是有缺陷。
    不过基本上不会影响文章的阅读。
    遇到实际例子的地方,如果能自己在终端执行一下,效果最好:)

发表您的评论

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