这些命令之间有何不同?
# 1
git pull
# 2
git pull origin
# 3
git pull origin master
# 4
git pull origin/master
# 5
git pull origin HEAD:master
这些命令之间有何不同?
# 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
的含义并不总是显而易见。
您可以为本地分支配置上游分支。在克隆后,您将拥有一个本地分支“master”,一个远程分支“origin”,并且您的主分支具有“origin/master”作为上游分支。我假设以下是这种设置。(您可以使用git branch -vv
或查看 .git/config 来查看上游配置。)
现在回答您的问题:
git pull
= git fetch origin
+ git merge origin/master
(或任何您的上游分支)git pull origin
= git pull
(只要 origin 是您的上游远程分支)git pull origin master
= git fetch origin master
+ git merge FETCH_HEAD
git pull origin/master
:无效,除非您有一个名为“origin/master”的远程git pull origin HEAD:master
:尝试直接将本地 master 重置为 origin 上 HEAD 指向的任何内容。(不要这样做。)git pull origin HEAD:master
为什么是个坏主意? - Ryan Edwardsgit pull
命令会拉取该分支还是主分支? - aWebDevelopergit pull origin HEAD:master
本质上(在 Git 2.6 中的脚本重写之前是字面意思)将 HEAD:master
部分传递给 git fetch
,因此它执行了 git fetch
步骤所做的操作;然后使用 git fetch
步骤获取的提交哈希值进行合并或变基。 Refspecs 是 source:dest,因此将 HEAD
给其他 Git 进行翻译。所以这取决于另一个 Git,但通常另一个 Git 的 HEAD
是其 master
的名称。如果您不在自己的 master
上,则合并或变基会使用已更新的 master
(dest)(除非 fetch
失败)。 - torekgit pull origin br1 br2
。它看起来和感觉就像是应该执行 git checkout br1; git pull origin; git checkout br2; git pull origin
——但实际上并不是这样!相反,它实际上执行的是:git fetch origin && git merge origin/br1 origin/br2
,将两个获取结果合并到你当前的分支中,Git 称之为章鱼合并。这绝不是任何人想要的。可能 git pull
应该完全拒绝这个命令(真正想要它的人可以先运行 fetch,然后再运行 merge)。 - torekpull
基本上是一个 fetch
(从远程仓库获取一些提交和相关对象到你的仓库),然后是将它们 "应用" 到你的工作副本的操作。默认情况下,第二阶段使用 merge
完成,但你可以设置 pull.rebase
变量为 true
,这样它就会使用变基代替。
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
相同的提交。有关如何指定refspec的详细信息,请参见此处。您可以使用*
表示多个refspecs。例如,git pull origin refs/heads/*:refs/heads/*
将从远程存储库中拉取所有分支(存储在heads
下),并将它们合并到具有相同名称的本地分支中。git pull origin branch1
。这将首先将远程分支branch1
fetch
到您的本地存储库中。它将作为临时引用称为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
,该选项指定要从哪个远程获取。加上上述内容就可以告诉您要拉取什么了。origin/master
的远程引用时才有意义,但这很少见。 origin/master
通常是跟踪远程origin
上的master
分支的本地引用。第二个将尝试在远程上获取HEAD
中的更改(通常是master
),然后将其合并到本地的master
中。虽然这可能是您想经常执行的操作,但该命令相当不寻常,而且我很少见到人使用它。git pull
的手册页面。
git pull
的含义是什么?(手册仅指默认为配置的上游。) - michassite:stackoverflow.com git Difference "git pull" "git pull origin master"
的搜索结果之一。 - user456814