如何从远程跟踪分支“混帐”和“混帐合并”(如“混帐拉”)

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

例如,假设我有一个叫做“另一个分支”的远程分支。 我在本地设置了一个跟踪分支

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完全一样的东西? 我会得到一些工作stream程,显示一个git状态的结果等

你不抓取一个分支,而是抓取一个完整的远程:

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

只select一个分支: fetch / merge pull

人们经常build议你将“取材”与“合并”分开。 他们说,而不是这个:

  git pull remoteR branchB 

做这个:

  git fetch remoteR git merge remoteR branchB 

他们没有提到的是,这样一个获取命令实际上会从远程回购中获取所有分支,这不是那个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

咦?

所有这一切的最好的解释是在ProGit, Git内部 – Refspec ( 或通过github )的第9-5章。 这很难通过谷歌find。

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

  1. 远程refs/heads/branchB的分支: refs/heads/branchB在其他refs/heads/branchB里面
  2. 您的远程追踪分支您的回购中的refs/remotes/remoteR/branchB
  3. 你自己的分支:在你的回购里面设置refs/heads/branchB

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

把'refs'看作C ++指针。 在物理上,它们是包含SHA摘要的文件,但基本上它们只是指向提交树的指针。 git fetch会将许多节点添加到你的commit-tree,但git如何决定要移动的指针有点复杂。

正如另一个答案中所提到的那样,

  git pull remoteR branchB 

也不

  git fetch remoteR branchB 

会移动refs/remotes/branches/branchB ,而后者肯定不能移动refs/heads/branchB 。 但是,既移动FETCH_HEAD 。 (你可以在.git/里面find这些文件中的任何一个,看看它们什么时候改变。)而git merge则会指向FETCH_HEAD ,同时设置MERGE_ORIG 等。

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

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

另一种解释是 :

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

如果你通过一个提交超前于远程回购,那么远程回购已经过时了,而不是你。

但在你的情况下,如果git pull作品,这只是意味着你不在正确的分支。

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

你确定你在正确的分支?

这些是命令:

 git fetch origin git merge origin/somebranch somebranch 

如果你在第二行这样做:

 git merge origin somebranch 

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

这个问题,正如我所理解的那样,你是在本地获取的,现在想把你的分支合并到最新的同一个分支上。