我敢肯定,这个问题将以基于观点的观点结束,但是没有其他地方可以提出来了,所以在这里...
我正在尝试查看分支的历史记录,其中包括合并提交(特别是更改的内容),并且在这里找到了一个非常有用的帖子,其中显示了一个合并提交,告诉我使用git show --first-parent
仍然令我感到困惑的是,为什么--first-parent不是默认的git show,甚至为什么其他行为根本没有用。如果我在特定提交的特定分支上查看历史记录,那么我唯一想知道的就是该分支版本与上一个分支之间的区别。
当然,编写git命令的目的可能是为了方便作者,而作者却不愿接受最终用户的实际需求,但我怀疑这是有适当道理的。有人可以解释为什么,随着对git的深入了解,我可能不想一直使用--first-parent它。
嗯,我想这是不如你认为,因为行为--first-parent是不是您所描述的“唯一有用”的行为的行为。通常情况是相同的,但这取决于与存储库一起使用的分支/合并工作流。
(其中没有一个与“作者的便利性”有关,他们确实有能力将选项设为默认选项,如果这样做确实有意义)。
“第一父”确实不是意味着“从分支我的父母”。实际上,git中的任何内容均不表示“我所在分支的父级”,因为在git中,分支和提交之间的关系无法正常工作。如果可以从分支到达合并,则其所有父节点也是如此。通常,确实有一个父级曾经一次被当前分支直接指向。这是git既不了解也不在乎的事情。
“第一父级”仅表示“在合并的父级列表中首先记录的提交”,这与ref的当前状态无关。
现在,如果使用花瓷命令git merge生成合并提交,则当前签出的所有内容都将记录为第一个父项。如果执行此操作时未处于分离的头部状态(意味着您已签出分支),则该分支将前进到合并提交。因此,通常可以得出以下结论:您正在读取分支历史记录,并且经过了许多合并提交,这些合并提交是“合并到”当前分支中的。
但是,假设合并后马上branch2进入master你然后说
git checkout branch2
git merge master
Run Code Online (Sandbox Code Playgroud)
它将快速前进branch2到合并提交。现在,branch2仍然签出
git show --first-parent
Run Code Online (Sandbox Code Playgroud)
并且您会看到“来自”的父级,master即使那不是您签出的分支。
您可以说“但是在我的工作流程中,我从不那样做,所以我的假设成立了”。好吧,在那种情况下,您的假设对您有用。但是git并不仅仅是为您而写的,它并没有假设每个人都按照您的工作方式工作。
git show的目的是提供有关指定提交的信息。--first-parent在此命令和许多其他命令中,其目的是在仅查看合并的第一个父对象使图片更清晰的情况下限制该信息。需要对信息进行限制,以便git在使图片不太清晰时不应用它。
但是好吧,即使这--first-parent并不完全代表您想要show的默认行为,但为什么不按照show描述的方式进行行为呢?好吧,因为git存储数据的方式,所以无法识别“我当前分支的父级”,并且如果您更改了存储数据的方式以实现这一点,那么它将对git施加新的限制,而这些限制比您要解决的问题。