比较两个分支产生不同的差异

时间:2018-03-06 16:05:34

标签: git

我使用Bitbucket来比较两个分支。当我将master分支(作为我的源)与我的uat分支(作为我的目的地)进行比较并查看差异时,我注意到当我比较{{1时,文件列表完全不同(作为我的来源)到uat(作为我的目的地)。将master作为我的来源进行比较时,会有更多不同的文件。然而,在将master作为我的来源进行比较时,只有少数文件不同。为什么我比较的顺序不同?为什么在比较两个分支时,源和目的地是否重要?

另外,我注意到diff中列出的大多数文件都有相同的内容,但唯一的区别是提交哈希。

以下是一些截图。我正在使用BitBucket UI来比较两个分支。在让uat成为我的来源时,您可以看到我的屏幕截图中包含的设置文件夹,当我master成为我的来源时,该文件夹并不存在。

uat1 as my source

master as my source

2 个答案:

答案 0 :(得分:4)

您显示的屏幕截图包含 sourcedestination 分支的概念,并且有一个 Create pull request 按钮。

我不熟悉 Bitbucket GUI,但所有提供 Pull Request 机制的 git 服务(Github、Gitlab(在 Gitlab 中称为“合并请求”)、Azure Devops 等)都有类似的观点:

显示的差异是:

  • 如果您将 source 合并到 destination 中,它将带来的更改列表

这与 :

不同
  • sourcedestination 之间的所有差异。

带图:

# say your branches 'master' and 'release/onemsg-uat1' look like this :

       D--E--F <- release/onemsg-uat1  (source)
      /
--*--X--A--B <- master  (destination)
     ^
    fork point, aka "merge base"

为了表示“源分支带来的更改”,GUI 向您展示了从 B 开始的更改,而不是查看 FX 之间的完整差异:

一个。如果您打开合并 release/onemsg-uat1 (source) 到 master (destination) 的合并请求:要审查的更改是 XF 之间的差异,
湾如果您交换分支,看看 master 会给 release/onemsg-uat1 带来什么:要审查的更改是 XB 之间的差异。


git术语中,X被称为两个分支的“合并基”,你可以用git merge-base master release/onemsg-uat1得到它的sha1。

从本地存储库查看这些差异的第一种方法是:

# changes introduced in release/onemsg-uat1 :
git diff $(git merge-base master release/onemsg-uat1) release/onemsg-uat1

# changes introduced in master :
git diff $(git merge-base master release/onemsg-uat1) master

上面的命令有一个快捷方式:the three dots notation git diff a...b

# changes introduced in release/onemsg-uat1 :
git diff master...release/onemsg-uat1

# changes introduced in master :
git diff release/onemsg-uat1...master

要仅列出受影响的文件,请使用 --name-only--name-status :

git diff --name-only master...release/onemsg-uat1
git diff --name-status master...release/onemsg-uat1

要在图形差异查看器中打开此差异,请使用 git difftool :

# the following command will open the differing files one at a time :
git difftool master...release/onemsg-uat1

# with the '-d' option, you will view the diff of two complete directories :
git difftool -d master...release/onemsg-uat1

答案 1 :(得分:1)

编辑:你正在使用Bitbucket的比较器,它不是git diff,甚至可能根本不是Git的一部分。 Bitbucket在这里做的事情并不明显。它可能会也可能不会考虑合并基础:

base=$(git merge-base $tip1 $tip2)
git diff $base $tip2

但是,我一度认为这就是GitHub为拉取请求显示所做的事情,然后实验表明它不是GitHub所做的。它可能不是Bitbucket所做的(也不是BitBucket的基于Web浏览器的UI是否与GitHub首先做的事情直接相关)。

因为我不知道Bitbucket实际上在做什么比较 - 虽然它显然不是两个分支提示 - 我无法真正回答其余部分。我将在下面留下原始答案,因为它可能对发现此问题的其他人有用,并且只是在命令行上运行git diff

git diff的输入是(无论如何是第一次近似)两次提交或两次快照:将此快照与该快照进行比较。

来自git diff输出是一组说明。这些说明告诉您如何更改第一个快照,以获得第二个快照。

这意味着您最初的期望是错误的。 Git并没有说:要从较旧的快照转到较新的快照,请在此处添加这些行并将其删除。它说:从左侧提交/快照向右移动-side one ... 如果交换两侧,您将获得反向方向:如果将快照A更改为快照G需要添加一条线,则将快照G更改为快照A将需要删除同一行。