git 获取 + git 合并 origin/master vs git 拉取 origin/master
git fetch + git merge origin/master vs git pull origin/master
我认为 git 拉取就像 git 获取 + git 合并。在 branchA 中,我总是执行 git 获取,然后执行 git 合并 origin/master。但是今天,在分支 A 中,我尝试了 git pull origin/master 但它没有用,但是 git pull origin master 起作用了。有什么想法吗?
追问,更新的origin/master和master的在线版一样,何苦要origin/master,一直用在线版不是更方便吗始终更新,让我们摆脱总是 git 获取的负担?
I thought git pull was like a git fetch + git merge.
是的。但是,git pull
使用的语法与几乎所有其他 Git 命令使用的语法都不匹配。这是由于历史原因:git pull
早于 Git pre-1.5 和 post-1.6 Git 版本之间的许多改进。 (请注意 Git 现在是 2.26 版,所以这是真正古老的历史,可以追溯到 2005 年左右。人们今天仍在使用的最古老的 Git 版本在 1.7 版范围内—但是当你 运行 git pull
时,你又回到了前石器时代,恐龙 Git 1.5 时代。)
[but] I tried git pull origin/master
and it didn't work [while] git pull origin master
worked
那是因为这是 git pull
.
的特殊语法
仔细阅读 the git pull
documentation 以了解例外情况(其中有很多),但一般来说,您传递给 git pull
、git pull
的大部分参数都会传递给 git fetch
.正如你不会 运行:
git fetch origin/master # wrong
你不能运行
git pull origin/master # also wrong: this runs git fetch origin/master
但是,您可以 运行:
git fetch origin master
这里 origin
是一个 远程 而 master
是一个 refspec(参见 the git fetch
documentation有关遥控器和参考规范的更多信息)。这特别限制了你的 git fetch
操作只获取他们 master
上的新提交,以便更新 仅 你的 origin/master
.1
获取完成后,pull
运行s merge
,或者如果您如此指定,rebase
,在某些分支头提交集上。2 这里的总体思路——可以追溯到我提到的 Git-1.6 之前的历史——是从其他 Git,您现在希望将这些提交合并到您的当前分支。
有一段时间,在 Git 早期,远程 的整个概念并不存在,因此没有远程跟踪名称:有根本没有 origin
,因此没有 origin/master
。因此,立即合并他们的提交非常重要,以免您的 Git 运行 垃圾收集通过并 删除 您获得的新提交。
在 post-1.6 时代——即从 2006 年左右开始——收集提交并让它们坐在那里一段时间是安全的,而您仔细查看它们,考虑它们,甚至暂时完全忽略它们。 remote 名称 origin
引入了 remote-tracking 名称,例如 origin/master
,它会无限期地保留那些提交。不再需要疯狂地将这些提交推入你自己的分支之一,以防止它们被删除。
底线是:如果您觉得git pull
方便,就使用它。如果没有,不要。请记住,如果您使用参数,您将使用的参数对于它来说是独一无二的。 它只是 git fetch
的组合,加上一个直接的第二个命令,用于将一些获取的提交合并到 当前分支。在大多数情况下,我发现 in 很方便:我喜欢先 inspect 获取的提交。 如果您不使用 git pull
,您将使用 origin/master
等远程跟踪名称命名传入的提交,但如果您使用 git pull
,您 不能在git pull
命令本身中使用这些名称,因为它与这些名称不存在的古代兼容。
1这种 git fetch
会在任何现代 Git 中更新您的 origin/master
,但在 Git 之前的版本中1.8.4,它将 origin/master
未更新。
2被选作 merge 或 rebase 参数的提交是那些来自您在命令行上特别命名的引用的提交,如果您命名的话。否则,选择作为参数的(单个)提交是对应于当前分支的 upstream 设置的提交。
在某些极端情况下,git pull
运行 不是将合并或变基作为其第二个命令。这些特殊情况中最有趣的是拉入一个完全空的存储库:在这里,git merge
和 git rebase
都不会做任何事情,所以 git pull
本质上只是 运行s git checkout
代替。这种特殊情况显然在任何给定的存储库中只发生一次。
我认为 git 拉取就像 git 获取 + git 合并。在 branchA 中,我总是执行 git 获取,然后执行 git 合并 origin/master。但是今天,在分支 A 中,我尝试了 git pull origin/master 但它没有用,但是 git pull origin master 起作用了。有什么想法吗?
追问,更新的origin/master和master的在线版一样,何苦要origin/master,一直用在线版不是更方便吗始终更新,让我们摆脱总是 git 获取的负担?
I thought git pull was like a git fetch + git merge.
是的。但是,git pull
使用的语法与几乎所有其他 Git 命令使用的语法都不匹配。这是由于历史原因:git pull
早于 Git pre-1.5 和 post-1.6 Git 版本之间的许多改进。 (请注意 Git 现在是 2.26 版,所以这是真正古老的历史,可以追溯到 2005 年左右。人们今天仍在使用的最古老的 Git 版本在 1.7 版范围内—但是当你 运行 git pull
时,你又回到了前石器时代,恐龙 Git 1.5 时代。)
[but] I tried
git pull origin/master
and it didn't work [while]git pull origin master
worked
那是因为这是 git pull
.
仔细阅读 the git pull
documentation 以了解例外情况(其中有很多),但一般来说,您传递给 git pull
、git pull
的大部分参数都会传递给 git fetch
.正如你不会 运行:
git fetch origin/master # wrong
你不能运行
git pull origin/master # also wrong: this runs git fetch origin/master
但是,您可以 运行:
git fetch origin master
这里 origin
是一个 远程 而 master
是一个 refspec(参见 the git fetch
documentation有关遥控器和参考规范的更多信息)。这特别限制了你的 git fetch
操作只获取他们 master
上的新提交,以便更新 仅 你的 origin/master
.1
获取完成后,pull
运行s merge
,或者如果您如此指定,rebase
,在某些分支头提交集上。2 这里的总体思路——可以追溯到我提到的 Git-1.6 之前的历史——是从其他 Git,您现在希望将这些提交合并到您的当前分支。
有一段时间,在 Git 早期,远程 的整个概念并不存在,因此没有远程跟踪名称:有根本没有 origin
,因此没有 origin/master
。因此,立即合并他们的提交非常重要,以免您的 Git 运行 垃圾收集通过并 删除 您获得的新提交。
在 post-1.6 时代——即从 2006 年左右开始——收集提交并让它们坐在那里一段时间是安全的,而您仔细查看它们,考虑它们,甚至暂时完全忽略它们。 remote 名称 origin
引入了 remote-tracking 名称,例如 origin/master
,它会无限期地保留那些提交。不再需要疯狂地将这些提交推入你自己的分支之一,以防止它们被删除。
底线是:如果您觉得git pull
方便,就使用它。如果没有,不要。请记住,如果您使用参数,您将使用的参数对于它来说是独一无二的。 它只是 git fetch
的组合,加上一个直接的第二个命令,用于将一些获取的提交合并到 当前分支。在大多数情况下,我发现 in 很方便:我喜欢先 inspect 获取的提交。 如果您不使用 git pull
,您将使用 origin/master
等远程跟踪名称命名传入的提交,但如果您使用 git pull
,您 不能在git pull
命令本身中使用这些名称,因为它与这些名称不存在的古代兼容。
1这种 git fetch
会在任何现代 Git 中更新您的 origin/master
,但在 Git 之前的版本中1.8.4,它将 origin/master
未更新。
2被选作 merge 或 rebase 参数的提交是那些来自您在命令行上特别命名的引用的提交,如果您命名的话。否则,选择作为参数的(单个)提交是对应于当前分支的 upstream 设置的提交。
在某些极端情况下,git pull
运行 不是将合并或变基作为其第二个命令。这些特殊情况中最有趣的是拉入一个完全空的存储库:在这里,git merge
和 git rebase
都不会做任何事情,所以 git pull
本质上只是 运行s git checkout
代替。这种特殊情况显然在任何给定的存储库中只发生一次。