我有几个分支,例如master,12.0和13.0。 13.0领先于12.0,再次领先于master。
在本地我只有分支13.0,这是远程分支的最新版本。
现在我也想在本地拥有12.0分支。
因此,我输入git checkout -b 12.0
,然后输入git pull origin 12.0
。但是,第一个命令会基于13.0创建一个本地分支12.0,因此git pull
会产生错误。
那么如何在本地计算机上获取远程12.0分支?
答案 0 :(得分:2)
在其他文件夹中单独使用此命令可拉出该特定分支。
git pull origin --branch <your branch name>
如果要在同一项目文件夹中拉出该分支,请使用:
git fetch origin <your branch name>
git checkout <your branch name>
如果遇到任何错误,请尝试
git checkout -b <your branch name> --track origin/<your branch name>
答案 1 :(得分:1)
在这种情况下,似乎基于your own comment,答案是首先创建一个远程:
在进行以下更改后,它起作用了:我实际上是使用仓库的URL而不是“ origin”。设置git远程原点,然后使用命令中的“ origin”再次实际尝试。
值得一提的是为什么这是使用Git的方式。
Git实际上主要是关于 commits 。每个提交都有一个唯一的哈希ID,并且当两个不同的Git存储库共享提交时,它们会通过这些唯一的哈希ID 共享它们。 (因此,所有Git存储库对相同的提交都使用相同哈希ID。要查看您是否具有提交 H ,对于某些哈希ID H , Git只是检查您是否具有该哈希ID。)
请注意,我们使用git fetch
(从另一个Git 获取东西)和git push
(将东西给另一个Git )。 git pull
命令仅表示:运行git fetch
(获取东西),然后运行第二个Git命令(以合并刚刚获取的东西)。 Git将获得或提供的“东西”是一些Git内部对象,从提交对象(和/或标签对象)开始,然后包括使这些提交对象完整所需的任何其他东西。 (这些内部对象也具有哈希ID。所有这些哈希ID大而丑陋,并且 look 完全是随机的。)
但是由于许多原因,包括人类难以记住原始哈希ID的事实,我们和Git一起使用 name 来记住 last 某个分支的哈希ID。该名称是分支名称,例如master
或12.0
或其他名称。当您连接两个Git时,一个Git会 see 另一个分支的名称-但这仅是我们 see 了。因此,无论您运行git fetch
还是运行git pull
来让Git为您运行git fetch
,您的Git都会通过某个URL调用其他Git,并且请参见其所有分支名称。然后,您的Git可以使用其分支名称所附的哈希ID获得 commits 。
因此,您可以运行:
git fetch <url> <branch-name>
会调用他们的 Git,并在必要和适当的情况下获取一组提交,将这些提交填充到您自己的存储库中。在您的存储库中,每个此类提交将具有与其存储库中相同的哈希ID。如果将这些提交传递到另一个Git存储库,它们将继续具有相同的哈希ID。但是您的Git暂时不会保存他们的分支名称-嗯,不是任何永久和有用的分支名称。这些分支名称是他们的名称,而不是您的名字。
在诸如origin
之类的远程想法出现之前的糟糕年代,这就是您拥有的 all 。您的Git会通过URL调用他们的Git,获取他们的提交,然后将它们放入您的存储库中。您的Git不会永久保存其分支名称-但是您的Git 会将一些信息写到名为.git/FETCH_HEAD
的文件中。该文件将列出其分支名称和哈希ID,这些ID一直持续到下一个git fetch
。
有人注意到,如果您的Git 保存其Git的分支名称,这将非常有用。但是:我们可以在哪里保存它们?我们不能覆盖我们的分支。如何保存“网址U的分支B”?另外,为什么我们必须输入scheme://some.long.host.name/some/long/path/to/repo.git
所有的项目?如果我们为URL使用 short 短名称会不会很方便?
如果我们:
origin
来保存URL,然后master
和develop
,也许还有12.0
等,然后将该短名称保留在 front中其分支名称然后我们可以输入:
git fetch origin
并拥有我们的Git:
origin/master
和origin/develop
和origin/12.0
,依此类推。现在,我们有一种简单方便的方式来谈论他们的 master
:我们的origin/master
是远程跟踪名称 1 记住origin
的{{1}}。我们的master
是一个记住origin/develop
的{{1}}的远程跟踪名称,而我们的origin
是一个记住develop
的{ {1}}。
现在我们有了这些方便的远程跟踪名称,我们可以(和Git员工一样)使用增强origin/12.0
,以便它可以从创建一个本地分支 em>远程跟踪名称。现在,您可以这样做:
origin
,您的Git会对自己说:*嗯,我没有一个名为12.0
的分支。但是我确实有一个git checkout
,看起来不错!现在,让我根据我现在记得通过git checkout 12.0
记住的提交 create 12.0
,然后切换到该分支!*
这就是远程跟踪名称的优点。他们记得您其他(同级)Git的分支名称,并且使您轻松创建自己的分支名称以反映它们的名称。如果您的分支机构名称和远程跟踪名称(您的分支机构名称的副本)分开,它们还可以让您的Git找出类似origin/12.0
或12.0
之类的东西。
请注意,您现在必须运行origin/12.0
,然后让您的Git调用其Git并更新其Git分支名称的Git副本。您可以自己运行ahead 1
,也可以让behind 3
运行它。 2
1 Git文档将其称为远程跟踪分支名称,但我发现这里似乎省略了 branch 一词。工作更好。它有助于避免这些事物与常规(真实,本地)分支名称之间的混淆。您可以自己决定是每次都将其称为远程跟踪分支名称,还是使用稍短的短语 remote-tracking name 。
2 出于许多原因,我更喜欢自己运行git fetch
。我不会讲大部分内容,例如git fetch
在糟糕的过去摧毁了工作的日子后仍然留下的伤痕。
git pull
与git fetch
请记住git pull
只是
origin master
,然后origin/master
。 git pull
命令需要知道:从哪里获取?这可以是URL,或者-更好的是,因为我们刚刚看到的原因-远程的名称就像git fetch
。例如,这将变成git merge
。
但是,当我们执行git fetch
时,我们将在origin
(或其URL)上调用Git,并获得其分支的列表。我们要提取哪些分支?
默认为自动获取所有分支。 3 通常,这是最好的选择,但是如果您急着需要一些上游存储库,在分支名称的很多上提交的很多,您可以 限制此git fetch origin
仅进行更新一个远程跟踪名称,通过:
git fetch origin
您在这里使用的 origin
是其分支名称!因此,如果您想限制git fetch
仅从其git fetch origin <name>
中提取任何新提交,并仅更新name
,则可以运行git fetch
。
这是您与develop
一起使用的语法,因为在大多数情况下,origin/develop
只会将您的参数传递给git fetch origin develop
。因此,git pull
将git pull
传递给git fetch
。在git pull --all
中,--all
表示从所有远程获取。它与要获取分支无关。默认是所有分支。永远不要使用git fetch
。 4
一些git fetch
参数用于更改要使用的第二条命令 (合并与变基),还有一些在上传递给第二条命令()(例如--all
的{{1}}消息)。但是,将远程名称(如果使用一个)和分支名称(如果使用一个)分配给git pull --all
。
第二个命令git pull
或-m
– 始终在 current 分支上运行。因此,这需要记住最后一件事: git merge
始终是安全的,因为它不会修改您当前的分支。 git fetch
或git merge
适用于您当前的分支;并且git rebase
都运行 ,因此它可以在您的 current 分支上运行。您可以随时从任何分支运行git fetch
,但是运行git merge
时,您必须位于 right 分支上。如果运行git rebase
,则可以位于任何分支上,甚至可以位于 no 分支上。
如果您确实运行git pull
,然后要合并或变基,则将在此处使用类似git fetch
的名称:
git pull
请注意,即使git fetch
将git fetch
与origin/master
合并或变基,也可以通过这种方式将名为git fetch
git rebase origin/master
的分支变基到feature
。如果使用单独的访存,您将获得更多的控制权,并且这些名称更有意义(无论如何对我而言),因为它们是远程跟踪名称,其后是origin/master
。只有组合命令git pull
才需要 other Git的分支名称。
3 实际上,默认值存储在名称feature
下。 default 默认是所有分支,但是使用origin/feature
或origin/
,您可以告诉Git某些特定的远程对象应该默认为仅一个分支。使用git pull
,您可以编辑分支列表,并告诉Git默认值是获得两个特定分支,或三个,或任何其他分支。或者,您可以使用origin
并在git clone --single-branch
下查看原始的 refspec 设置,但在此我们将不涉及所有详细信息。
4 “什么,从来没有?”好吧,几乎没有? ?认真的说,人们总是认为这意味着所有分支机构。没有。不要使用它,否则您将陷入陷阱。这不是一个可怕的陷阱,因为从所有遥控器获取实际上并没有有害,这很愚蠢,就像本脚注的开头一样。但这也不会覆盖单分支克隆或远程服务器的单分支功能。
答案 2 :(得分:0)
您可以执行以下操作,而不是git checkout -b 12.0
:
git fetch origin 12.0
git checkout 12.0