之前可能会问过,但我找不到答案。
假设以下情况。
我有一个本地存储库,其中包含以下本地分支。
Scenario 1
local
Branch A
Branch B
Branch C (not reachable from A or B)
如果我在分支A上做拉,我是否隐含地对B和C进行取指?在pull操作中完成的提取是否只是执行fetch?
如果我在C上获取,我是否获取A和B的HEAD?
情况二怎么样只在本地检出分支A?
Scenario 2
local
Branch A
Remote
Branch A
Branch B
Branch C (not reachable from A or B)
答案 0 :(得分:1)
您对两种方案的描述(以及它们之间的区别)并不十分清楚,因为如果遥控器有一些分支名称A
,B
和C
,它将始终存在于您的本地仓库以及origin/A
,origin/B
和origin/C
中(在您使用git fetch
或git pull
更新远程广告后),无论你是否在本地检查过分支机构。
fetch
用于从远程获取更新的提交列表。 fetch
作为pull
操作的第一个命令完成。
通常的语法是git fetch <REMOTE> <REFSPEC>
refspec参数是可选的。如果你没有指定一个,git将从遥控器中提取所有引用。通过引用,它包括refspec中所有可到达的头部和标签。
没有任何refspecs的git pull <REMOTE>
命令将从远程引入所有引用, NOT 只引用与您正在合并的当前本地分支相对应的提交成。
在方案1中,如果您在当前检出分支git pull origin
时运行A
,则是git将更新origin/A
,origin/B
,以及当地仓库中的origin/C
。此外,它会将origin/A
合并到A
。
在方案1中,如果您运行git fetch origin C
,则本地仓库中只有origin/C
会更新。由于这个fetch
,
场景2将产生与场景1相同的结果。来自遥控器的所有引用都将更新到本地仓库的<REMOTE_NAME>/BLAH
分支。实际上,场景2与场景1没有什么不同,只是您签出的本地分支较少,这对于fetch
操作无论如何都不重要。
顺便说一句,在git pull origin <BRANCHNAME>
和git fetch origin <BRANCHNAME>
所做的评论中回答你的问题:
git pull origin <BRANCHNAME>
会做出与您预期的不同的事情。
<BRANCHNAME>
提交引入FETCH_HEAD
而不是origin/<BRANCHNAME>
。origin/<BRANCHNAME>
FETCH_HEAD
合并到您当前检出的分支中,因此就本地分支状态而言,它实现了类似的最终结果。 git fetch origin <BRANCHNAME>
与上述git pull origin <BRANCHNAME>
的行为非常相似,只不过只需将<BRANCHNAME>
的提交从远程转入FETCH_HEAD
即可停止。
如果您确实只想获取与特定分支对应的提交,则需要使用正确的refspec参数。阅读更多信息here。要仅从远程origin
和分支master
获取提交,正确的命令将是:
git pull origin refs/heads/master:refs/remotes/origin/master
您还可以使用fetch
的refspec来仅将提交提取到origin/master
,而不会将任何合并到您的本地分支中:
git fetch origin refs/heads/master:refs/remotes/origin/master
如果您不想为git pull
键入长引用规范,并且不介意从远程获取有关所有引用的信息,并且您没有远程跟踪分支集,那么你可以这样做:
git fetch origin
git checkout <BRANCH-THAT-NEEDS-TO-BE-MERGED-INTO>
git merge origin/<BRANCH-TO-BE-MERGED-FROM>
奖励 - GIT_FETCH_HEAD
做什么?
这是git用来跟踪远程存储库中的任何提取的短命ref。您可以通过查看文件FETCH_HEAD
来查看.git/FETCH_HEAD
的当前值。例如:
72a90cf95456b14630ddff427c3df1b00be24670 branch 'master' of git://github.com/foo/bar.git