如何从远程跟踪分支“混帐”和“混帐合并”(如“混帐拉”)
我已经在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个不同的分支需要注意:
- 远程
refs/heads/branchB
的分支:refs/heads/branchB
在其他refs/heads/branchB
里面 - 您的远程追踪分支 : 您的回购中的
refs/remotes/remoteR/branchB
- 你自己的分支:在你的回购里面设置
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
它会尝试将本地主人合并到您当前的分支。
这个问题,正如我所理解的那样,你是在本地获取的,现在想把你的分支合并到最新的同一个分支上。