Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git rebase使用什么来确定共同祖先?_Git_Merge_Rebase - Fatal编程技术网

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
做的是复制一些提交。在您的情况下,它似乎是复制commit
C
,而不是commit
D
。(我想您是在问为什么,但假设它与合并基础有关,这可能是不正确的。)

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匹配,则根本不会复制该提交。在这种情况下,commit
D
的补丁ID可能与commit
Y
的补丁ID匹配


我还说过有两种方法可以消除承诺。这个樱桃检测就是其中之一,我怀疑这就是你看到结果的原因,我想你看到了。另一个是Git调用的
——fork point
,这有点复杂。我不打算在这里谈。它只省略了“早期”提交:也就是说,它沿着
C--D
链找到一个点。如果链长到它认为应该放下的程度,那么这将更有意义,并且只在该点之后复制提交。由于commit
C
被复制,它不可能是导致commit
D
被省略的分叉点代码。

“我猜它仍然使用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