git pull 操作会在当前分支上执行吗?

10

git pull命令是针对分支操作的吗?

在一个代码库中,运行git pull命令时,会对不同的分支做出不同的响应吗?

如果在git pull命令后没有指定任何参数,

  • 它只会从远程origin同名分支拉取到当前分支吗?
  • 它是否对其他分支有影响?

谢谢。


我认为它不会干扰其他分支。而且我认为它合并的不是同名分支,而是由当前分支“跟踪”的分支(这个分支不一定与当前分支同名)。 - eftshift0
https://git-scm.com/docs/git-pull - eftshift0
1
pull 执行 fetch 然后执行 merge。它只会在 merge 部分更改您当前的 本地 分支,但是 fetch 部分将更新所有其他远程分支(如果它们自上次获取以来有更改)。 - crashmstr
@crashmstr:git pull 执行的 git fetch 是一种受限制的获取方式,因此它只会更新一个远程跟踪分支。我认为有些人喜欢这样做,因为它避免了下载你不使用的分支的对象。在我使用的存储库中,没有必要避免下载这些对象,但有些人可能会以某种方式使用 Git,需要这样做。 - torek
以上两个答案都很好。Adrianoplis的第二个答案是“正确”的答案,它很简短并回答了问题。torek的第一个答案非常长,但也是“正确和完整”的,同时也说明了为什么一些非常聪明的人会害怕git,以及为什么仍然需要一个好的教程来简单地解释使用git的简单事情,并提供一组简单的用例转换图。 - Dennis G Allard
2个回答

8
首先,不要使用git pull命令。这个命令永远不需要,并且如果你避免使用它直到你成为Git大师,你会更好。但是如果你坚持使用它,因为它很方便——而且确实很方便——请记住它只运行git fetch命令,然后根据各种情况,通常运行git merge命令。
“git pull”命令在分支上操作,但最好将其视为运行两个Git命令,因为这就是“git pull”的作用所在。
关于在库中在不同分支上运行git pull命令是否会有不同的效果,这个问题不是很清楚。您可能的意思是:在不同分支上运行git pull命令会有不同的效果吗?
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。”

  1. 识别当前分支的上游。例如,branch1的上游可能是origin/branch1。请注意,这个上游有两个部分:

    • 远程名称,例如origin
    • 在远程上找到的分支的名称,例如branch1


    为了创建一个远程跟踪分支,Git会有效地将这两个部分粘在一起,这就是我们看到它为origin/branch1的原因。但还是有这两个部分。

    上游分支的名称与本地分支名称不必匹配。这只是一个好主意

    (当你有两个或多个远程时,有时必须违反这个“好主意”。假设,远程fred有一个名为develop的分支,而另一个远程susan有一个名为develop的分支。现在你的仓库中有fred/developsusan/develop。你想对这两个做些什么;你将使用什么分支名称?也许你可以称其中一个为fred-develop,另一个为susan-develop。但现在上游名称不再与本地名称匹配:对于fred-develop的上游是fred/develop,而不是fred/fred-develop。)

  2. 将此上游拆分为其两个部分:远程和在远程上看到的分支名称

  3. 使用多个参数运行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将非常快速完成,因为你现在已经拥有这些新提交。

  4. 使用多个参数运

    这个过程的最后一步通常是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 mergegit rebase仅在当前分支上工作。

    (第一个命令git fetch会影响到远程跟踪分支。但由于这些只是你的Git记住从外部Git获取的内容,上次从该外部Git获取内容的方式,所以这不是很重要。)

    最后,不要使用git pull。使用git fetch,然后根据fetch中传入的内容选择使用哪个命令:git mergegit rebase


    1有一种方法可以使git rebase影响另一个分支,但是-幸运的是-git pull不使用它。(除非你知道自己在做什么,否则你可能也不应该使用它。这相当简单:它只是首先执行一个git checkout到另一个分支名称,然后继续像你自己这样进行,并且没有指定额外的分支名称。)


6
如果你在自己的分支上执行git pull命令,它只会拉取已提交到该分支的新更改。例如,如果我也在更改你的分支并将新更改推送到repo中,你可以从自己的分支执行git pull命令,并更新为我的更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接