git rebase使用什么来确定共同祖先?
我知道在执行git rebase使用什么来确定共同祖先?,git,merge,rebase,Git,Merge,Rebase,我知道在执行git merge时,我可以使用git merge base来确定共同祖先,但是对于git rebase 这是我在重新设置基础之前的设置: 主分支机构:A--Y--(C) 和dev分支机构:A--C--D (C) 是我将A--C重设为A--Y的结果,相同的内容,但不同的提交消息 git-merge-base-master-dev将返回A,如果我返回了git-merge-dev,我将在历史记录中同时看到(C)和C git rebase master,结果是: A--Y--(C)--(D
git merge
时,我可以使用git merge base
来确定共同祖先,但是对于git rebase
这是我在重新设置基础之前的设置:主分支机构
:A--Y--(C)
和
dev分支机构
:A--C--D
(C) 是我将A--C重设为A--Y的结果,相同的内容,但不同的提交消息
git-merge-base-master-dev
将返回A,如果我返回了git-merge-dev
,我将在历史记录中同时看到(C)和C
git rebase master
,结果是:
A--Y--(C)--(D),其中(D)在重新基准后为D
< > >代码> Git ReBase< /C> >考虑(c)作为共同祖先吗?(这在代码中感觉很难做到)我猜它仍然使用A,但是当它在
master
的末尾添加C,D时,C最后变成了no op?让我们从这个开始:git-rebase
做的是复制一些提交。在您的情况下,它似乎是复制commitC
,而不是commitD
。(我想您是在问为什么,但假设它与合并基础有关,这可能是不正确的。)
git-rebase
选择复制的提交集在很大程度上(但不是全部)取决于以下结果:
git rev-list <upstream>..HEAD
(尽管添加了其他选项;请参见下文)
如果我正确阅读了您的图形,输入图形为:
...--A--Y <-- master
\
C--D <-- dev
要比较的两组补丁ID分别是(C,D)和(E,F,G)的补丁ID。如果我们有:
H--I
/ \
...--A--G---J--K <-- master
\
\ D
\ / \
C F <-- dev
\ /
E
(请注意这里的三个点,dev
和master
的顺序只对确定哪些提交是“左侧”(在master
上,而不是dev
)和哪些提交是“右侧”(在dev
上,而不是master
)
这个三点符号,连同这个左-右的想法,是Git计算出哪个提交放在哪个集中的方式,以便计算完整的补丁ID集。如果左侧提交的补丁ID与右侧提交的补丁ID相同,那么这些提交虽然在某些方面有所不同,但表示相同的更改:它们是已经被樱桃采摘的樱桃
git-rebase
命令跳过这些预先挑选的樱桃。它只挑选剩余的提交,无论它们是什么。git-rebase
代码运行git-rev列表--仅限右键--cherry-pick--无合并..HEAD
以获取在步骤2中要复制的提交列表。然后运行这三个步骤。如果C
或D
的修补程序ID与提交Y
的修补程序ID匹配,则根本不会复制该提交。在这种情况下,commitD
的补丁ID可能与commitY
的补丁ID匹配
我还说过有两种方法可以消除承诺。这个樱桃检测就是其中之一,我怀疑这就是你看到结果的原因,我想你看到了。另一个是Git调用的
——fork point
,这有点复杂。我不打算在这里谈。它只省略了“早期”提交:也就是说,它沿着C--D
链找到一个点。如果链长到它认为应该放下的程度,那么这将更有意义,并且只在该点之后复制提交。由于commitC
被复制,它不可能是导致commitD
被省略的分叉点代码。“我猜它仍然使用A,但当它在主文件的末尾附加C,D时,C最终成为no op(git diff==null
)?”这将是我对概念上发生的直觉,也
...--A--E--F--G <-- master
\
C--D <-- dev
H--I
/ \
...--A--G---J--K <-- master
\
\ D
\ / \
C F <-- dev
\ /
E
git rev-list --left-right master...dev