-
-
Notifications
You must be signed in to change notification settings - Fork 6
git show branch 详解
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就出现了稍微复杂一点的输出。里面有*和!,还有–,这都是什么乱七八糟的阿?!
1、你会看到两次git-show-branch之后的!和* 调换了位置,对,这是因为我切换分支所造成的。所以可以断定!和*是和当前分支有关的。
- (星号)代表HEAD所指的分支,
- 而其他分支则会标识为!(叹号)。
这两个符号有些特别,你可能已经观察到了! 和 * 是有缩进区别的,这是因为!和* 不仅要标识本行是否为“当前分支”,而且还用来标识一列。
比如说,
- !标识第一列,也就是说下面的输出中只要在第一列有符号的,都是在指示master分支的;
- 而*在第二列,只要下面的输出中有符号的,都表示在指示wukong分支。
(OK,好好观察观察,自己做做实验,这个知识点不搞定,后面的内容可看不懂哦)
2、你会看到“- -”符号,这个符号只是一个分隔符,用于更清晰的区分各个列用的,没有什么特殊意义的。
“- -”符号上部内容主要用于显示分支列表,而“- -”下部的内容为分支commit的关系。
3、“- -”下部的内容
+(加号)表示所在分支包含此行所标识的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