从原点拉出时,“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。)
现在你的问题:
-
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
:试着直接重置你本地的master到任何HEAD指向的原点。 (不要这样做)
pull
是基本上是一个fetch
(从远程存储库获取一些提交和关联对象到你的),然后一个“应用”到您的工作副本的操作。 第二个阶段默认情况下是使用merge
完成的,但是您可以将pull.rebase
variables设置为true
,然后代之以rebase。
用pull
命令popup两个问题。 首先是什么取得了什么? 第二个,它是如何将这些变化应用于我的工作副本的? 我们从第一个开始。 命令的完整forms是
git pull [options] [repository] [<refspec>...]
这些options
是控制行为的标志(例如 – 即使pull.rebase
为false
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
。