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

  显示原文与译文双语对照的内容

假设我在一个与 <local-branch> 不同的分支上,称为 <different-branch>

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


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



我认为这应该拉进我的<local-branch>,而不是拉进 <different-branch>

但是,当我在 <different-branch> 上检查 git log 时,我看到那些提交来自 <remote-branch>

当本地分支与当前的分支不同时,如何从远程分支中拉出一个本地分支。 谢谢你。

时间:

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

现在,就像我所说,refspec并不影响合并部分,但它只影响在 git pull 内的提取 。 现在要理解最终的含义,你首先必须了解refspec是什么。

refspec基本上就是远程分支映射到哪个远程跟踪分支的配置。 这些远程分支在远程存在,远程跟踪分支是跟踪远程分支状态的分支;远程跟踪分支是用来跟踪远程分支的所有分支。

如果不指定 refspec explicitely,则从配置文件中获取它。 默认表单通常如下所示:


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



这告诉Git获取位于 refs/heads/*的远程分支,并将它们映射到位于 refs/remotes/origin/*的远程跟踪分支。 因此,对于远程分支 masterrefs/heads/master 将映射到 refs/remotes/origin/master 。 前导 + 还告诉Git覆盖远程跟踪分支,无论更改是否可以快速转发或者不是: 如果你想让远程跟踪分支匹配 ,那么在远程的状态下,如果历史被重写,那么你会希望远程跟踪分支仍然尊重你。

现在,在指定 refspec ( 使用 git fetch 或者 git pull ) 时,将重写默认映射。 相反,你的映射使用。 例如当你使用 git fetch origin master:foo 然后,本地分支 foo 快速转发( 如果可能的话) 以指向远程分支 master 。 所以这实际上是更新本地分支的一个好方法,而不必检查它: 如果退出前导 +,则更新本地,( 分支) 将失败,如果不是快进合并,也可以安全地冲突。

但是当你运行命令时又回到 git pull —what? 如我所说,拉拉只是一个提取和合并,所以你的git pull 命令首先执行这个操作:


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



所以远程分支从远程获取,本地分支是 updated—if,它是一个快速的前进合并。 这已经完全完成了你想要的操作: 更新 <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> 。 这就是为什么在当前分支的日志中看到该分支的变化,它们只是合并在一起。

如果你想避免这样做,按照上面的解释,只需在refspec中使用 git fetch 。 它将在不影响当前分支的情况下正确地更新本地分支。

...