从原点拉出时,“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 

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

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

现在你的问题:

  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 :试着直接重置你本地的master到任何HEAD指向的原点。 (不要这样做)

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

pull命令popup两个问题。 首先是什么取得了什么? 第二个,它是如何将这些变化应用于我的工作副本的? 我们从第一个开始。 命令的完整forms是

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

这些options是控制行为的标志(例如 – 即使pull.rebasefalse pull.rebase也可以作为fetch + pull.rebase )。

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

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

让我们先采取最明确的forms。

  git pull origin branch1:branch2 

这基本上说,拉远程调用origin的引用branch1的更改,然后将它们合并(或重新绑定)到本地分支branch2 。 例如,如果我说git pull origin master:dev ,我会得到一个名为dev的本地分支,它将指向与master相同的提交。 如何指定refspecs的细节在这里 。 您可以使用*来指示多个refspecs。 例如, git pull origin refs/heads/*:refs/heads/*会将所有的分支(存储在heads )放到本地仓库中,并将它们合并到同名的本地分支中。

现在,让我们一个一个的删除论点来讨论默认的工作。 首先,我们可以从我们的git pull origin branch1移除目标,并简单地说git pull origin branch1 。 这将首先将远程分支branch1到本地存储库中。 它将作为一个名为FETCH_HEAD的临时引用FETCH_HEAD 。 之后,它会运行git merge FETCH_HEAD ,它将把这个分支合并到你当前的活动分支(即HEAD )中。 当你在一个本地分支,并且想要从远程访问到那个分支时,通常会这样做。

现在,让我们完全放弃branch1然后说git pull origin 。 现在,git知道从哪里获取( origin ),但不知道要获取什么。 它有一些默认值。 最常见的情况是当你的configuration文件有一个branch.<name>.merge选项(这是一个条目称为merge在一个部分像[branch "master"] )。 如果是这样,它将使用该操作的refspecs。

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

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

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