如何从远程跟踪分支(如“ git pull”)进行“ git fetch”和“ git merge”


111

我已经在git中设置了一些远程跟踪分支,但是一旦用'git fetch'更新了它们,我似乎永远无法将它们合并到本地分支中。

例如,假设我有一个名为“ an-other-branch”的远程分支。我在本地将其设置为跟踪分支

git branch --track an-other-branch origin/an-other-branch

到目前为止,一切都很好。但是,如果该分支得到更新(通常是由我移动机器并从那台机器提交),并且我想在原始机器上更新它,则获取/合并会遇到麻烦:

git fetch origin an-other-branch
git merge origin/an-other-branch

每当执行此操作时,都会收到“已经更新”消息,并且没有任何合并。

但是,

git pull origin an-other-branch

总是按照您的期望进行更新。

另外,运行git diff

git diff origin/an-other-branch

表明存在差异,因此我认为我的语法错误。

我究竟做错了什么?

编辑[2010-04-09]:我已经检查了几次,而且绝对不在其他分支上。我的“ git fetch”后面跟着“ git merge”(如上所示)是否应该做与git pull完全相同的事情?我将获得一些显示git status等结果的工作流。

Answers:


170

您不获取分支,而是获取整个远程:

git fetch origin
git merge origin/an-other-branch

8
更多详细信息:git fetch origin an-other-branch将获取的提示存储在中FETCH_HEAD,但不存储origin/an-other-branch(即通常的“远程跟踪分支”)。因此,可以做到git fetch origin an-other-branch && git merge FETCH_HEAD,但是像@Gareth所说的那样做更好(或者只是使用git pull)。
克里斯·约翰森

因此,如果Origin有1000个分支,那么您将为所有这些分支创建一个远程分支吗?
Gauthier 2010年

4
当然。如果我添加了一个具有1000个分支的远程存储库,并且询问该远程站点有哪些分支,那么该死的最好给我全部1000个
Gareth 2010年

git merge origin/an-other-branch合并origin/an-other-branch到所有设置为对其进行跟踪的本地分支中吗?我怎样才能合并到一个本地分支机构?
两栖游戏2014年

1
那么git pull(不带参数)会做什么-它合并到哪个分支?是否合并与当前分支相对应的远程跟踪分支?
红豌豆

69

只选择一个分支:fetch/ merge vs。 pull

人们经常建议您将“获取”与“合并”分开。他们说的不是这个:

    git pull remoteR branchB

做这个:

    git fetch remoteR
    git merge remoteR branchB

他们没有提到的是,这样的fetch命令实际上会从远程仓库中获取所有分支,而pull命令不是。如果远程仓库中有成千上万的分支,但又不想看到所有分支,则可以运行以下晦涩的命令:

    git fetch remoteR refs/heads/branchB:refs/remotes/remoteR/branchB
    git branch -a  # to verify
    git branch -t branchB remoteR/branchB

当然,这很难记住,因此,如果您真的想避免获取所有分支,最好.git/config按照ProGit中的说明进行更改。

??

关于这一切的最好解释是在ProGit的第9-5章中,Git Internals-Refspec或通过github)。通过Google很难找到这一点。

首先,我们需要清理一些术语。对于远程分支跟踪,通常需要注意三个不同的分支:

  1. 远程仓库中的分支:refs/heads/branchB在另一个仓库中
  2. 您的远程跟踪分支refs/remotes/remoteR/branchB您的仓库中
  3. 您自己的分支:refs/heads/branchB您的仓库内

远程跟踪分支(位于中refs/remotes)为只读。您不直接修改它们。您修改自己的分支,然后在远程仓库中推送到相应的分支。refs/remotes经过适当的拉取或提取后,结果才会反映在您的计算机中。这种区分是我很难从混帐人的页面了解,主要是因为当地分支机构(refs/heads/branchB)被“跟踪”之称的远程跟踪分支时.git/config定义branch.branchB.remote = remoteR

将“ refs”视为C ++指针。从物理上讲,它们是包含SHA-digest的文件,但基本上它们只是指向提交树的指针。git fetch会在提交树中添加许多节点,但是git如何确定要移动的指针有点复杂。

另一个答案中所述

    git pull remoteR branchB

也不

    git fetch remoteR branchB

会移动refs/remotes/branches/branchB,后者当然不会移动refs/heads/branchB。但是,两者都移动FETCH_HEAD。(您可以在其中的cat任何这些文件.git/中查看它们的更改时间。)并且在设置时git merge将引用,等。FETCH_HEADMERGE_ORIG


1
您是否知道到Git Internals的链接就是这个问题的链接?
沙巴兹(Shahbaz)

9

您确定an-other-branch合并时在本地吗?

git fetch origin an-other-branch
git checkout an-other-branch
git merge origin/an-other-branch

其他的解释

您尝试合并的分支中的所有更改都已合并到您当前所在的分支中。
更具体地说,这意味着您要合并的分支是当前分支的父级

如果您一次提交领先于远程仓库,则是过时的远程仓库,而不是您。

但是,对于您而言,如果git pull可行,那就意味着您不在正确的分支上。


3

Git pull实际上是一个组合工具:它运行git fetch(获取更改)和git merge(将它们与当前副本合并)

您确定您在正确的分支上吗?


我认为OP差异很大。分支,发生在我身上。
Chaklader Asfak Arefe

1

这些是命令:

git fetch origin
git merge origin/somebranch somebranch

如果您在第二行执行此操作:

git merge origin somebranch

它将尝试将本地主机合并到您的当前分支中。

据我了解,问题是您已经在本地获取了,现在想将您的分支合并到同一分支的最新分支中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.