在 `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 fetch
和 git 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 master
,refs/heads/master
将映射到 refs/remotes/origin/master
。领先的 +
还告诉 Git 覆盖远程跟踪 b运行ch 而不管更改是否可以快进:毕竟,您通常希望您的远程跟踪b运行ches 匹配 exactly 遥控器上的状态,所以如果历史被重写(应该避免)或 b运行ches 被重命名,你会希望远程跟踪 b运行ches 仍然尊重这一点。
现在,当您指定 refspec(使用 git fetch
或 git 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.
假设我在 与 <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 fetch
和 git 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 master
,refs/heads/master
将映射到 refs/remotes/origin/master
。领先的 +
还告诉 Git 覆盖远程跟踪 b运行ch 而不管更改是否可以快进:毕竟,您通常希望您的远程跟踪b运行ches 匹配 exactly 遥控器上的状态,所以如果历史被重写(应该避免)或 b运行ches 被重命名,你会希望远程跟踪 b运行ches 仍然尊重这一点。
现在,当您指定 refspec(使用 git fetch
或 git 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.