您无法使用您显示的结构获得您想要的日志结果(git log --merges master
会做的)。将为您提供所需日志的结构打败了这一点。最后,这是一种弄巧成拙的 Git 工作方式。
愿望是能够奔跑git log master
并且只看到压缩的提交。这行不通。 Git 不知道某些提交的目的是master
有些是为了development
。让我们看看建议的结构。
A - E - I [master] [development]
\ / \ /
B - C - D F - G - H
在此刻,master
and development
指向同一个提交。就 Git 历史而言它们是相同的。分支只不过是指向提交的标签。提交不记得他们提交到哪个分支. git log master
and git log development
将生成相同的日志,显示从 A 到 I 的所有提交。E 和 I 压缩的提交日志将是多余的。
You can得到你想要的git log --merges master
(or development
)仅显示合并提交,但这会显示any合并提交,即使是作为其中一部分完成的提交development
。所以它实际上不起作用。
整个想法不必要地复杂,请继续阅读。
要获得您想要的日志结果,您必须像这样打破两个分支之间的关系。
A - E - I [master]
\
B - C - D - F - G - H [development]
你可以以某种方式让它发挥作用,但没有意义。git log master
包含所有相同的日志消息,因此它只要git log development
,但它们会被粉碎在一起。你不能使用git log master
进行代码考古(即“为什么这一行是这样写的”),因为所有更改都被整合到一个差异中,使得将一行更改与特定提交消息关联起来变得更加困难。自有历史以来master
and development
是分离的,没有办法确保开发中的所有内容都成为主控,反之亦然(例如,主控的热修复)。
git log master
提供信息较少 than git log development
这是更难理解. master
与 没有任何关系development
并失去保留合并历史记录的所有好处。维护这种复杂的设置是没有意义的。
相反,使用git merge --no-ff
合并feature分支(不是一个连续的“发展”分支)并保留分支历史以便于考古。
G - J [feature/tacos]
/
A - E - K [master]
\ / \ /
B - C - D F - H - I
E 和 K 是正常的合并提交,由git merge --no-ff
。没有连续的development
分支,由功能分支处理。功能分支是一次性的,合并后就会被删除。有关功能分支的信息保留在合并提交中,并且git merge --no-ff
保证分支结构被保留。feature/tacos
是一个用于尚未合并的 tacos 的功能分支。
git log --graph --decorate master
将显示 master 的完整历史记录,其中显示功能何时结束的合并提交,以及说明分支历史记录的行。 GUI Git 历史记录工具,例如GitX http://rowanj.github.io/gitx/是另一种以图表形式读取历史的方法。
最后,Git 历史是一个图表。如果你学会了如何使用该图,Git 的生活就会容易得多。如果你试图让 Git 历史线性化,就像一大堆煎饼一样,那么你就违背了 Git 的初衷,并为自己和其他人创造了额外的工作。