如何拉老支?

时间:2019-11-28 12:24:34

标签: git

我有几个分支,例如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分支?

3 个答案:

答案 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。该名称是分支名称,例如master12.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,然后
  • 获取所有他们的分支名称,例如masterdevelop,也许还有12.0等,然后将该短名称保留在 front中其分支名称

然后我们可以输入:

git fetch origin

并拥有我们的Git:

  1. 通过存储的网址调用他们的Git;
  2. 获取他们的提交;
  3. 记住其分支名称和哈希ID为origin/masterorigin/developorigin/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.012.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 pullgit fetch

请记住git pull只是

  1. 先运行origin master,然后
  2. 运行第二个Git命令,通常是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 pullgit pull传递给git fetch。在git pull --all中,--all表示从所有远程获取。它与要获取分支无关。默认是所有分支。永远不要使用git fetch 4

一些git fetch参数用于更改要使用的第二条命令 (合并与变基),还有一些在上传递给第二条命令()(例如--all的{​​{1}}消息)。但是,将远程名称(如果使用一个)和分支名称(如果使用一个)分配给git pull --all

第二个命令git pull-m始终 current 分支上运行。因此,这需要记住最后一件事: git merge始终是安全的,因为它不会修改您当前的分支。 git fetchgit merge适用于您当前的分支;并且git rebase都运行 ,因此它可以在您的 current 分支上运行。您可以随时从任何分支运行git fetch,但是运行git merge时,您必须位于 right 分支上。如果运行git rebase,则可以位于任何分支上,甚至可以位于 no 分支上。

如果您确实运行git pull,然后要合并或变基,则将在此处使用类似git fetch的名称:

git pull

请注意,即使git fetchgit fetchorigin/master合并或变基,也可以通过这种方式将名为git fetch git rebase origin/master 的分支变基到feature。如果使用单独的访存,您将获得更多的控制权,并且这些名称更有意义(无论如何对我而言),因为它们是远程跟踪名称,其后是origin/master。只有组合命令git pull才需要 other Git的分支名称。


3 实际上,默认值存储在名称feature下。 default 默认是所有分支,但是使用origin/featureorigin/,您可以告诉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