如何使用git log命令获取合并文件列表以及GIT分支中的其他提交?

时间:2016-12-13 05:20:12

标签: git github git-log

如何使用git log命令在GIT分支中获取合并文件列表以及其他提交?例如,下面给出了示例命令,

git log --after =“2016/11/29”--before =“11/20/2016”--pretty ='format:%cd%h' - name-status --date =短本地

1 个答案:

答案 0 :(得分:1)

来自评论:

  

合并文件表示通过合并(来自其他分支)的提交。

所以,你真正想要的是从第二个到 n 找到可达的提交第三次合并提交的父母 M ,不包括从 M 的第一个父级可以访问的所有提交。

普通合并提交有两个父项M^1M^2(此语法来自gitrevisions)。因此,如果合并提交M包含99个父项,则它们为M^1M^2M^3,依此类推,直至M^99。我们使用^(帽子或插入符号)后跟一个数字 N ,在任何提交说明符之后编写,说" N 该提交的父母"。 commit-specifier通常只是一个原始哈希(从git log输出):face0ff

排除提交,我们会在其前面添加相同的^(帽子或插入符号)字符。如果M有99个父母,我们会写^M^1 M^2 M^3 M^4 ... M^99。但目前,我们可以假设两个父母,而不必一直计算到99。

因此,我们只需找到--since的哈希ID - 而不是--until--after(又名--beforeM),而不是face0ffgit log [options ...] ^face0ff^1 face0ff^2 39;结果说它毕竟是M^@并运行:

^M^1

(有一种特殊的,更通用的语法,即使对于Git&#39;章鱼合并也可以使用#34;就像99-父母一样:我们写*来选择所有这些语法然后,为了排除第一个,我们添加...--o--*--o---------X <-- develop \ A--B--C--D--E <-- feature 。可以排除我们已经包含的内容:排除最终覆盖。)

这是如何以及为何起作用

给出一系列提交(左侧较旧的提交,右侧较新,并在存储库中显示两个分支名称,并且我已经给出了特别有趣的提交字母名称或develop标记):

feature

我们将在分支...--o--*--o---------X--M <-- develop \ / A--B--C--D--E <-- feature 上创建一个新的合并提交,它会引入分支develop独有的五个提交:

feature

之后我们可能会或可能不会在...--o--*--o---------X--M--o--o <-- develop \ / A--B--C--D--E 上提交更多提交内容,甚至可能会删除分支名称 A

E

提交本身 - developdevelop - 永久保留在图表中,受M名称保护(并且可访问),因为我们可以从M向后工作找到X*两个父母。

当我们进行合并时,任何合并的第一个父项始终是 分支的提示。在这种情况下,最重要的是提交*。所以我们毕竟对第一个父母不感兴趣;我们想要第二个父。 1

现在,请注意提交A。这(显然,从图的可视化)两个子分支分开的点。关于提交E的特别有趣的事情是它位于两个分支上。即使之前我们制作也是如此合并提交。 2 之后仍然如此,但之后我们进行提交,合并导致提交develop*在分支上A-B-C-D-E也是!也就是说,提交* - 和之前的总是在该分支上,但提交develop&#34;加入&#34;一旦我们合并了。他们现在在两个分支上,就像在合并之前提交M一样。

如果您愿意,您可以将提交(包括合并提交)视为铁路线路上的停靠点,并且轨道仅以一种方式运行:从今天到过去。如果您在X的顶端登上火车,当您到达铁路站E时,您可以选择:直接返回&#34;到E,或者去&#34;向下和向后&#34;到D。如果您转到A,您将可以通过X到达*栏杆,但如果您返回git log,则会跳过这些站点。不管你走哪条路,如果你继续,你最终会到达铁路站M

*的工作方式是“走出轨道”#34;从今天回到过去,向您展示每个&#34;铁路站点&#34; (承诺)一路走来。当它到达像git log这样的分支时,它需要两个路径(并以某种顺序 3 显示它们两者)。最终叉子重新加入(在提交M^1)并且它可以返回显示沿一条路线而不是两条或更多路线的停靠点。

但是,如果您告诉M^1停止向您显示某些提交,它(当然)将停止显示这些提交。这是一个棘手的部分:它不仅停止那些提交,而且所有早期的提交。所以我们用它。我们说:&#34;只要您提交了^M^1本身提交 git log的提交 ,停止遍历 历史记录。&#34;

因此,*是一种告诉M^2的简单方法:&#34;不要告诉我提交git log或更早的内容。&#34;使用M^2告诉*:&#34;当你找到提交给我的时候,请从提交M^1查看。&#34;我们必须自己找到提交*:我们必须意识到从{{1}}最终到达 {{ 1}}。

此&#34;可达性&#34;想法是理解Git的关键。

1 如果这是一个章鱼合并 - Git调用任何与三个或更多父母的合并 - 我们大概也想要额外的父母。

2 这是关于Git的一个奇怪的事情。在其他版本控制系统(VCS)中,当您创建分支时,它会获得某种独特的唯一性,从那时起,在该分支上进行的新提交只能在该分支上进行。即使在合并之后,在其他VCS中仍然存在:只有在某个特定分支上进行的提交才会在该分支上进行;那些提交始终在该分支上。这在Git中并不正确,因为在Git中,我们可以移动分支名称,甚至完全删除它们。提交本身保持不变,但名称改变了!

3 你应该立即问:等待,什么订购?但答案必须转到其他地方。我在这里要说的是,排序由更多选项控制。