Git 如何区分分叉分支

Git 如何区分分叉分支,git,diff,git-branch,git-diff,Git,Diff,Git Branch,Git Diff,我在我的分支上重新编写了一些提交历史记录,因此我的分支与远程分支有所不同: Switched to branch 'dev' Your branch and 'origin/dev' have diverged, and have 3 and 3 different commits each, respectively. 在不同的版本(即我的本地分支和远程分支)之间,是否有一种简单的方法来git diff 我知道我可以使用git diff commit1..commit2来区分两次提交,但在这

我在我的分支上重新编写了一些提交历史记录,因此我的分支与远程分支有所不同:

Switched to branch 'dev'
Your branch and 'origin/dev' have diverged,
and have 3 and 3 different commits each, respectively.
在不同的版本(即我的本地分支和远程分支)之间,是否有一种简单的方法来
git diff


我知道我可以使用
git diff commit1..commit2
来区分两次提交,但在这种情况下,我想区分分支上的三次本地提交和三次远程提交。

使用
git fetch
获取后使用

git diff <mainbranch_path> <remotebranch_path>
git-diff
例如
git-diff-develope-origin/develope

TL;博士 使用-在本例中,
git range diff origin/dev…dev
(注意这里的三个点)

长(ish) 首先,让我们绘制设置。以下是在您自己的存储库中看到的两组提交:

          F'-G'-H'  <-- dev
         /
...--D--E
         \
          F--G--H   <-- origin/dev
我们在这里使用
~3
,而不是
~2
,因为用两个点
表示的范围在数学上是半开区间:它们包括最终提交,但不包括开始提交。(在心理上,你可以认为这是在结果中需要三次提交,因此X~3..X。这是(X~3..X)这一事实当然很重要,因为[X~3..X]会忽略范围的错误端,但无论哪种方式,半开间隔都会补偿通常的结果。)再次,请参阅

然而,在这种情况下,更容易的是,我们可以使用三点表示法,
git range diff
稍微特别处理。如文档中所述,三点表示法意味着集合论方面的对称差异,因此:

git range-diff origin/dev...dev
这意味着命令应该检查可由
origin/dev
访问的提交,即背面的提交
H
,或背面的
dev
,即背面的提交
H'
;但不应该检查可从两个名称访问的提交,即提交
e
和更早的名称。因此,这正好选择了所需的两组通信its:
F-G-H
F'-G'-H'

玩靶场的乐趣 那么,剩下的问题是:

  • 这是怎么回事?为什么我们不在任何地方提到
    X~3
    ,对于一些
    X

  • 这些是否按正确的顺序排列?如果没有,您将得到一个范围差异,它描述了从新的和改进的提交到旧的和糟糕的提交的倒退

  • 让我们先回答问题1,然后再回答问题2。我们实际上已经回答了问题1,但只是借助于集合论,有些人可能并不熟悉

    定义为集合:它是并集减去交集。给定两个集合A和B,对称差A⊖B还是A∆B可以计算为A的并集∖B(将其理解为“A排除B”)和B∖A(或等效地,从并集中减去交集的结果,这是我通常自己的想法,并在这里首先陈述)

    在上面,我们写到:从
    dev
    可以访问的所有提交的集合,不包括从
    dev~3
    可以访问的所有提交的集合。这就是我们的
    dev~3..dev
    。这是一种非常精确的方法,从
    E
    开始剥离每个提交,从
    H>开始反向工作
    和向后工作。但我们毕竟不必如此精确。我们可以懒惰,说:每个提交都从
    H'
    开始,然后向后工作,去掉每个提交都从
    H
    开始,然后向后工作。虽然
    F-G-H
    不在该集中,但要求将它们从该集中去掉是无害的:A∖B不要求B中的东西首先在A中

    因此,我们可以使用
    origin/dev..dev
    ,而不是
    dev~3..dev
    ,从
    E
    向后删除提交内容。当然
    origin/dev
    需要输入十个字符,而
    dev~3
    只有五个字符,因此我们在这里并没有获得任何东西

    同样,我们可以编写
    dev..origin/dev
    来从
    E
    中排除从H向后提交中的向后提交。这一次它确实节省了一些输入,如果我们有某种符号,让我们只需在这里输入A和B的两个名称,我们只需输入每个名称一次就更好了。这是我们的对称差分符号,因此我们可以只键入
    origin/dev…dev
    (三点)或
    dev…origin/dev
    (仍然是三点)

    现在让我们来解决问题2,获得正确的顺序。我们现在进行咨询,咨询内容如下:


    相当于通过

    现在,我最初建议:

    git range-diff origin/dev~3..origin/dev dev~3..dev
    
    也就是说,我们将旧的提交范围放在第一位,新的提交范围放在第二位。如果我们运行:

    git range-diff origin/dev...dev
    
    然后
    dev
    ,因此“等效于”部分是:

    git range-diff dev..origin/dev origin/dev..dev
    
    这使用了第1项中的技巧来创建两个单独的范围表达式,并确保确定哪些提交是“新”的第二个范围表达式以第二个指定版本结束,即
    dev
    。因此
    origin/dev…dev
    的顺序正确

    git range-diff dev..origin/dev origin/dev..dev