[英]How to decompose git pull <REMOTE> <BRANCH> into a fetch + merge?
[英]How Do I 'git fetch' and 'git merge' from a Remote Tracking Branch (like 'git pull')
我在git中设置了一些远程跟踪分支,但是一旦用'git fetch'更新它们,我似乎永远无法将它们合并到本地分支中。
例如,假设我有一个名为'an-other-branch'的远程分支。 我在本地设置为跟踪分支使用
git branch --track an-other-branch origin/an-other-branch
到现在为止还挺好。 但是如果该分支得到更新(通常是我移动机器并从该机器提交),并且我想在原始机器上更新它,我遇到了fetch / merge的问题:
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状态等结果的工作流程。
您没有获取分支,您获取整个远程:
git fetch origin
git merge origin/an-other-branch
fetch
/ merge
与 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 - The Refspec ( 或通过github )。 通过谷歌很难找到。
首先,我们需要澄清一些术语。 对于远程分支跟踪,通常有3个不同的分支需要注意:
refs/heads/branchB
上的分支: refs/heads/branchB
在另一个refs/heads/branchB
内 refs/remotes/remoteR/branchB
中的refs/remotes/remoteR/branchB
refs/heads/branchB
远程跟踪分支(在refs/remotes
)是只读的。 您不直接修改它们。 您修改自己的分支,然后推送到远程仓库的相应分支。 在适当的拉取或取出之前,结果不会反映在你的refs/remotes
。 我从git man-pages中很难理解这种区别,主要是因为当.git/config
定义branch.branchB.remote = remoteR
时,本地分支( refs/heads/branchB
)被称为“跟踪”远程跟踪分支。 branch.branchB.remote = remoteR
。
将'refs'想象成C ++指针。 从物理上讲,它们是包含SHA消化的文件,但基本上它们只是指向提交树的指针。 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_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
它会尝试将本地主服务器合并到您当前的分支机构中。
正如我所理解的那样,问题是你已经在本地获取并希望现在将你的分支合并到最新的同一分支。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.