我合并了一个分支到另一个分支,并且在“差异”选项卡中包含三个类别包含文件:
与:起源/分支@ hash1的区别区别于:origin / working_branch @ hash2组合差异
每个类别中都有哪些文件?我将origin / working_branch合并到origin / branch。
是这样吗?
与Diff的区别:origin / branch @ hash1-包含在origin / working_branch中更改的文件区别于:origin / working_branch @ hash2-包含在origin / branch中更改的文件组合差异-包含两个分支中更改的文件
其中一些问题与图形用户界面Git Extensions有关。我没有用过,也无法回答任何问题。但是,此问题的另一部分是这些差异的含义/显示,这是基本的命令行Git。
在Git中的记住,每个提交包含所有文件的完整快照。对于常规(非合并)提交,很容易看到它是如何工作的。每个提交都有一个parent提交,因此,在我们可以绘制的一行中,一个接一个地串接在一起。
...---F--G--H <-- master
或:
* 9fadedd637 (master) a commit message subject | * 3bab5d5625 some other commit message subject | * 1c56d6f57a this commit does something or other | :
例如,如
git log --graph
所示(上面的输出是模拟的,与--graph
所显示的不完全相同,但是足够接近)。
要view
提交,我们可以将其检出,以便我们在工作树中具有all个文件,在其中可以看到它们;或者我们可以通过将Git与它的父项进行比较来要求Git show提交。为了查看提交H
,在master
的顶端,我们让Git将G
和 H
都提取到一个临时区域(在内存中)并对其进行compare。G
中的某些文件与H
中的对应文件匹配。 Git对这些文件一无所获。某些文件不
G
中的文件,使其would与H
中的副本匹配。[合并提交有多个父级。当使用向右的新提交来绘制它们时,就像我通常在StackOverflow上所做的那样,我们得到如下所示: I--J
/ \
...--G--H M--N--...
\ /
K--L
CommitM
是一个合并,其父级为J
和L
。
合并与其他任何提交一样:它拥有完整的快照,而不是某些更改集。但是我们可以通过将M
中的快照与J
中的快照进行比较,来
view
进行as更改。git diff <hash-of-J> <hash-of-M>
例如确实如此。我们也可以通过比较
L
与M
将其视为更改:
git diff <hash-of-L> <hash-of-M>
每个差异将显示由于更改
。不过,它们将显示的更改是不同的。
M
是一个合并提交,所以当我们查看J
-vs- M
时,将看到我们沿着bottom
行完成的工作所带来的更改,提交K
和L
。如果我们比较L
-vs- M
,我们将看到在提交I
和J
中沿着top行完成的工作带来的更改。请注意,例如L
可能是I
的精选,因此作品是重复的。在这种情况下,合并仅采用了这些更改的一个副本,而不是两个副本,因此我们不会在这两个差异的任一个中看到这一点。A combined diff
完全是另外一回事。在我看来,这是一种有用的尝试,并不像人们所希望的那样成功。 Git组合差异的作用是,首先运行每个单独的差异(在这种情况下,是J
vs M
和L
vs M
),然后从该差异中任意throw out在其他差异中,not完全没有变化。即,假设在H
中,我们有四个文件,所有这些文件也在I
,J
,K
,L
和M
中,并且这些属性成立:] >same.txt
在所有六个提交中都是相同的。top-only.txt
在I
和/或J
中被修改,但在K
和/或L
中未被修改。bot-only.txt
在K
和/或L
中被修改,但在I
和/或J
中未被修改。both.txt
在J
和L
中都被修改。M
不是邪恶合并(请参阅Evil merges in git?)。也就是说,如果我们运行该差异,则H
-vs- M
将not
I
,J
,K
或L
进行的任何更改。此外,我们将假设both.txt
的更改完全不重叠,因此合并将两个更改合并在一起:没有冲突,没有其他问题。显然,将J
与M
进行比较对于same.txt
而言什么都没有显示:在H
之后的五次提交中都没有被触摸。区分J
与M
不显示
top-only.txt
,因为M
中的副本与J
中的副本匹配。对该文件的更改发生在I
和/或J
中,即,将H
与J
进行比较显示了更改,但是对H
的top-only.txt
版本进行了更改,从而导致了J
版本top-only.txt
的版本适用于H
版本以获得M
版本。将L
与M
进行比较不显示
bot-only.txt
出于相同的原因。同样,M
的bot-only.txt
副本与L
副本匹配。仅对both.txt
存在J
和M
之间的差异。和
L
和M
之间的差异。如果我们要求Git提供M
的combined diff
视图,Git现在将:J
vs M
:更改了两个文件:top-only.txt
和both.txt
;和L
vs M
:更改了两个文件:bot-only.txt
和both.txt
。throw out
both.txt
。至此,您可以选择两种不同的组合差异:git diff --cc
(默认值:请注意两个破折号和两个c
):打印git diff -c
(请注意一个破折号和一个c
):这表示both.txt
的差异。--cc
实际上很有意义。这里的想法是向您显示出现合并冲突
git diff
documentation。)git diff
也很有意义,除了一件事:它既不显示-c
,也不显示top-only.txt
。我们真正需要的是一种将merge result快照与merge base
快照进行比较的方法,但是Git并没有。也就是说,我们可能想查看bot-only.txt
与H
。尽管我认为可能应该这样做,但没有内置操作可以执行此操作。M
的输出,在我在此处创建的测试存储库上运行这种组合的diff,是:git show -c
我们
可以手动完成。请参阅下面的脚本(名称为
commit 54627dbf51ab9b27c8e5486e4755651688dd5d21 (HEAD -> merge)
Merge: da92a96 e77c224
[snip]
diff --combined both.txt
index 5d51eed,506867f..1f3f391
--- a/both.txt
+++ b/both.txt
@@@ -2,10 -2,10 +2,11 @@@ this fil
will be
modified in
both branches.
+here is the top-branch change
The changes
will be
combined into
one file
in the merge result.
+ here is the bottom-branch change
,所以我可以将其作为git-show-merge
运行)。这基本上是从指定合并(或默认为git show-merge
)的父级中找到合并基础,然后运行所需的差异。Git也具有HEAD
选项,可同时用于-m
和git show
。该标志有效地将合并“拆分”为单独的“虚拟提交”。每一个都是单亲提交,其单亲是实际合并中的双亲之一。这样,Git的内部差异引擎就可以很好地进行差异化处理(作为普通差异进行提交),以向您显示更改的文件。
git log
首先对git show -m <hash-of-M>
-vs- J
进行比较,然后对M
-vs- L
进行比较,然后显示两个差异。[Git Extensions似乎没有M
选项,但确实具有显示-m
-vs- J
差异,或M
-vs- L
差异的选项,或者-如果您选择它-一种组合差异格式,可能是M
变体。
注意,--cc
默认甚至不
attatting
以显示合并。使用明确的git log -p
或-c
选项强制--cc
显示组合的差异。git log