这些命令之间有什么区别?:
# 1
git pull
# 2
git pull origin
# 3
git pull origin master
# 4
git pull origin/master
# 5
git pull origin HEAD:master
答案 0 :(得分:71)
git pull
是一个便利命令,它同时执行不同的操作。基本上它只是git fetch
的组合,它连接到远程存储库并获取新的提交,git merge
(或git rebase
)将新提交合并到本地分支中。由于涉及两个不同的命令,git pull
的含义并不总是很明显。
您可以为本地分支配置上游。在一个新的克隆之后,你将有一个本地分支“master”,一个远程“origin”,你的主分支有“origin / master”作为上游。
我假设下面这个设置。 (您可以使用git branch -vv
或查看.git / config查看上游配置。)
现在提出您的问题:
git pull
= git fetch origin
+ git merge origin/master
(或上游的任何内容)git pull origin
= git pull
(只要来源是您的上游远程)git pull origin master
= git fetch origin master
+ git merge FETCH_HEAD
git pull origin/master
:除非您有一个名为“origin / master”的遥控器git pull origin HEAD:master
:尝试直接将本地主人重置为原点上的HEAD点。 (不要这样做。)答案 1 :(得分:14)
pull
基本上是fetch
(从远程存储库获取一些提交和关联对象到您的),然后将这些操作“应用”到您的工作副本中。默认情况下,第二阶段是使用merge
完成的,但您可以将pull.rebase
变量设置为true
,然后将改为使用。
pull
命令弹出两个问题。首先是,到底取得了什么?第二个是,它如何将这些更改应用到我的工作副本中?让我们从第一个开始吧。该命令的完整形式是
git pull [options] [repository] [<refspec>...]
options
是控制行为的标志(例如,即使pull
fetch
rebase
,pull.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}}的手册页。