Git日志显示合并分支的父级
我有我的主分支机构,并且这样做:Git日志显示合并分支的父级,git,logging,Git,Logging,我有我的主分支机构,并且这样做: git checkout -b parentBranch git ... (do some commits) git checkout -b childOfParentBranch (this is while still on branch parentBranch) git ... (do some commits) 然后我合并,按照这个确切的顺序(重要): 现在,如何创建一个git日志,在其中可以看到两个分支的名称 大致如下: * |-Merged
git checkout -b parentBranch
git ... (do some commits)
git checkout -b childOfParentBranch (this is while still on branch parentBranch)
git ... (do some commits)
然后我合并,按照这个确切的顺序(重要):
现在,如何创建一个git日志,在其中可以看到两个分支的名称
大致如下:
*
|-Merged parentBranch and childOfParentBranch
或:
编辑:
我添加了commit语句,因为缺少它们会导致误解
我试图使用“git log”来显示合并到master中的所有分支名称。这包括父分支的名称,即使只有parentBranch的childOfParentBranch合并到master中。如果我使用gitk输入,这些值是清楚的,但是我需要使用“git log”来实现一些自动化
问候
克里斯汀你可以
git log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%Creset' --abbrev-commit
关于编辑:
尝试git log--graph--decoration
(可能使用--oneline
)和--all
(所有分支、标记等),或者命名您关心的分支。但是请注意,分支名称(标签)可以随时删除或移动,因此您不能指望名称粘在一起
但是,在移动或删除分支标签之前,您可以看到哪些标签与git branch--contains
和git branch--merged
进行了“合并”(指向或低于给定的提交ID)。例如,给定一个如下所示的提交图,其中有四个分支标签表示提交G
、H
、F
、和E
:
G <-- br1
/ \
A--B--C--D---H <-- br2
\ \ /
\ F--/ <-- br3
\
E <-- br4
查看“其尖端提交的分支是命名提交的后代”。这些是br1
和br2
。换句话说,从br1
开始,即G
,我们可以向后走到D
;从br2
开始,即H
,我们可以向后走到D
。但是,从F
通过br3
开始,向后行走不能到达D
,从E
通过br4
开始,向后行走也不能到达D
)
您还可以运行:
git branch --merged br2 # br2 identifies commit H
它(如文档所述)查找“其tip提交可从命名提交访问的分支”。这将打印br1
、br2
和br3
。我们从H
开始,沿着所有的路径向后走H
本身由标签br2
标识,因此打印br2
。然后我们走它的父母H
有三个:D
、G
和F
(其中一个是“第一个”父级,但此处显示的图表没有告诉我们是哪一个,对于git分支,合并后的git根本不在乎)。CommitG
是由名称br1
标识的提交,因此它将打印br1
。提交D
没有任何标识。提交F
由br3
标识。我们还检查D
和F
的父项:它们是C
,然后是B
,然后是A
,然后就没有更多的父项了。在本例中,它们都没有标签(但是如果我们添加一个指向,比如说,commitA
,git分支--merged
也会打印该标签)
(还有git branch--no merged
,应用于提交H
,在这种情况下会打印br4
。这与--merged
相反:如果分支标签指向从给定起点无法到达的提交,则打印分支标签。)
分支实际上没有父/子关系(尽管如果愿意,您可以将它们读入现实,但这里的要点是,您必须从图表中发明它们)。此外,您建议的命令序列不会导致任何事情发生
让我更具体一点,因为“分支”可以指两个不同的概念。有由提交定向图形成的提交链,还有实际上提供某个分支“提示”的分支名称,例如实验
,主
,或功能
:
C--D--E <-- experiment
/
A--B--F--G <-- master
\
H--I <-- feature
然后你跑:
$ git checkout -b br1
Switched to a new branch 'br1'
$ git checkout -b br2
Switched to a new branch 'br2'
那么你现在有:
A--B--F--G <-- master, br1, HEAD=br2
你会收到各种各样的抱怨:
Already up-to-date.
正因为如此,一切都没有发生
让我们通过向br1
添加一个空提交,使其成为可以合并的内容:
$ git checkout br1
Switched to branch 'br1'
$ git commit --allow-empty -m 'empty commit'
[br1 add230d] empty commit
图形现在看起来是这样的(我在这里忽略实验
和功能
,并在master
下面任意绘制br1
):
第一步只是移动头部
标签:
A--B--F--G <-- HEAD=master, br2
\
J <-- br1
merge
向HEAD
指向的分支(即master
)添加具有两个父级的新提交。标签master
会像往常一样移动到指向新提交的位置。这使得显示br2
点的位置有点困难,因此我将画一个更长的ASCII箭头:
.--------- br2
|
v
A--B--F--G---K <-- HEAD=master
\ /
J <-- HEAD=br1
或者你可以把它看作是一整件事,包括这里的提交B
和C
添加新提交总是会导致某些分支标签向前移动。通常,HEAD
命名一个分支,该分支标签是向前移动的。(对于“分离的头,HEAD
文件给出一个原始提交SHA-1,并且修改HEAD
本身以包含新的原始提交SHA-1。)
合并只是创建一个具有两个(或更多)父级的新提交,如上面的M
。不可能将提交与自身合并,因为合并提交必须至少有两个不同的父提交(这就是合并提交的原因!)
上面未显示,但也是一个关键概念:合并的“第一父级”是合并之前“在分支上”的提交(假设头命名为分支),所有其他父级都是“合并中”的提交。Git本身并不真正关心合并是以何种方式完成的——标签可以更改或删除,但这允许您(用户)为自己或他人留下面包屑痕迹
$ git checkout master
Switched to branch 'master'
$ git merge br1 --no-ff
Already up-to-date.
$ git checkout br1
Switched to branch 'br1'
$ git commit --allow-empty -m 'empty commit'
[br1 add230d] empty commit
A--B--F--G <-- master, br2
\
J <-- HEAD=br1
$ git checkout master
Switched to branch 'master'
A--B--F--G <-- HEAD=master, br2
\
J <-- br1
$ git merge --no-ff br1 -m 'merge br1'
Already up-to-date!
Merge made by the 'recursive' strategy.
.--------- br2
|
v
A--B--F--G---K <-- HEAD=master
\ /
J <-- HEAD=br1
o--o "branch"
/ \
B--C---o--M--o "main line"
$ git log --pretty=format:"%h - %an, %ar %s" --graph
* 084648c - XXX, 7 days ago Merge pull request #10 from XXX/oneplugin
|\
| * bb0f3cc - XXX, 7 days ago Switched to using one plugin only
|/
* 91e7ecd - XXX, 7 days ago Removed maven, using gradle instead
* ea6f1ce - XXX, 7 days ago Comments in build.gradle, added descriptions of tasks
* a6b69bb - XXX, 8 days ago Bumped version to 2.6
* 73ae95f - XXX, 8 days ago Merge branch 'master' of XXXXX
|\
| * 3e70f9a - XXX, 8 days ago Update README.md
* | 96913ce - XXX, 8 days ago Working gradle script to upload to OSS
|/
* 91ff7da - XXX, 8 days ago Bumped gradle to 2.6