Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git日志显示合并分支的父级_Git_Logging - Fatal编程技术网

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根本不在乎)。Commit
G
是由名称
br1
标识的提交,因此它将打印
br1
。提交
D
没有任何标识。提交
F
br3
标识。我们还检查
D
F
的父项:它们是
C
,然后是
B
,然后是
A
,然后就没有更多的父项了。在本例中,它们都没有标签(但是如果我们添加一个指向,比如说,commit
A
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