Blu*_*lue 14 git merge git-log
我正在执行以下命令:
git log --name-only –pretty="format:%H %s" -- *.sql --grep="JIRA-154"
Run Code Online (Sandbox Code Playgroud)
返回格式的结果:
[commitid1] [comment]
path/to/file1/file1.sql
path/to/file2/file2.sql
path/to/file3/file3.sql
[commitid2] [comment]
path/to/file2/file2.sql
path/to/file4/file4.sql
Run Code Online (Sandbox Code Playgroud)
输出被重定向到一个文件,格式正是我正在寻找的,但合并提交是一个问题.从未列出作为合并的一部分而更改的文件.相反,我最终会得到以下内容:
[commitid3] [merge comment]
[commitid4] [comment]
path/to/file3/file3.sql
Run Code Online (Sandbox Code Playgroud)
我显然在这里误解了一些东西,因为我希望看到合并期间发生变化的文件.有没有办法在输出中包含这些文件?
tor*_*rek 26
尝试将-m
选项添加到git log
选项中.这使得Git"拆分"每个合并,因此它会将合并两次,一次针对每个父级.没有这个或其他类似的选项,git log
找到合并,但后来根本看不到它们.
另外,正如ElpieKay评论的那样,你需要把它放在--grep=<regexp>
前面--
.编写"*.sql"
(即使用引号)以防止shell扩展星号本身也是一个好主意(细节因shell而异,取决于*.sql
当前工作目录中是否有任何文件).
正如Tim Biegeleisen所说,问题源于合并提交的性质.
通常,为了向您展示提交中的更改,Git分别运行一个简单的,其中和是提交的父级和提交本身.两者并以略微不同的方式和略微不同的情况下这样做.最明显的是默认情况下每次都会显示差异,但只有在给定时才会显示差异,或者是各种差异控制选项之一.git diff parent self
parent
self
git log
git show
git show
git log
-p
--name-only
一个合并提交是有两个提交1父母.这意味着,git log
和git show
将要运行2级 git diff
的命令.2 而事实上,git show
它运行两个diff文件,但当时在默认情况下,将他们变成一个组合差异,其中仅显示其合并提交的版本不同于这些文件都父母.但无论出于何种原因,默认情况下3 git log
不会这样做.
即使在git log
显示差异时,它在合并上表现得特别奇怪(我甚至可能会说很糟糕).虽然git log -p
还是git log --name-status
运行在常规(单)DIFF承诺,它不运行的差异都与多个可见父母提交,除非你把它强制.
使用-m
本身始终有效.这个标志主要用来告诉git log
(和git show
)以分手合并成多个独立的"虚拟提交".也就是说,如果提交中号是与家长合并P1和P2,当时参与比较的目的,至少,Git的作为,虽然有一个承诺MP1与父母P1,以及第二次提交MP2与父母P2.你得到两个差异(和diff头中的两个提交ID).
添加--first-parent
tell git log
来忽略合并的第二个(以及任何其他)父级,这使得它只有一个父级.这意味着git log
将不会跟随侧枝在所有.因此-m --first-parent
,如果您对合并的其他方面的历史不感兴趣,您可以使用.这会让你只针对第一个父元素进行单一差异,而不是每个父元素一个差异.
(哪个父母是第一个? 嗯,这是HEAD
你运行时的git merge
那个.这通常是提交的"主线",即"在你的分支上".但如果你的团队git pull
随便使用,你可能不想要忽略合并的另一面,因为git pull
将其他人的主线工作转变为"foxtrot合并"的小型分支机构.)
此外-m
,你可以提供-c
或--cc
(注意-c
有一个破折号,同时--cc
有两个4)git log
来生成组合差异,就像git show
.但是,与所有组合差异一样,这会忽略合并提交与父级之间匹配的文件.也就是说,再次给出相同的合并M,这次Git比较M对P1,M对比P2.对于任何文件F,其中M:F与P1:F或P2:F相同,Git根本不显示任何内容.
事实证明,这通常是你想要的.如果文件˚F在提交中号文件匹配˚F在两个母公司承诺之一,这意味着该文件的来源是父母.这一事实˚F在P1可能不匹配˚F在P2通常是不感兴趣:在任何改变˚F在任何P1或P2可能是一些的结果早在历史上的变化,而这也正是我们应该注意到它,而不是在合并中号.
无论如何,这是组合差异背后的逻辑.它并不适用于所有情况,这就是-m
存在的原因:将合并"拆分"为其组成部分.
1实际上是两个或两个以上,但"更多"是不寻常的; 大多数合并提交都有两个父母.具有两个以上父项的合并提交称为章鱼合并.
2这两个git log
和git show
有大部分git diff
建于他们,使他们实际上没有运行其他命令,但它的作品了相同的两种方式.
3我不知道原因,当我浏览git log
源代码时,我才了解到这种特殊行为,试图解释为什么git log --name-status
没有显示某些东西.
4这是因为--cc
是一个很长的选项,并且在GNU选项解析中,所有长选项都喜欢name-only
或cc
得到两个破折号,而所有短(一个字母)选项如p
获得一个破折号.