git如何在工作树之外做差异

时间:2014-10-13 15:49:27

标签: git

我正在处理foo分支,可能看起来像:

A --> B --> C --> D
^                 ^
master            foo

与此同时,一位同事推动了一个分支bar并要求进行代码审查:

              origin/bar
              v
  E --> G --> G
 /
A --> B --> C --> D
^                 ^
master            foo

有没有办法让我查看masterorigin/bar之间的差异,而不必先git checkout bar?无论如何,不​​管我做什么:

git diff A bar
git diff A origin/bar

我明白了:

fatal: ambiguous argument 'bar': unknown revision or path not in the working tree.
fatal: ambiguous argument 'origin/bar': unknown revision or path not in the working tree.

2 个答案:

答案 0 :(得分:2)

正如评论中所述,该同事已在特定的远程存储库中发布了更改:在本例中为集中式服务器,您的git名称为origin。您需要获得这些更改。

如果您运行git fetch origin,您的git将调用遥控器并将所有可用分支移至origin/name。您现在只需需要 origin/bar显示在您自己的存储库中,但如果您专门要求 {{1 } {},bar这个四参数形式git fetch origin bar将所提取的结果存储在名称fetch下。

处理此问题的简单方法是运行FETCH_HEAD,而不使用第四个参数。事实上,你通常也可以不用git fetch origin;见下文。虽然这会带来所有新的东西,但最终你可能最终想要所有这些,并且让计算机完成工作要容易得多。

完成后,您可以简单地命名另一个分支:origin,就像您尝试的那样。

(如果您只是将git diff A origin/bar移除,并将其命名为bar,那么您可能会执行覆盖FETCH_HEAD的其他操作,使你第一次带来的对象有资格被垃圾收集。如果他们被垃圾收集,后来的提取将只需要重新进行,所以你不妨使用简单的方法将所有东西带回来。但是,在某些特殊情况下,您可能希望使用FETCH_HEAD方法。例如,如果您暂时使用非常慢或昂贵的服务,那么限制您带来的内容可能是值得的。在这种情况下,只需使用名称FETCH_HEAD而不是FETCH_HEAD - 或者您甚至可以使用原始SHA-1 ID。)


什么时候可以完全离开origin/bar?答案在git fetch documentation中,使用git的传统不透明词:

  

如果未指定远程,则默认情况下将使用origin远程,除非为当前分支配置了上游分支。

这意味着git首先检查当前分支是什么。这是origin输出中以*为前缀的分支,但找出的较短方法是使用git branch。可能没有当前的分支 - 你在"分离的HEAD"模式 - 在这种情况下git symbolic-ref --short HEAD回退到默认值。

但是,如果您在分支机构,下一步是查看是否配置了上游。这是[{1}}输出中方括号中显示的分支:

fetch

此处git branch -vv上游有foo 222d4dd [bobs-computer/foo] some commit or another master d157b48 [origin/master] another commit message testbr d34b333 third commit message ,上游有foo bobs-computer/foo,上游有<{1}}

如果上游,git将从任何远程提取:masterorigin/mastertestbrbobs-computer {1}}。如果没有上游,foo会回到origin,就像分离的HEAD无分支案例一样。

(要配置上游,请使用master;但默认情况下,当您签出跟踪分支时,它会自动为您配置。实际配置保存在您的git配置文件中并且位于两个部分:fetchorigin。不出所料,第一部分给出了遥控器的名称,实际上是所有git branch --set-upstream-to=...的需要。第二部分给出了分支的名称为存储在远程上,即没有branch.name.remote执行的分支重命名,以便branch.name.merge实际上在您自己的存储库中命名为fetch。)

答案 1 :(得分:0)

git diff fingerprinterD fingerprintG