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

Using colon in `git pull origin <remote-branch> : <local-branch>` does not pull to correct branch?

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

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

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

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

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

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

你总是可以使用低技术:

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

或者如果你练习 rebase pulls

git rebase -i origin/<remote-branch> <local-branch>

如果你也想跟踪远程分支,你可以使用以下方法:

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

如果远程分支是在您上次获取之后创建的,您可能需要先 运行 git fetch

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

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

refspec 基本上只是远程 b运行ches 映射到远程跟踪 b运行ch 的配置。这里的remote b运行ches是remote上实际存在的b运行ches,remote-tracking b运行ches是创建的b运行ches跟踪远程 b运行ches 的状态;对于名为“origin”的遥控器,它的远程跟踪 b运行ches 都以 origin/.

开头

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

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

这告诉 Git 获取位于 refs/heads/* 的远程 b运行ches 并将它们映射到位于 [=19= 的远程跟踪 b运行ches ].因此对于远程 b运行ch masterrefs/heads/master 将映射到 refs/remotes/origin/master。领先的 + 还告诉 Git 覆盖远程跟踪 b运行ch 而不管更改是否可以快进:毕竟,您通常希望您的远程跟踪b运行ches 匹配 exactly 遥控器上的状态,所以如果历史被重写(应该避免)或 b运行ches 被重命名,你会希望远程跟踪 b运行ches 仍然尊重这一点。

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

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

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

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

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

因此,当您在 <different-branch> 和 运行 git pull origin <remote-branch>:<local-branch> 上时,您将正确更新 <local-branch> 以匹配远程 b运行ch,但是然后您还将这些更改合并到当前的 b运行ch,<different-branch>。这就是为什么你在当前b运行ch的日志中看到那个b运行ch的变化;他们只是合并了。

如果你想避免这种情况,按照我上面的解释,只需将 git fetch 与 refspec 一起使用。它已经正确地更新本地 b运行ch(如果可以)而不影响当前 b运行ch.