远程存储库有一个分支,该分支在本地存储库中不存在。我需要获取它并开始使用它,而无需将其与我拥有的任何其他分支合并。我该怎么做?
TL;DR version
git fetch remote; git checkout branch
历史
git 设计者似乎故意混淆了这一点,但实际上这种混淆是由于 git 所走的进化路径。
在过去(在 git 版本 1.5 之前),您只需直接从另一个存储库中获取分支,每次都输入存储库的完整 URL。 正如您可能想象的那样,一直在长存储库路径中键入内容会迅速变老。 有一堆中间解决方案,然后有人想出了远程的想法:一个像origin
这样的短名称,您可以使用它来存储您可能想知道的有关其他 git 存储库的所有信息。
随之而来的是远程跟踪分支。 这里的想法是,如果你的 git 通过互联网电话调用另一个 git,花一些时间与它聊天并检索一大堆新东西,那么在你自己的存储库中,把他们提供给你的每个分支的记忆以及提交这些分支的记忆藏起来可能会很好。 这些是远程跟踪分支:origin/master
、origin/develop
等。
每当你运行git fetch origin
你的 git 手机时,他们的 git 就会拿起他们提供的任何新提交,并像origin/branch
一样松鼠离开他们所有的分支。 如果您以前没有它们,那么现在就有了。
签出远程跟踪分支
现在,您可以查看远程跟踪分支,但无法访问远程跟踪分支:
$ git checkout origin/develop
就像找到origin/develop
的提交 ID 一样:
$ git rev-parse origin/develop
39d22b9678b8c571aab6902620c95907d5bef2db
然后交给git checkout
:
$ git checkout 39d22b9678b8c571aab6902620c95907d5bef2db
Note: checking out '39d22b9678b8c571aab6902620c95907d5bef2db'.
You are in 'detached HEAD' state. ...
(唯一的区别是 git 可以使用名称origin/develop
如果你把它交给git checkout
——你仍然会收到"分离的 HEAD"消息。
创建本地分支
git checkout -b branch
将从当前提交开始创建并放置您到一个新的本地分支上。 这很好,但这意味着您必须先检查远程跟踪分支。 或者,您可以告诉git checkout -b
从何处开始新分支。 但是,您还应该将其设置为跟踪(如 git 所说)另一个分支,这将我们带到:
从远程跟踪分支创建本地分支
现在,棘手的一点是,一旦您有了origin/develop
(或其他一些origin/
限定的分支名称),您就可以使用相同的名称git checkout
一个常规的、普通的本地分支,即使您还没有。 Git 会注意到develop
(还)不是分支名称,因此它将扫描所有远程跟踪分支并发现只有一个匹配的名称(在本例中origin/develop
),并假设您的意思是"请创建一个新develop
并使其跟踪origin/develop
以便它最初以origin/develop
指向的相同提交开始"。
(这是一件很常见的事情,以至于 git 人员将其添加回 git 版本 1.6.6。
等等,本地分支机构跟踪远程跟踪分支机构?
是的。
但是,为什么它不是一个本地跟踪分支呢?
"本地"、"远程"和"跟踪"这些词已经出现了太多,更不用说"分支"这个词的多重含义了。 您希望本地跟踪分支跟踪远程跟踪分支? 如果您的本地分支机构跟踪另一个本地分支机构,会发生什么情况?:-) (是的,git 可以做到这一点。
说真的,术语有点奇怪。 它就是这样成长的。
其他一些事情
git branch
命令具有--set-upstream-to
和--unset-upstream
。 默认情况下,它们对当前分支或本地分支(如果指定一个分支)进行操作,并设置本地分支要跟踪的其他分支的名称(对于--set-upstream-to
),或者阻止本地分支跟踪它设置为跟踪的任何内容(对于--unset-upstream
)。 它们使用"上游"一词而不是短语远程跟踪分支,这是合理的,因为您可以将上游设置为另一个本地分支。 这就是您跟踪其他分支的方式(无论它是否是远程跟踪分支)。
让本地分支机构跟踪其他分支机构有什么好处? 何必呢?
它让git rebase
和git merge
知道要重新定位或合并什么,这样你就不必再次输入;它允许git status
计算你在本地分支上拥有的提交,而另一个分支没有(例如,ahead 3
)和/或他们有你没有的提交(例如,behind 12
)。 换句话说,这只是为了方便。 不过这很方便。 味道不错,对你有好处!
您只需键入:
git fetch <remote>
要从遥控器获取所有引用,
git checkout <remote>/<branch>
允许您将远程分支签出到"匿名"分支,
git checkout -b <new_local_branch>
基于您签出的远程分支创建本地分支。
您还可以将远程分支设置为上游:
git branch --set-upstream-to=<remote/branch> <new_local_branch>
我找到了一种方法。这个命令可以做到这一点:
git fetch remote branch_name:branch_name
我不是git
专家,但我想你可以切换到所需的分支,拉动它,然后从那里创建新分支。
换句话说:
git checkout remote_branch
git pull
git checkout -b new_branch
要获取远程分支,您可以使用:
git fetch remote_name
其中remote_name是正在使用的远程的名称,作为示例源。
此Git checkout -b new_branch
创建名称为"new_branch"的新分支
git pull origin remote_branch
将代码从remote_branch提取到new_branch
git checkout -b new_branch
git pull origin remote_branch
或者你可以试试
git checkout -b <branch> --track <remote>/<branch>
参考资料