这些是什么命令之间的差异?:当从原点拉动时,“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”命令之间的区别?
# 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 rebase
)的组合,它将新提交合并到本地分支中。由于涉及两个不同的命令,所以git pull
的含义并不总是显而易见的。
您可以为本地分支配置上游。新鲜克隆后,您将有一个本地分支“主”,一个远程“起源”,您的主分支具有“起源/主”作为上游。 我假设下面这个设置。 (你可以看到你的上游配置有git branch -vv
或通过查看的.git /配置)。
现在对于你的问题:
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指向原点的设备。 (别这样做。)为什么执行'git pull origin HEAD:master'是一个坏主意? – 2013-04-03 22:49:18
右侧应该是一个远程分支。请参阅手册页中的警告。如果你使用这个,确保你知道你在做什么。 – michas 2013-04-03 23:06:05
如果我在其他分支会'git pull'拉那个分支或者主人 – aWebDeveloper 2014-02-07 09:37:12
一个pull
基本上是一个fetch
(后者从远程仓库到你的一些提交和相关对象),然后其中“适用”的操作到这些工作拷贝。第二阶段默认情况下是使用merge
完成的,但您可以将pull.rebase
变量设置为true
,然后它将改为rebase。
命令pull
弹出两个问题。首先是,究竟获取了什么?第二个是,它如何将这些更改应用于我的工作副本?我们从第一个开始。该命令的完整形式是
git pull [options] [repository] [<refspec>...]
的options
是控制行为的标志(例如--rebase使pull
工作作为fetch
+ rebase
即使pull.rebase
是false
)。
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
。
那么,即使在阅读手册页后,并不是所有情况下都清楚究竟发生了什么。例如:没有配置上游的'git pull'的含义是什么? (手册页仅声明缺省值为配置的上游。) – michas 2013-04-03 21:44:35
简而言之:1.将在没有当前分支的配置的情况下失败,否则将与2.使用远程名称一样。 2.将为给定的远程使用默认获取配置(并合并第一个),而在3.中指定要获取和合并的内容。 4.无效,恕我直言。 (如果有效),将远程HEAD放入refs/remotes/origin/master并合并。 – andi5 2013-04-03 22:13:45
投票重新打开此问题,因为不幸的是,它是['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