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

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

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

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

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

而且,根据我的理解,这应该纳入我的 <local-branch> ,并且 pull 入<different-branch> .

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

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

最佳答案

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

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

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

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

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

这告诉 Git 获取位于 refs/heads/* 的远程分支并将它们映射到位于 refs/remotes/origin/* 的远程跟踪分支.所以对于远程分支master , refs/heads/master将映射到 refs/remotes/origin/master .龙头+还告诉 Git 覆盖远程跟踪分支,而不管更改是否可以快进:毕竟,您通常希望远程跟踪分支完全匹配远程上的状态,因此,如果历史在那里被重写(应该避免)或分支被重命名,您会希望远程跟踪分支仍然尊重它。

现在,当您指定 refspec(使用 git fetchgit pull )时,默认映射将被覆盖。相反,您的映射被使用。例如,当您使用 git fetch origin master:foo , 然后是本地分支机构 foo快进(如果可能)指向远程分支 master .所以这实际上是更新本地分支的好方法,而不必检查它:如果你遗漏了前导 + ,如果不是快进 merge ,则更新本地 ref(分支)将失败,因此您也可以避免冲突。

但回到 git pull ——运行命令时发生了什么?正如我所说, pull 只是获取和 merge ,所以你的 git pull命令首先执行此操作:

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

所以远程分支是从远程获取的,本地分支是更新的——如果是快进 merge 的话。这已经完全符合您的要求:更新 <local-branch> .

但是,git pull 的 merge 部分发生; Git 通常运行 git merge FETCH_HEAD以此目的。 FETCH_HEAD是对最后获取的分支的引用。在本例中,它指向 <local-branch>。 .所以在取入<local-branch>之后,正在执行的命令是git merge <local-branch> .并运行 git merge将 merge 到当前分支

所以当你在 <different-branch>然后运行 ​​git pull origin <remote-branch>:<local-branch>那么您将正确更新 <local-branch>以匹配远程分支,但随后您还将这些更改 merge 到当前分支中,<different-branch> .这就是为什么你会在当前分支的日志中看到该分支的更改;它们只是 merge 了。

如果你想避免这种情况,按照我上面的解释,只需使用 git fetch与refspec。它会在不影响当前分支的情况下正确更新本地分支(如果可以的话)。

关于git - 在 `git pull origin <remote-branch> : <local-branch>` 中使用冒号不会 pull 到正确的分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32147716/

相关文章:

git - 一个 git remote 知道另一个吗?

svn - svn2git错误:[svn远程“svn”]未知

SVN:供应商分支+补丁+历史?

git - 如何根据我的 .gitignore 文件取消跟踪 Git 中的文件?

git - 有没有工具可以让 git 在图表中显示 "detached heads"?

git - 如何跳过推送事件的 GitHub Actions 作业?

html - Markdown - 标题左侧的图标

git - 如何重新 merge 在 github 中还原的提交?

bash - 其他类型文件的版本控制? (非源代码文件)

git - 在 git 别名中包含当前分支