假设我在一个与<local-branch>不同的分支,称为<different-branch>。
当我试图从远程分支提取到本地分支时,我会执行以下操作:
git pull origin <remote-branch>:<local-branch>而且,根据我的理解,这应该是我的<local-branch>,而不是<different-branch>。
但是,当我在<different-branch>上检查<different-branch>时,我发现这些提交来自<remote-branch>?
当本地分支与我当前拍摄的分支不同时,如何从远程分支拉入本地分支?谢谢。
发布于 2015-08-23 13:52:34
使用带refspec的git pull不会影响拉命令的合并部分。您可能知道,git pull本质上只是git fetch和git merge的组合;首先,它将从远程获取最新的更改并更新远程跟踪分支,然后将远程跟踪分支合并到当前的分支中。
现在,正如我所说的,重构规范不影响合并部分,但它只影响git pull内部的获取。现在,要理解这最终意味着什么,您首先必须了解refspec是什么。
refspec基本上只是一个远程分支映射到哪个远程跟踪分支的配置。远程分支在这里--实际上存在于远程上的分支,而远程跟踪分支是为跟踪远程分支的状态而创建的分支;对于一个称为“原产地”的远程分支,其远程跟踪分支都是从origin/开始的。
如果您不明确地指定refspec,则从配置文件中提取它。默认表单通常如下所示:
+refs/heads/*:refs/remotes/origin/*这告诉Git获取位于refs/heads/*的远程分支,并将它们映射到位于refs/remotes/origin/*的远程跟踪分支。因此,对于远程分支master,refs/heads/master将映射到refs/remotes/origin/master。领先的+还告诉Git覆盖远程跟踪分支,而不管更改是否可以快速转发:毕竟,您通常希望远程跟踪分支与远程上的状态完全匹配,因此,如果在那里重写历史记录(应该避免)或重新命名分支,您会希望远程跟踪分支仍然尊重这一点。
现在,当您指定refspec (使用git fetch或git pull)时,默认映射将被覆盖。相反,您的映射被使用。例如,当您使用git fetch origin master:foo时,本地分支foo会被快速转发(如果可能的话)指向远程分支master。因此,这实际上是更新本地分支的一种很好的方法,而不必检查它:如果您忽略了领先的+,那么更新本地ref (分支)将失败,如果它不是快速转发合并,那么您也可以避免冲突。
但是回到git pull-what时,您运行命令时发生了什么?正如我所说的,拉只是一个提取和合并,所以您的git pull命令首先执行了以下操作:
git fetch origin <remote-branch>:<local-branch>因此,远程分支从远程获取,如果是快速转发合并,则更新本地分支。这已经实现了您想要的结果:更新<local-branch>。
但是,会发生git pull的合并部分;而Git通常会为此目的运行git merge FETCH_HEAD。FETCH_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一起使用即可。它将在不影响当前分支的情况下正确更新本地分支(如果可能)。
发布于 2015-08-21 19:14:00
你总能走低科技路线:
git fetch origin #fetches all the remote branches
git checkout <local-branch>
git merge origin/<remote-branch>或者如果你练习重垒拉
git rebase -i origin/<remote-branch> <local-branch>发布于 2015-08-21 19:19:30
如果还想跟踪远程分支,可以使用以下方法:
git checkout --track -b local-branch origin/remote-branch
如果远程分支是在上次获取之后创建的,则可能需要首先运行git fetch。
https://stackoverflow.com/questions/32147716
复制相似问题