Can*_*ic3 5 git version-control github git-pull git-merge
假设我在一个不同的 分支上,而不是<local-branch>被称为<different-branch>.
当我尝试从远程分支拉到本地分支时,我执行以下操作:
git pull origin <remote-branch>:<local-branch>
Run Code Online (Sandbox Code Playgroud)
而且,从我的理解,这应该拉入我的<local-branch>,而不是拉入<different-branch>.
但是,当我git log在上班时检查时<different-branch>,我看到那些提交来自<remote-branch>?
当本地分支与我当前所在的分支不同时,如何从远程分支拉入本地分支?谢谢.
pok*_*oke 10
使用git pullrefspec不会影响pull命令的合并部分.正如你可能知道,git pull基本上是只是一个组合git fetch和git merge; 首先,它将从远程获取最新的更改并更新远程跟踪分支,然后它将该远程跟踪分支合并到当前分支中.
现在,正如我所说,refspec不会影响合并部分,但它只会影响内部的提取git pull.现在要了解这最终意味着什么,首先要了解refspec是什么.
refspec基本上只是远程分支映射到哪个远程跟踪分支的配置.远程分支在这里是实际存在于远程分支上的分支,远程跟踪分支是为跟踪远程分支的状态而创建的分支; 对于一个名为"origin"的远程,它的远程跟踪分支都从一开始origin/.
如果未明确指定refspec,则从配置文件中获取.默认表单通常如下所示:
+refs/heads/*:refs/remotes/origin/*
Run Code Online (Sandbox Code Playgroud)
这告诉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当你运行命令时发生了什么?正如我所说,拉动只是一个提取和合并,所以你的git pull命令首先这样做:
git fetch origin <remote-branch>:<local-branch>
Run Code Online (Sandbox Code Playgroud)
因此,远程分支从远程获取,本地分支更新 - 如果它是快进合并.这已经完全符合您的要求:更新<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 fetchrefspec.它将正确更新本地分支(如果可以),而不会影响当前分支.
| 归档时间: |
|
| 查看次数: |
1373 次 |
| 最近记录: |