114

我已经在 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 等结果的工作流。

4

5 回答 5

175

您不获取分支,而是获取整个遥控器:

git fetch origin
git merge origin/an-other-branch
于 2010-04-08T19:08:06.963 回答
70

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

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

    git pull remoteR branchB

做这个:

    git fetch remoteR
    git merge remoteR branchB

他们没有提到的是,这样的 fetch 命令实际上会从远程 repo 中获取所有分支,这不是该 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 - The Refspec或通过 github)。这很难通过谷歌找到。

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

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

远程跟踪分支(in refs/remotes)是只读的。您不直接修改这些。您修改自己的分支,然后在远程仓库推送到相应的分支。refs/remotes在适当的拉取或获取之后,结果才会反映在您的身上。从 git 手册页中我很难理解这种区别,主要是因为本地分支 ( ) 在定义refs/heads/branchB时被称为“跟踪”远程跟踪分支。.git/configbranch.branchB.remote = remoteR

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

正如另一个答案中提到的,两者都没有

    git pull remoteR branchB

也不

    git fetch remoteR branchB

会动refs/remotes/branches/branchB,后者肯定动不了refs/heads/branchB。不过,两人都动了FETCH_HEAD。(您可以cat在其中的任何这些文件.git/中查看它们何时更改。)并且git mergeFETCH_HEAD在设置时参考MERGE_ORIG,等。

于 2011-01-17T23:32:11.757 回答
11

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

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

一种解释

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

如果您在一次提交之前领先于远程存储库,则远程存储库已过时,而不是您。

但是在您的情况下,如果git pull有效,那仅意味着您不在正确的分支上。

于 2010-04-08T18:52:49.023 回答
3

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

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

于 2010-04-08T18:54:12.267 回答
1

这些是命令:

git fetch origin
git merge origin/somebranch somebranch

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

git merge origin somebranch

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

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

于 2013-07-21T17:50:18.827 回答