1

我在这里有点难过。Git似乎都在告诉我

  1. 我的当前分支和远程分支之间存在差异,并且
  2. 我的当前分支和远程分支之间没有区别

其中一个是谎言(或者更有可能,我误解了这种情况)。这是怎么回事??

(~/hbb.vm) debian $ git diff ..stage/master --name-only
sites/all/libraries/attachment_email/attachment_email.php
sites/all/modules/redirect/redirect.module
sites/all/modules/redirect/redirect.test
sites/all/themes/HBB/css/elements.css
sites/all/themes/HBB/templates/node--enterprise_blog.tpl.php

(~/hbb.vm) debian $ git merge stage/master
Already up-to-date.
4

2 回答 2

4

合并命令告诉您当前分支包含来自该stage/master分支的所有提交,但不是相反。您当前的分支很可能包含不存在stage/master的更改,而正是这些更改反映在您的 diff 命令中。

 a-b----c
    \
     d--e

如果我已签出上述存储库e,则尝试合并b将正确声明事物是最新的。但是询问我当前状态和同一点之间的差异,很可能会存在差异(不能保证,可能会从或两者e恢复更改,并且 可能是空提交)。ded

顺便说一句,您的 diff 命令有些不正确。分支名称前面的..会导致它被解释为提交范围(相当于 HEAD..stage/master),但 diff 对单个提交而不是范围进行操作。这是一个比较常见的错误,因此 diff 已被调整为允许它,但它仍然会产生误导性的结果。在这种情况下,它将显示与您可能期望的更改相反的更改,显示从当前状态变为所需stage/master的更改,而不是为将状态从stage/master当前分支的尖端反映的状态而发生的更改。后者更有可能是您所期望的。

于 2013-07-30T19:21:56.313 回答
1

您假设 1 是正确的:您在 ( HEAD) 和stage/master.

这些中的任何一个都可以告诉您:

  1. git diff ..stage/master
  2. git diff HEAD..stage/master
  3. git diff stage/master..
  4. git diff stage/master..HEAD

1 是 2 的简写,3 是 4 的简写。3 只是 1 的反向差异。

git diff stage/master提到的@qqx 将进一步告诉您您的工作树和stage/master. (与 1 或 3 相比,您还会看到未提交的更改。)

HEAD您的想法是错误的 2.:和之间没有区别stage/master

相反,git merge stage/master它是告诉您stage/master没有尚未在(或合并到)中的提交HEAD

这也可能告诉你:

  • git log ...stage/master --cherry-pick

这可能会告诉您合并后导致差异的提交stage/master

  • git log stage/master... --cherry-pick
于 2013-08-01T15:02:59.807 回答