git pull
命令是针对分支操作的吗?
在一个代码库中,运行git pull
命令时,会对不同的分支做出不同的响应吗?
如果在git pull
命令后没有指定任何参数,
- 它只会从远程
origin
同名分支拉取到当前分支吗? - 它是否对其他分支有影响?
谢谢。
git pull
命令是针对分支操作的吗?
在一个代码库中,运行git pull
命令时,会对不同的分支做出不同的响应吗?
如果在git pull
命令后没有指定任何参数,
origin
同名分支拉取到当前分支吗?谢谢。
git checkout branch1; git pull; git checkout branch2; git pull
或者:
git checkout branch1; git pull origin branch2 branch3
branch1
上运行git pull
,然后在branch2
上再次运行git pull
。这只是两次重复以下四个步骤之一,一次在branch1
上,然后再次在branch2
上执行:
在
git pull
后不指定任何参数时,
- 仅从远程
origin
的同名分支拉取到当前分支吗?- 是否对其他任何分支都有影响?
首先,让我们先解决第二部分,因为这很容易:“不会,只要您不谈论远程跟踪分支。”
接下来,我们需要注意一个假设:远程命名为origin
。您可以拥有多个远程,如果您这样做,显然最多只有一个被命名为origin
。即使您只有一个远程,也可以随意命名它。因此,远程是origin
的想法起点就有点摇摆不定。
(通常,它确实是origin
。大多数人只有一个远程,它被命名为origin
,因此只有一个远程,而不是“七个不同的远程之一”或其他什么。)
当您在没有参数的情况下运行git pull
时,Git将:
而后者则完全不同。 “何时使用这种形式”的简短答案是从不。长答案是“还没有:首先了解章鱼合并,然后重新阅读文档。然后,一旦您成为Git大师,您就会意识到您可能根本不应该直接使用git pull
进行章鱼合并,但至少现在您知道什么时候可以安全地使用git pull
。”
识别当前分支的上游。例如,branch1
的上游可能是origin/branch1
。请注意,这个上游有两个部分:
origin
。branch1
。
为了创建一个远程跟踪分支,Git会有效地将这两个部分粘在一起,这就是我们看到它为origin/branch1
的原因。但还是有这两个部分。
上游分支的名称与本地分支名称不必匹配。这只是一个好主意。
(当你有两个或多个远程时,有时必须违反这个“好主意”。假设,远程fred
有一个名为develop
的分支,而另一个远程susan
有一个名为develop
的分支。现在你的仓库中有fred/develop
和susan/develop
。你想对这两个做些什么;你将使用什么分支名称?也许你可以称其中一个为fred-develop
,另一个为susan-develop
。但现在上游名称不再与本地名称匹配:对于fred-develop
的上游是fred/develop
,而不是fred/fred-develop
。)
将此上游拆分为其两个部分:远程和在远程上看到的分支名称。
使用多个参数运行git fetch
。这个git fetch
步骤将使用远程的URL调用另一个Git。一旦你的Git在互联网电话上获得了外部Git,你的Git就会获取他们在他们的分支上拥有的任何新提交,而你还没有任何提交。
假设当前分支是branch1
,上游是origin/branch1
。如果你自己的Git不太古老(至少是版本1.8.4),则会更新你的origin/branch1
。(如果你的Git旧于那个版本,则git pull
提供的参数将防止更新你的远程跟踪分支。这不是很好的情况,你应该更新你的Git版本。它仍然可以工作,只是难以解释。如果你完全避免使用git pull
,那么Git 1.8.3及更早版本的奇怪方式就不再重要了,因为git fetch origin
会更新你的所有远程跟踪分支,即使在这些古老的Git版本中也是如此。)
现在,git fetch
在你的仓库中拥有了这些新提交,在你的origin/branch1
远程跟踪分支下,你已经准备好了。稍后的git fetch
将非常快速完成,因为你现在已经拥有这些新提交。
使用多个参数运
git merge
,它会影响到你的分支。当git merge
成功时,它通常会创建一个新的提交。与所有正常的Git命令一样,创建一个新的提交将该提交添加到你当前的分支。当git merge
执行快进而不是创建一个新的提交时,这也会影响到你当前的分支。git pull
运行git merge
时,git merge
步骤以与git merge
总是影响你当前分支相同的方式影响你当前的分支。
你可以要求git pull
运行不同的第二个命令。具体来说,你可以设置git pull
运行git rebase
而不是git merge
。要弄清楚这是什么意思,我们必须看看git rebase
做了什么,这更加复杂,但最终它也像git merge
一样影响你当前的分支。1因此,我们还可以这样说:当git pull
运行git rebase
时,git rebase
步骤以与git rebase
总是1影响你当前分支相同的方式影响你当前的分支。
当我们将所有这些事实结合起来时,我们最终看到git pull
的第二个命令是影响当前分支的。而且,它只影响当前分支,因为git merge
和git rebase
仅在当前分支上工作。
(第一个命令git fetch
会影响到远程跟踪分支。但由于这些只是你的Git记住从外部Git获取的内容,上次从该外部Git获取内容的方式,所以这不是很重要。)
最后,不要使用git pull
。使用git fetch
,然后根据fetch
中传入的内容选择使用哪个命令:git merge
或git rebase
。
1有一种方法可以使git rebase
影响另一个分支,但是-幸运的是-git pull
不使用它。(除非你知道自己在做什么,否则你可能也不应该使用它。这相当简单:它只是首先执行一个git checkout
到另一个分支名称,然后继续像你自己这样进行,并且没有指定额外的分支名称。)
pull
执行fetch
然后执行merge
。它只会在merge
部分更改您当前的 本地 分支,但是fetch
部分将更新所有其他远程分支(如果它们自上次获取以来有更改)。 - crashmstrgit pull
执行的git fetch
是一种受限制的获取方式,因此它只会更新一个远程跟踪分支。我认为有些人喜欢这样做,因为它避免了下载你不使用的分支的对象。在我使用的存储库中,没有必要避免下载这些对象,但有些人可能会以某种方式使用 Git,需要这样做。 - torek