从原点拉出“git pull”命令之间的差异?

时间:2013-04-03 20:14:43

标签: git

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

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

2 个答案:

答案 0 :(得分:71)

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

您可以为本地分支配置上游。在一个新的克隆之后,你将有一个本地分支“master”,一个远程“origin”,你的主分支有“origin / master”作为上游。 我假设下面这个设置。 (您可以使用git branch -vv或查看.git / config查看上游配置。)

现在提出您的问题:

  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. ,否则无效
  6. git pull origin HEAD:master:尝试直接将本地主人重置为原点上的HEAD点。 (不要这样做。)

答案 1 :(得分:14)

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

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

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

options是控制行为的标志(例如,即使pull fetch rebasepull.rebase也可以false + repository工作1}})。

refspecs是要从中获取的遥控器的名称(或URL)。

git pull origin branch1:branch2 是一种简洁的方法,用于指定要获取的远程数据库上的哪些引用以及您希望将它们放在当前工作副本中的位置。

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

branch1

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

现在,让我们逐个删除参数,讨论默认工作的方式。首先,我们可以从refspec中删除目的地,然后简单地说fetch。这将首先branch1远程分支FETCH_HEAD进入您的本地存储库。它将作为名为git merge FETCH_HEAD的临时参考提供。之后,它将运行HEAD,它将此分支合并到您当前的活动分支(即branch1)。当您在本地分支中并希望从远程数据库获取更改到该分支时,通常会执行此操作。

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

如果我们完全删除git pull并简单地说branch.<name>.remote,它会检查配置是否有origin/master指定从哪个远程提取。与上面的内容一起告诉你要拉什么。

您的第4点和第5点不是正常的用例。如果您有一个名为origin/master的遥控器,那么第一个是不可能的。 master 通常是一个本地引用,用于跟踪远程origin上的HEAD分支。第二个将尝试在远程(默认分支,通常是master)上的master上获取更改,然后将这些更改合并到您的本地git pull。虽然这可能是你想要定期做的事情,但这个命令是非常规的,并不是我经常看到的。

我已经跳过了一些细节,但这些应该足以让您在日常工作中保持安全和舒适。有关所有血腥细节,您可以查看{{1}}的手册页。