我正在处理foo
分支,可能看起来像:
A --> B --> C --> D
^ ^
master foo
与此同时,一位同事推动了一个分支bar
并要求进行代码审查:
origin/bar
v
E --> G --> G
/
A --> B --> C --> D
^ ^
master foo
有没有办法让我查看master
和origin/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.
答案 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将从任何远程提取:master
,origin/master
,testbr
,bobs-computer
{1}}。如果没有上游,foo
会回到origin
,就像分离的HEAD无分支案例一样。
(要配置上游,请使用master
;但默认情况下,当您签出跟踪分支时,它会自动为您配置。实际配置保存在您的git配置文件中并且位于两个部分:fetch
和origin
。不出所料,第一部分给出了遥控器的名称,实际上是所有git branch --set-upstream-to=...
的需要。第二部分给出了分支的名称为存储在远程上,即没有branch.name.remote
执行的分支重命名,以便branch.name.merge
实际上在您自己的存储库中命名为fetch
。)
答案 1 :(得分:0)
git diff fingerprinterD fingerprintG