2016-09-29 196 views
0

Git存储库只有主人,每个人都在使用(不要评价我,目前为止是一件小事),默认情况下启用了Rebase。 AFAIK git-rebase根据日期重写应用提交的历史,并在此过程中根据需要进入“并发”状态。但有一两件事很讨厌我和球队,有时历史不是线性的,遵循一些例子:Git Rebase创建非线性历史记录

enter image description here enter image description here enter image description here

什么会发生在这里?或者我误解了git-rebase是如何工作的?

回答

2

历史不是基于日期,而是基于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

现在,如果你变基branchBbranchA,Git的将改写上branchB这些提交,并将其应用到branchA。在重写时,Git 默认为保持创作时间不变(但将提交时间重置为当前时间)。所以,你会得到以下结果:

    branchA 
        ↓ 
1 -- 2 -- 4 -- 5 -- 8 -- 3' -- 6' -- 7' 
            ↑ 
            branchB 

(这里的'表示,他们实际上是从原来的那些不同的提交,但他们确实有相同的内容和作者的时间)。

如果您现在查看branchB的日志,您将得到以下结果:7', 6', 3', 8, 5, 4, 2, 1。这就是“时间悖论”的来源:你确实有一个完美的线性历史(图中线性为本节)。但提交不一定按照他们最初编写的顺序进行。

这非常好,完全按设计:重新编辑不应该完全重置提交,所以原始作者信息(谁做了,谁做了什么)仍然存在。