Git存储库只有主人,每个人都在使用(不要评价我,目前为止是一件小事),默认情况下启用了Rebase。 AFAIK git-rebase根据日期重写应用提交的历史,并在此过程中根据需要进入“并发”状态。但有一两件事很讨厌我和球队,有时历史不是线性的,遵循一些例子:Git Rebase创建非线性历史记录
什么会发生在这里?或者我误解了git-rebase是如何工作的?
Git存储库只有主人,每个人都在使用(不要评价我,目前为止是一件小事),默认情况下启用了Rebase。 AFAIK git-rebase根据日期重写应用提交的历史,并在此过程中根据需要进入“并发”状态。但有一两件事很讨厌我和球队,有时历史不是线性的,遵循一些例子:Git Rebase创建非线性历史记录
什么会发生在这里?或者我误解了git-rebase是如何工作的?
历史不是基于日期,而是基于Git基础的底层图形。例如,你的历史看起来是这样的:
branchA
↓
* -- * -- * -- * -- *
\
* -- * -- *
↑
branchB
每个那些*
的代表在历史上犯下的,但实际的日期是完全不相干的在图形中的位置。让我们用数字来表明其创建相对时间更换星(创建更大的数字后):
branchA
↓
1 -- 2 -- 4 -- 5 -- 8
\
3 -- 6 -- 7
↑
branchB
这是在每个分支上完美的罚款和“线性”(在时间上)历史。如果您记录branchA
的历史记录,则会得到8, 5, 4, 2, 1
;对于branchB
,您将获得7, 6, 3, 2, 1
。
现在,如果你变基branchB
到branchA
,Git的将改写上branchB
这些提交,并将其应用到branchA
。在重写时,Git 默认为保持创作时间不变(但将提交时间重置为当前时间)。所以,你会得到以下结果:
branchA
↓
1 -- 2 -- 4 -- 5 -- 8 -- 3' -- 6' -- 7'
↑
branchB
(这里的'
表示,他们实际上是从原来的那些不同的提交,但他们确实有相同的内容和作者的时间)。
如果您现在查看branchB
的日志,您将得到以下结果:7', 6', 3', 8, 5, 4, 2, 1
。这就是“时间悖论”的来源:你确实有一个完美的线性历史(图中线性为本节)。但提交不一定按照他们最初编写的顺序进行。
这非常好,完全按设计:重新编辑不应该完全重置提交,所以原始作者信息(谁做了,谁做了什么)仍然存在。