1

以前可能有人问过这个问题,但我找不到答案。

假设以下场景。

我有一个带有以下本地分支的本地存储库。

Scenario 1 

local
    Branch A
    Branch B
    Branch C (not reachable from A or B)

如果我在分支 A 上进行拉动,我是否会隐式地为 B 和 C 进行提取?提取操作是否以不同的形式完成,只是做提取?

如果我确实在 C 上获取,我是否会为 A 和 B 获取 HEAD?

仅在本地签出分支 A 的场景二呢?

Scenario 2

local
    Branch A

Remote
    Branch A
    Branch B
    Branch C (not reachable from A or B)
4

1 回答 1

1
  • 您对这两种情况的描述(以及它们之间的区别)不是很清楚,因为如果远程有一些分支名称A、、BC,它将始终存在于您的本地存储库以及origin/Aorigin/Borigin/C、(在您更新remote usinggit fetch或 a git pull),无论您是否已在本地签出分支。

  • fetch用于从远程获取更新的提交列表。fetch作为pull操作的第一个命令完成。

    常用的语法是git fetch <REMOTE> <REFSPEC>

    refspec 参数是可选的。如果你没有指定一个,git 会从远程拉取所有的 refs。通过 refs,它包括 refspec 中所有可到达的头和标签。

  • 没有任何refspecsgit pull <REMOTE>命令将从远程引入所有 refs,而不仅仅是与您要合并到的当前本地分支相对应的提交。

  • 在场景 1 中,如果您git pull origin在当前签出 branch 时运行 a A,是的 git 将更新origin/A, origin/B, 和origin/C在您的本地 repo 中。此外,它将合并origin/AA.

  • 在场景 1 中,如果您运行 a git fetch origin C,则只有origin/C在您的本地 repo 中才会更新。因此也不会有任何合并fetch

  • 场景 2 将产生与场景 1 相同的结果。来自远程的所有 refs 都将更新到您本地 repo 的<REMOTE_NAME>/BLAH分支中。事实上,场景 2 与场景 1 没有什么不同,只是您签出的本地分支机构较少,这对fetch操作没有任何影响。

git pull origin <BRANCHNAME>顺便说一句,在关于做什么和做什么的评论中回答您的问题git fetch origin <BRANCHNAME>

  • git pull origin <BRANCHNAME>做一些与你期望它做的不同的事情。

    • git 将提交<BRANCHNAME>从远程引入FETCH_HEAD,而不是origin/<BRANCHNAME>.
    • 它不更新origin/<BRANCHNAME>
    • 它合并FETCH_HEAD到您当前签出的分支中,因此就本地分支状态而言实现了类似的最终结果。
  • git fetch origin <BRANCHNAME>行为与上面描述的非常相似git pull origin <BRANCHNAME>,除了它只是将提交<BRANCHNAME>从远程引入到FETCH_HEAD.

  • 如果您真的只想获取与特定分支对应的提交,则需要使用正确的 refspec 参数。在此处阅读更多信息。要仅从 remoteorigin和 branch获取提交master,正确的命令是:

     git pull origin refs/heads/master:refs/remotes/origin/master
    
  • 您还可以使用 refspecsfetch来仅获取提交,origin/master而不合并到您的本地分支中:

     git fetch origin refs/heads/master:refs/remotes/origin/master
    
  • 如果您不想为 a 键入长 refspec git pull,并且不介意从远程获取有关所有 ref 的信息,并且您没有远程跟踪分支集,那么您可以这样做:

    git fetch origin
    git checkout <BRANCH-THAT-NEEDS-TO-BE-MERGED-INTO>
    git merge origin/<BRANCH-TO-BE-MERGED-FROM>
    

奖金 -GIT_FETCH_HEAD做什么?

它是 git 用来跟踪从远程存储库中获取的任何内容的短期引用。FETCH_HEAD您可以通过查看文件来查看 的当前值.git/FETCH_HEAD。例如:

72a90cf95456b14630ddff427c3df1b00be24670                branch 'master' of git://github.com/foo/bar.git
于 2013-04-27T17:59:37.827 回答