在`git pull origin <remote-branch>:<local-branch>`中使用冒号不会拉到正确的分支?

时间:2015-08-21 19:08:34

标签: git github version-control git-merge git-pull

我们说我在不同的分支而不是<local-branch>,称为<different-branch>

当我尝试从远程分支拉到本地分支时,我会执行以下操作:

git pull origin <remote-branch>:<local-branch>

而且,根据我的理解,这应该引入我的<local-branch>,而进入<different-branch>

但是,当我在git log上查看<different-branch>时,我发现这些提交来自<remote-branch>

当本地分支与我当前所在的分支不同时,如何从远程分支拉入本地分支?谢谢。

3 个答案:

答案 0 :(得分:7)

git pull与refspec一起使用不会影响pull命令的合并部分。您可能知道,git pull基本上只是git fetchgit merge的组合;首先,它将从远程获取最新的更改并更新远程跟踪分支,然后它将该远程跟踪分支合并到当前分支

现在,正如我所说,refspec不会影响合并部分,但它只影响git pull内的提取。现在要了解这最终意味着什么,首先要了解refspec是什么。

refspec基本上只是远程分支映射到哪个远程跟踪分支的配置。远程分支在这里是实际存在于远程分支上的分支,远程跟踪分支是为跟踪远程分支的状态而创建的分支;对于名为“origin”的远程,其远程跟踪分支都以origin/开头。

如果没有明确指定refspec,则从配置文件中获取。默认表单通常如下所示:

+refs/heads/*:refs/remotes/origin/*

这告诉Git获取位于refs/heads/*的远程分支,并将它们映射到位于refs/remotes/origin/*的远程跟踪分支。因此,对于远程分支masterrefs/heads/master将映射到refs/remotes/origin/master。领先+还告诉Git覆盖远程跟踪分支,无论更改是否可以快速转发:毕竟,您通常希望远程跟踪分支与完全匹配遥控器上的状态,所以如果在那里重写历史记录(应该避免)或重命名分支,你会希望远程跟踪分支仍然尊重它。

现在,当您指定refspec(使用git fetchgit pull)时,将覆盖默认映射。而是使用您的映射。例如,当您使用git fetch origin master:foo时,会快速转发本地分支foo(如果可能)以指向远程分支master。所以这实际上是一种更新本地分支的好方法,而不必检查它:如果省略前导+,那么如果它不是快进合并,则更新本地ref(分支)将失败,所以你也可以安全地抵御冲突。

但是回到git pull - 当你运行命令时发生了什么?正如我所说,拉取只是一个提取和合并,所以你的git pull命令首先这样做:

git fetch origin <remote-branch>:<local-branch>

因此远程分支从远程获取,本地分支更新 - 如果它是快进合并。这已经完全符合您的要求:更新<local-branch>

然而,git pull的合并部分发生了;为此,Git通常运行git merge FETCH_HEADFETCH_HEAD是对最后提取的分支的引用。在这种情况下,它指向<local-branch>。因此,在获取<local-branch>之后,正在执行的命令是git merge <local-branch>。运行git merge将合并到当前分支

因此,当您使用<different-branch>并运行git pull origin <remote-branch>:<local-branch>时,您将正确更新<local-branch>以匹配远程分支,但您也会将这些更改合并到当前分支中, <different-branch>。这就是为什么你在当前分支的日志中看到该分支的变化;他们只是合并。

如果你想避免这种情况,根据我的解释,只需使用git fetch和refspec。它将正确更新本地分支(如果可以),而不会影响当前分支。

答案 1 :(得分:2)

你总是可以走低技术:

public class mysubclass extends mysupclass {

    public mysubclass (mysupclass a, mysupclass b) {
         //call to constructor of superclass
         mysupclass(a,b);
        // code here
    }
}

或者如果你练习rebase pulls

git fetch origin #fetches all the remote branches
git checkout <local-branch>
git merge origin/<remote-branch>

答案 2 :(得分:2)

如果您还想跟踪远程分支,可以使用以下内容:

git checkout --track -b local-branch origin/remote-branch

如果在上次提取后创建了远程分支,则可能需要先运行git fetch

相关问题