如何从远程跟踪分支(如“ git pull”)“ git 获取”和“ git 合并”

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

例如,假设我有一个名为“ 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 提取”后跟一个“ git 合并”(如上所示)是否应该做与 git 拉取完全相同的事情?我会得到一些工作流程,显示一个 git 状态的结果等。

136437 次浏览

当您合并时,您确定是在本地 an-other-branch上吗?

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

返回文章页面 other explanation:

您试图合并的分支中的所有更改已经合并到您当前所在的分支中。
More specifically it means that the branch you’re trying to merge is a parent of your current branch

如果你领先远程回购一个提交,那么过时的是远程回购,而不是你。

但是在您的例子中,如果 git pull工作,那就意味着您不在正确的分支上。

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

你确定你在正确的树枝上吗?

You don't fetch a branch, you fetch an entire remote:

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

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

人们经常建议你把“获取”和“合并”分开,他们说:

    git pull remoteR branchB

这样做:

    git fetch remoteR
git merge remoteR branchB

他们没有提到的是,这样一个 get 命令实际上将从远程 repo 获取 所有分支,这是 没有,pull 命令执行的操作。如果您在远程回购中有成千上万个分支,但是您不想看到所有的分支,那么可以运行这个模糊的命令:

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

当然,这很难记住,所以如果您真的想避免获取所有分支,最好按 ProGit 中的描述更改 .git/config

啊?

The best explanation of all this is in Chapter 9-5 of ProGit, Git Internals-Refspec (或者通过 Github). That is amazingly hard to find via Google.

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

  1. 分支上的远程回购: refs/heads/branchB内的另一个回购
  2. 你的 远程跟踪分支: refs/remotes/remoteR/branchB你的回购
  3. 您自己的分支: refs/heads/branchB内部 你的回购

远程跟踪分支(在 refs/remotes中)是只读的。您不能直接修改它们。您修改自己的分支,然后在远程回购中推到相应的分支。直到适当的拉取操作之后,结果才会反映在 refs/remotes中。对我来说,从 git 手册页很难理解这种区别,主要是因为当 .git/config定义 branch.branchB.remote = remoteR时,本地分支(refs/heads/branchB)被称为“跟踪”远程跟踪分支。

可以将“ ref”看作是 C + + 指针。物理上,它们是包含 SHA 摘要的文件,但基本上它们只是指向提交树的指针。git fetch将向提交树添加许多节点,但是 git 如何决定要移动哪些指针有点复杂。

另一个答案中也没有提到

    git pull remoteR branchB

nor

    git fetch remoteR branchB

会移动 refs/remotes/branches/branchB,而后者肯定不能移动 refs/heads/branchB。但是,两者都移动 FETCH_HEAD。(您可以在 .git/中查看 cat中的任何这些文件的更改时间。)而 git merge在设置 MERGE_ORIG等等。时将参考 FETCH_HEAD

these are the commands:

git fetch origin
git merge origin/somebranch somebranch

如果你在第二行这样做:

git merge origin somebranch

它将尝试将本地主服务器合并到当前分支中。

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