Git log显示合并分支的父级

时间:2014-01-20 12:53:38

标签: 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 checkout master
git merge childOfParentBranch --no-ff

现在我如何进行git日志,在那里我可以看到两个分支的名称?

有些事情:

*
|-Merged parentBranch and childOfParentBranch

或者:

*
|-Merged parentBranch 
|-Merged childOfParentBranch

修改 我添加了提交语句,因为缺少它们会导致误解。

我试图使用“git log”向我展示合并为master的所有分支名称。即使只有childOfParentBranch合并到master中,它也包括parentBranch的名称。如果我使用gitk进行操作,这些值很明显,但我需要使用“git log”来进行自动化。

亲切的问候 基督教

3 个答案:

答案 0 :(得分:3)

关于编辑:

尝试使用git log --graph --decorate(可能使用--oneline)和--all(所有分支,标签等),或者命名您关注的分支。请注意,分支名称(标签)可以随时删除或移动,因此您无法依靠附近的名称。

在移动或删除分支标签 之前,您可以看到哪些是"合并" (使用git branch --containsgit branch --merged指向或低于给定的提交ID。例如,给定一个如下所示的提交图,如图所示的四个分支标签表示提交GHFE

           G   <-- br1
          / \
A--B--C--D---H <-- br2
    \  \    /
     \  F--/   <-- br3
      \
       E       <-- br4

你可以跑,例如:

git branch --contains br1^   # br1^ identifies commit `D`

查看&#34;其提示提交的分支是指定提交的后代&#34;。这些是br1br2。换句话说,从br1开始,即G,我们可以向后走,到达D;从br2开始,即H,我们可以向后走,到达D。但是,从F开始br3开始,向后行走不会达到D,从E开始经过br4,向后行走也不会达到D 1}}。)

您还可以运行:

git branch --merged br2      # br2 identifies commit H

(如文档中所述)查找&#34;分支,其提示提交可从指定的提交&#34;中找到。这会打印br1br2br3。我们从H开始,沿着所有向后的路径行走。 H本身由标签br2标识,因此会打印br2。然后我们走了它的父母; H有三个:DGF(其中一个是&#34;第一个&#34;父级,但此处显示的图表并未说明我们哪一个,而git branch --merged git无论如何都不关心)。提交G是由名称br1标识的提交,因此打印br1。提交D未被任何内容识别。提案Fbr3标识。我们还会检查DF的父母:这些是C,然后是B,然后是A,然后就没有父母了。在这种情况下,它们都没有标签(但如果我们要添加一个指向,例如,提交Agit branch --merged也会打印该标签。

(还有git branch --no-merged应用于提交H,在这种情况下会打印br4。它只是--merged的反面:print分支标签,如果它们指向从给定起点可到达的提交。)


分支实际上并没有父/子关系(尽管如果你愿意,你可以将它们读成存在 - 但这里的重点是你必须从图中发明它们)。此外,您建议的命令序列不会发生任何事情。


让我更具体一点,因为&#34;分支&#34;可以参考两个不同的概念。提交有向图形成了提交链,而实际提供&#34;提示&#34;的分支名称;某些分支,例如experimentmasterfeature

     C--D--E   <-- experiment
    /
A--B--F--G     <-- master
    \
     H--I      <-- feature

名称experiment指向的分支以提示E结束。该分支由提交AE组成。分支名称(单个)提交E。但我们也谈论&#34;分支&#34;从AE包括在内。

同时,名称master指向的分支以提示G结束。该分支由ABFG组成;但分支只是名称 G。和以前一样,&#34;分支&#34;意味着两种不同的东西,取决于我们想要它的意思:尖端,或从尖端开始并向后工作形成的线。

那就是说,如果你在&#34; on&#34;分支master并执行两个git checkout -b命令,创建两个新的分支标签。默认情况下,这些标签指向相同的提交为master。所以,如果你从这开始:

A--B--F--G   <-- HEAD=master

然后你跑:

$ 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

所有三个标签都指向相同的提示提交(在这种情况下为G)。使用git log --decorate查看标签。 (根据需要,我也喜欢使用git log --oneline --graph --decorate,有或没有--all。另外,我将HEAD=放在上面的图表中,告诉你哪个分支是&#39} #34;上&#34;。)

如果您再尝试序列:

$ git checkout master
Switched to branch 'master'
$ git merge br1 --no-ff

你得到了各种各样的投诉:

Already up-to-date.

因此,没有发生任何事情。

让我们通过向其添加空提交,使br1成为您可以合并的内容:

$ git checkout br1
Switched to branch 'br1'
$ git commit --allow-empty -m 'empty commit'
[br1 add230d] empty commit

图表现在看起来像这样(我在这里忽略experimentfeature,并在br1下方随意绘制master

A--B--F--G      <-- master, br2
          \
           J    <-- HEAD=br1

(因为新添加的提交会导致标签br1移动到指向它。)

现在可以回到master并进行合并:

$ git checkout master
Switched to branch 'master'

第一步只是移动HEAD标签:

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.

merge向两个父母添加一个新的提交,指向HEAD分支的master分支。像往常一样,标签master移动以指向新提交。这使得显示br2点的位置变得有点困难,因此我将绘制更长的ASCII箭头:

         .--------- br2
         |
         v
A--B--F--G---K  <-- HEAD=master
          \ /
           J    <-- HEAD=br1

请注意,分支br2G结尾。这是分支br2的提示,因此G a&#34; tip&#34;提交,即使它也是merge-commit K的父级。


这里有一堆关键的外卖消息:

  • 分支名称(我们有时称之为&#34;分支&#34;)提供分支的提示
  • 分支本身由提交图形成,并在我们解释它们时按照我们想要的那样长(或短)运行。合并后你可以把分支视为&#34;伸出&#34;的部分,即C之后的顶部的东西:

         o--o        "branch"
        /    \
    B--C---o--M--o   "main line"
    

    或者您可以将其视为整个事情,包括提交BC

  • 添加新提交始终会导致某些分支标签向前移动。通常HEAD命名一个分支,该分支标签是前进的。 (使用&#34;分离的HEAD&#34;,HEAD文件提供原始提交SHA-1,并且HEAD本身被修改为包含新的原始提交SHA-1。)
  • 合并只会创建一个包含两个(或更多)父项的新提交,如上面的M。不可能将提交与自身合并,因为合并提交必须至少有两个不同的父提交(这就是使它成为合并提交的原因!)。

上面没有显示,但也是一个关键概念:&#34;第一个父母&#34;合并的是#34;在分支上的提交&#34;在合并之前(假设HEAD命名为分支),所有其他父项是&#34;合并在&#34;中的提交。 Git本身并不关心合并的完成方式 - 标签可以更改或删除 - 但是这可以让你(用户)为自己或后来进入的任何其他人留下面包屑的痕迹完成。

答案 1 :(得分:1)

命令git log --pretty=format:"%h - %an, %ar %s" --graph可以显示已合并的日志

显然你可以改变格式。在提供的示例中

  • %h - 缩写提交哈希
  • %an - 作者姓名
  • %ar - 作者日期,亲属
  • %s - 主题

实施例

$ 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 

答案 2 :(得分:0)

你可以做到

 git log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%Creset' --abbrev-commit