我在重新定基和/或压榨时看到了很多有关如何摆弄作者日期和提交人日期 的问题,但我没有还不知道为什么。
很明显,不管另一个人是否正在代表其提交者提交提交,提交者的信息将有所区别(实际上,该人没有重写任何内容)。 在将本地(自己的)分支的历史记录推送到远程存储库之前,如何对其进行重写?
作者有几种选择:
考虑这样的事情:
很显然,默认的重新设置基准会使两个日期在重新提交的基准提交中有所不同(并且前面的提交可能具有较早的作者日期!)。壁球将创建一个全新的提交。我不在乎保持美观,但这有意义吗? 在这种情况下,两个日期的语义是什么?
谢谢。
更新:
对于“语义学”,我主要是指“意图传达”。我希望不同的工具的行为也有所不同,但是从这两个日期开始,其他Git用户又能期待什么呢?
答案 0 :(得分:2)
Git本身没有日期的语义。好吧,几乎都没有。因此,这完全取决于您。通常,Git仅向您显示提交日期可见的提交。如果您使用git log --pretty=fuller
,它会显示两套可见的提交,仅此而已。
只要Git在肮脏的突起中有个以上的提交,就会发生此规则的一个例外。 git log
命令一次只能显示一次提交,但由于某种原因(以某种方式)却告诉您显示两个或更多提交。例如,假设您有以下内容:
C--D <-- br1
/
...--B
\
E--F <-- br2
,然后运行git log br1 br2
或git log --all
。您刚刚告诉Git:请向我展示D
和F
,然后继续从那里向后展示我较早的提交。 Git现在应该显示哪个,{ {1}}还是D
?它有两个选择。
默认情况下,Git要做的是选择一个具有较晚提交者日期的对象。这有点遗憾,因为默认情况下显示的日期是作者日期。但您可以根据自己的喜好来制作它。
F
命令具有许多选项,可以 change 选择首先显示的git log
或D
中的哪个。其中包括F
和--author-date-order
。
一旦Git 显示了--topo-order
或D
,它就会将F
或C
放入列表。也就是说,它将所显示的父项放到列表中。现在,列表显示 E
或 C F
。与以前一样,它根据您告诉它使用的规则集选择一个并进行显示。 D E
或C
的父级是D
,因此,如果仅显示其中一个,则现在B
在列表中。这会一遍又一遍地重复,直到列表缩小到只有一个条目为止-由于规则倾向于在返回到{{1}之前先完成B
和C-D
链,因此往往会很快发生}。此外,某些规则(例如E-F
告诉Git 必须做到这一点,即使B
上的日期很奇怪
如果您发现Git以奇怪的顺序列出事物,请使用--topo-order
(也许也使用B
)。 git log --graph
选项告诉--oneline
两件事:
绘制提交日志的基于ASCII的粗略文本图。它是垂直定向的,而不是像我通常在StackOverflow帖子中那样水平定向的,但是对于简单的图形或图形片段来说,这样做是可以的。
进行图形遍历时,请使用--graph
。也就是说,一旦Git从git log
分支开始,它将结束在开始--topo-order
分支之前。
(您可以使用C-D
或E-F
覆盖隐含的--topo-order
。)
请注意,无论任何提交日期顺序如何,如果Git的爪子中只有一个 提交,例如您说的--date-order
,那么Git将从{{1 }} —仅显示一次提交。这清空了要显示的提交列表,然后将--author-date-order
的父列表放入列表中。现在该列表列出了git log br1
,因此Git显示D
,这会清空列表,但会将D
放入列表中。因此,现在Git显示C
,它会清空列表,但将C
的父项放入,依此类推。结果是简单,线性,向后行走。因此,如果没有 merge commits ,而您在分支的末尾启动Git,则只会看到该分支:
B
但是如果有合并提交:
B
然后,当Git显示B
时,会将 ...--o--o--o--tip <-- branch
和 C--D
/ \
...--o--o G--o--...--tip <-- branch
\ /
E--F
放入其列表。因此,现在您处于列表中的两次提交情况下,并且遇到了哪个提交首先显示的问题,就像G
一样。
如果您使用D
强制Git不遵循合并的另一条腿,则此操作将完全消失。有时候那是一件好事,有时却不是。如果您使用F
使Git绘制图形,有时会有所帮助,并且有时图形会变得很复杂。
虽然这与 Git 无关,但值得一提的是,一旦Git Hub 开始显示请求请求中的提交,Git Hub 通过提交顺序开始做自己的事情。它停止使用所有正常的Git规则,并开始使用Git Hub 的规则。这些规则对GitHub员工有意义,但对许多GitHub用户而言意义不大。您必须在这里与GitHub上的人交谈。