84

这些命令之间有什么区别?:

# 1
git pull
# 2
git pull origin
# 3
git pull origin master
# 4
git pull origin/master
# 5
git pull origin HEAD:master
4

2 回答 2

86

git pull是一个方便的命令,它同时做不同的事情。基本上,它只是git fetch连接到远程存储库并获取新提交和git merge(或git rebase)将新提交合并到本地分支的组合。由于涉及的两个不同命令的含义git pull并不总是很明显。

您可以为本地分支配置上游。全新克隆后,您将拥有一个本地分支“master”、一个远程“origin”,并且您的 master 分支将“origin/master”作为上游。我假设下面的设置。git branch -vv(您可以使用.git/config 或通过查看 .git/config来查看您的上游配置。)

现在为您的问题:

  1. git pull= git fetch origin+ git merge origin/master(或者你的上游是什么)
  2. git pull origin= git pull(只要 origin 是您的上游远程)
  3. git pull origin master= git fetch origin master+git merge FETCH_HEAD
  4. git pull origin/master:除非您有一个名为“origin/master”的遥控器,否则无效
  5. git pull origin HEAD:master:尝试直接将您的本地主机重置为 HEAD 指向原点的任何内容。(不要这样做。)
于 2013-04-03T22:43:06.627 回答
18

Apull基本上是一个fetch(它将一些提交和相关对象从远程存储库获取到您的存储库中),然后是一个将这些“应用”到您的工作副本中的操作。默认情况下,第二阶段使用 a 完成,merge但您可以将pull.rebase变量设置为true,然后它将改为变基。

该命令会弹出两个问题pull。首先是,究竟获取了什么?第二个是,它如何将这些更改应用于我的工作副本?让我们从第一个开始。该命令的完整形式是

git pull [options] [repository] [<refspec>...]

是控制行为的options标志(例如 --rebase 使pull作为fetch+工作,rebase即使pull.rebaseis false)。

repository是要从中获取的远程的名称(或 URL)。

refspecs是一种简洁的方法,可以指定要获取远程上的哪些引用以及要将它们放在当前工作副本中的哪个位置。

让我们首先采用最明确的形式。

 git pull origin branch1:branch2

这基本上是说,拉取branch1远程调用的引用中的更改origin,然后将它们合并(或变基)到本地分支branch2。例如,如果我说git pull origin master:dev,我将获得一个名为的本地分支dev,它将指向与master. 如何指定 refspecs 的详细信息在这里。您可以使用 a*来指示多个 refspec。例如,git pull origin refs/heads/*:refs/heads/*将所有分支(存储在 下heads)拉入本地存储库,并将它们合并到具有相同名称的本地分支中。

现在,让我们一个一个去掉参数来讨论默认是如何工作的。首先,我们可以从 refspec 中删除目标,然后简单地说git pull origin branch1. 这将首先fetch远程分支branch1到您的本地存储库。它将作为名为 的临时参考提供FETCH_HEAD。之后,它将运行git merge FETCH_HEAD并将此分支合并到您当前的活动分支(即HEAD)。这通常在您位于本地分支并希望从远程获取更改到该分支时完成。

现在,让我们branch1完全放弃,只说git pull origin. 现在,git 知道从 ( ) 到哪里获取,origin但不知道要获取什么。它对此有一些默认值。大多数情况是当您的配置文件有一个选项时(这是在类似的部分branch.<name>.merge中调用的条目)。如果是这样,它将使用那里的 refspecs 进行操作。merge[branch "master"]

如果我们origin完全放弃并简单地说git pull,它将检查配置以查看是否有branch.<name>.remote指定从哪个远程提取。连同上面的内容告诉你要拉什么。

您的第 4 点和第 5 点不是正常用例。origin/master如果您有一个不太可能的远程调用,则第一个是有意义的。origin/master通常master跟踪远程分支的本地引用origin。第二个将尝试HEAD在远程(通常是默认分支master)上获取更改,然后将它们合并到本地master。虽然这可能是您想要定期执行的操作,但该命令非常不合常规,并且不是我经常看到的。

我跳过了一些细节,但这些应该足以让您在日常工作中保持安全和舒适。有关所有血腥细节,您可以查看git pull.

于 2014-05-31T06:07:53.837 回答