2013-04-03 116 views
58

这些是什么命令之间的差异?:当从原点拉动时,“git pull”命令之间的区别?

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

那么,即使在阅读手册页后,并不是所有情况下都清楚究竟发生了什么。例如:没有配置上游的'git pull'的含义是什么? (手册页仅声明缺省值为配置的上游。) – michas 2013-04-03 21:44:35

+0

简而言之:1.将在没有当前分支的配置的情况下失败,否则将与2.使用远程名称一样。 2.将为给定的远程使用默认获取配置(并合并第一个),而在3.中指定要获取和合并的内容。 4.无效,恕我直言。 (如果有效),将远程HEAD放入refs/remotes/origin/master并合并。 – andi5 2013-04-03 22:13:45

+2

投票重新打开此问题,因为不幸的是,它是['site:stackoverflow.com git差异“git pull”“git pull origin master”'](https://www.google.com/search q =站点%3Astackoverflow.com + GIT中+差分+%22git +拉%22 +%22git +拉+原点+主%22)。 – 2014-05-30 13:41:24

回答

61

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

您可以为本地分支配置上游。新鲜克隆后,您将有一个本地分支“主”,一个远程“起源”,您的主分支具有“起源/主”作为上游。 我假设下面这个设置。 (你可以看到你的上游配置有git branch -vv或通过查看的.git /配置)。

现在对于你的问题:

  1. git pull = git fetch origin + git merge origin/master(或任何你的上游)
  2. git pull origin = git pull(只要原点是您的上游远程)
  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指向原点的设备。 (别这样做。)
+1

为什么执行'git pull origin HEAD:master'是一个坏主意? – 2013-04-03 22:49:18

+2

右侧应该是一个远程分支。请参阅手册页中的警告。如果你使用这个,确保你知道你在做什么。 – michas 2013-04-03 23:06:05

+0

如果我在其他分支会'git pull'拉那个分支或者主人 – aWebDeveloper 2014-02-07 09:37:12

13

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

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

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

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

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

refspecs是一种简洁的方式,用于指定您要获取的远程引用,以及您希望将它们放入当前工作副本的位置。

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

git pull origin branch1:branch2 

这基本上说,拉远程被叫origin在参考branch1的变化,然后合并(或重订)他们到当地分支机构branch2。例如,如果我说git pull origin master:dev,我会得到一个名为dev的本地分支,它将指向与master相同的提交。如何指定参考文献的细节是here。您可以使用*来指示多个refspecs。例如,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选项时(这是一个在[branch "master"]这个部分里面叫merge的条目)。如果是这样,它将使用该操作的refspecs。

如果我们完全放下origin,简单地说git pull,它将检查的配置,看看是否有一个branch.<name>.remote指定哪个远离拉。随着上述,告诉你要拉什么。

您的要点#4和#5不是正常使用情况。第一个是有道理的,如果你有一个叫做origin/master的遥控器,这不太可能。 origin/master通常是本地参考,它跟踪远程origin上的master分支。第二个将尝试在遥控器(默认分支通常为master)上获取HEAD上的更改,然后将这些更改合并到您的本地master。虽然这可能是你想要定期做的事情,但这个命令并不常见,而且也不是我经常见到的。

我已经略过了一些细节,但这些应该足以让您在日常工作中保持安全和舒适。对于所有血腥详细信息,您可以查看手册页面git pull

相关问题