为什么“ git diff”将文件与/ dev / null进行比较?

时间:2019-06-28 20:38:40

标签: git

我正在尝试将一个分支上的单个文件与另一个分支上的相同文件进行比较。我一直在参考类似问题的答案,但是我什么也做不了,我已经在两个不同的系统上使用不同版本的git尝试了这一点。在每个系统上我都会遇到不同的故障。

我有一个问题,就是我要比较的分支看起来像修订版号。分支名称为“ 2.2.0”。

在一个运行git v2.17.0的系统上,我看到了:

% git diff -b 2.2.0 my-branch -- stuff.groovy 
diff --git a/vars/stuff.groovy b/vars/stuff.groovy
new file mode 100644
index 0000000..c6a2073
--- /dev/null
+++ b/vars/stuff.groovy
@@ -0,0 +1,84 @@

这将继续显示文件的全部内容,每行前均带有“ +”,这很明显,因为它与“ / dev / null”进行了比较。我不知道为什么要这么做。

在另一个运行git v2.7.4的系统上,而不是其他输出上,我仅看到以下行:

fatal: bad revision '2.2.0'

我可以在使用JGit库而不是“ git”命令行的Eclipse中进行此比较,并且效果很好,显示出这些分支之间的一行是不同的。

更新

通过以下命令添加结果:

% git branch
  2.2.0
* cart-checkout-customizations
  master
% git tag
% git rev-parse --symbolic-full-name 2.2.0
refs/heads/2.2.0

更新

添加其他命令的输出以进行诊断:

% git branch -a
  2.2.0
* cart-checkout-customizations
  master
  remotes/origin/2.2.0
  remotes/origin/bugfix/pr-issue
  remotes/origin/cart-checkout-customizations
  remotes/origin/dp5252/func_get_job_details_textgroovy-1560980842574
  remotes/origin/dp5252/pl_idp_msgroovy-1560289622641
  remotes/origin/dp5252/pl_idp_msgroovy-1560979038086
  remotes/origin/dp5252/stage_build_docker_imagegroovy-1559338261549
  remotes/origin/feature/2.2.0-temp
  remotes/origin/feature/2.2.1
  remotes/origin/feature/cfgrole-playbook
  remotes/origin/feature/disable-concurrent-builds
  remotes/origin/feature/hpa
  remotes/origin/feature/hygieia
  remotes/origin/feature/istio
  remotes/origin/feature/notify-stash
  remotes/origin/feature/profile-pipeline-id
  remotes/origin/feature/sast
  remotes/origin/feature/sast-swap
  remotes/origin/feature/scrumboard-removal
  remotes/origin/feature/smoke-test-fix
  remotes/origin/feature/temp-investigation
  remotes/origin/master
  remotes/origin/trackingaudit

如果不明显,当前分支是“ cart-checkout-customizations”,这是我在其他地方引用的“ my-branch”。实际的文件名不是“ stuff.groovy”,但这没关系。

更新

需要明确的是,@ ZachPosten提供的示例命令有效。我希望这为某人提供了有用的线索。它看起来确实确实像是导致git认为“ 2.2.0”不是分支,而是其他东西的原始命令。明确表示它是分支名称的形式(通过在其前面加上“ origin /”),使其以某种方式起作用。

2 个答案:

答案 0 :(得分:1)

由于该文件不存在,为了使diff正常工作,需要有一个文件,因此使用empty file / dev / null。

您还可以尝试使用两个分支中最后一次提交的提交哈希...

您是否尝试过git diff 2.2.0..my-branch

来自git文档man git diff

  

比较分支

           $ git diff topic master    (1)
           $ git diff topic..master   (2)
           $ git diff topic...master  (3)

       1. Changes between the tips of the topic and the master branches.
       2. Same as above.
       3. Changes that occurred on the master branch since when the topic branch was started off it.

答案 1 :(得分:0)

您确定您有本地分支机构2.2.0吗?

也许尝试

git diff origin/2.2.0 origin/my-branch -- stuff.groovy 

查看git branch -a的输出有助于诊断。

更新

我看到您确实有本地和远程2.2.0分支。我的猜测是它们指向不同的提交,这就是为什么本地分支引用失败而远程引用成功的原因。

您可能还会在回购中存在另一个标识符2.2.0。为了解决这个问题,您可以运行:

$ git show-ref 2.2.0

21787341c2e651b17d94375ecb1137b575a2099e refs/heads/2.2.0
21787341c2e651b17d94375ecb1137b575a2099e refs/remotes/up/2.2.0
a2d88e63057d7ae1484a90d36ee5b12fc78828cd refs/tags/2.2.0

在这里您可以看到我的存储库中有三个对2.2.0的引用,一个本地分支(refs/heads),一个远程分支(refs/remotes)和一个标记({{ 1}})。分支指向相同的提交,但标签指向不同的提交。