我怎么从远程跟踪分支''git fetch'和'git merge'(比如'git pull')

kay*_*oll 111 git git-pull git-merge git-fetch

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

例如,假设我有一个名为'an-other-branch'的远程分支.我在本地设置为跟踪分支使用

git branch --track an-other-branch origin/an-other-branch
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但是如果该分支得到更新(通常是我移动机器并从该机器提交),并且我想在原始机器上更新它,我遇到了fetch/merge的问题:

git fetch origin an-other-branch
git merge origin/an-other-branch
Run Code Online (Sandbox Code Playgroud)

每当我这样做时,我都会得到一条"已经是最新的"消息,并且没有任何合并.

但是,一个

git pull origin an-other-branch
Run Code Online (Sandbox Code Playgroud)

总是像你期望的那样更新它.

另外,运行git diff

git diff origin/an-other-branch
Run Code Online (Sandbox Code Playgroud)

表明存在差异,所以我认为我的语法错了.

我究竟做错了什么?

编辑[2010-04-09]:我已经检查了几次,我肯定不在另一个分支上.我的'git fetch'后跟'git merge'(如上所示)是否应该与git pull完全相同?我将得到一些显示git状态等结果的工作流程.

Gar*_*eth 169

您没有获取分支,您获取整个远程:

git fetch origin
git merge origin/an-other-branch
Run Code Online (Sandbox Code Playgroud)

  • 更多细节:`git fetch origin an-other-branch`将获取的提示存储在`FETCH_HEAD`中,但不存储`origin/an-other-branch`(即通常的'远程跟踪分支').所以,人们可以做`git fetch origin an-other-branch && git merge FETCH_HEAD`,但是像@Gareth那样做更好(或者只是使用*git pull*). (8认同)
  • 当然.如果我已经添加了一个带有1000个分支的远程存储库,我会问这个遥控器有什么分支,它该死的**更好**给我全部1000个 (4认同)

cdu*_*001 68

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

人们经常建议你将"取出"与"合并"分开.他们说而不是这个:

    git pull remoteR branchB
Run Code Online (Sandbox Code Playgroud)

做这个:

    git fetch remoteR
    git merge remoteR branchB
Run Code Online (Sandbox Code Playgroud)

他们没有提到的是这样的fetch命令实际上将从远程仓库获取所有分支,这不是 pull命令所做的.如果远程仓库中有数千个分支,但您不想查看所有分支,则可以运行此命令:

    git fetch remoteR refs/heads/branchB:refs/remotes/remoteR/branchB
    git branch -a  # to verify
    git branch -t branchB remoteR/branchB
Run Code Online (Sandbox Code Playgroud)

当然,这是非常难以记住的,所以如果你真的想避免获取所有分支,最好改变你.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 man-pages中很难理解这种区别,主要是因为本地branch(refs/heads/branchB)被称为在.git/config定义时"跟踪"远程跟踪分支branch.branchB.remote = remoteR.

将'refs'想象成C++指针.从物理上讲,它们是包含SHA消化的文件,但基本上它们只是指向提交树的指针.git fetch将向您的提交树添加许多节点,但git如何决定要移动的指针有点复杂.

另一个答案所述,两者都没有

    git pull remoteR branchB
Run Code Online (Sandbox Code Playgroud)

也不

    git fetch remoteR branchB
Run Code Online (Sandbox Code Playgroud)

会动refs/remotes/branches/branchB,而后者肯定不会动refs/heads/branchB.然而,两者都是举动FETCH_HEAD.(你可以cat任意里面的这些文件.git/时看到他们改变的.)git merge将参考FETCH_HEAD等,同时设定MERGE_ORIG,等等.


Von*_*onC 9

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

git fetch origin an-other-branch
git checkout an-other-branch
git merge origin/an-other-branch
Run Code Online (Sandbox Code Playgroud)

其他的解释:

您尝试合并的分支的所有更改已合并到您当前所在的分支.
更具体地说,它意味着您尝试合并的分支是您当前分支的父分支

如果你通过一次提交超过了远程仓库,那就是过时的远程仓库,而不是你.

但在你的情况下,如果git pull有效,那就意味着你不在正确的分支上.