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