首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >git拉真的是git提取+ git合并吗?

git拉真的是git提取+ git合并吗?
EN

Stack Overflow用户
提问于 2021-08-26 08:19:15
回答 2查看 1.1K关注 0票数 3

我在下面的沙箱中练习git:https://learngitbranching.js.org/?NODEMO

我在两个单独的会话中运行了两组命令。第一组命令按顺序排列如下:

代码语言:javascript
复制
git clone
git checkout -b feature
git push
git fakeTeamwork main 1
git fakeTeamwork feature 1
git pull

第二组命令顺序相似,但我最后使用了git fetch + git merge

代码语言:javascript
复制
git clone
git checkout -b feature
git push
git fakeTeamwork main 1
git fakeTeamwork feature 1
git fetch
git merge o/feature

如果git pull = git fetch + git merge,为什么这两种结果是不同的?git pull似乎没有更新所有远程跟踪分支。这只是沙箱的缺陷,还是git中实际发生的情况?

注意:命令git clonegit fakeTeamwork只是为沙箱构建的命令。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-26 08:33:02

看来git拉并没有更新所有的远程跟踪分支。

是的,这是可能发生的。它确实发生在下列情况:

  • 例如,git pull运行git fetch origin master,并且
  • 因此,git fetch origin master只更新origin/master

此外,在1.8.4之前的Git版本中,一些git fetch操作根本不更新任何远程跟踪名称。在这里,git fetch origin masterorigin/master没有影响。

除此之外,我们还有其他几个特例:

  • 如果git pull被配置或被告知运行git rebase,那么它使用的第二个命令是git rebase,而不是git merge。因此,最明显的替代方法是git fetchgit rebase。这里的一些细节--更多地依赖于Git版本:特别是,git pull实现了--fork-point模式,以便在git rebase --fork-point存在之前进行重基(实际的--fork-point选项首先出现在Git 1.9中,但是git pull在大约1.6版本之后进行了特殊的工作-我只查了一次确切的版本,但最近使用的最早的Git似乎是针对CentOS的,在某些发行版中包含了一些Git 1.7版本)。
  • 有一个非常特殊的情况:如果您创建一个空存储库、添加一个远程存储库并运行git pull,那么还没有现有的分支。(以后可以使用孤立分支再次触发这种情况。)在这种情况下,git pull不进行合并或重基,而是运行专门的git checkout

分支的上游设置在这里很重要,这取决于您传递给git pull或fetch和第二个命令的参数。通常情况下,除了您注意到的关于某些远程跟踪名称有时没有更新的警告之外,这些名称通常都是以相同的方式工作。

票数 4
EN

Stack Overflow用户

发布于 2021-08-26 08:49:36

git pull真的是git fetch + git merge吗?

简而言之,是的。

但是,值得指出的是,git fetch更新哪些远程跟踪分支(当调用时没有任何参数)是由remote..fetch配置变量决定的。

如果您在真实的Git中运行git config remote.origin.fetch,您应该会看到以下内容:

代码语言:javascript
复制
+refs/heads/*:refs/remotes/origin/*

这叫做https://git-scm.com/docs/git-fetch#Documentation/git-fetch.txt-ltrefspecgt*告诉Git要获取origin远程(:的右侧)中的所有分支,并将它们放在本地回购(:的左侧)中。如果不带任何参数运行git pullgit fetch,则由于此设置,所有新的和现有的远程跟踪分支都将被更新。

来自文档

当运行git fetch时,不指定要在命令行上获取哪些分支和/或标记,例如git fetch origingit fetch,则使用remote.<repository>.fetch值作为refspecs​,它们指定要获取哪些引用以及要更新哪些本地参考信息。上面的示例将获取origin中存在的所有分支(即与值的左侧refs/heads/*匹配的任何ref ),并更新refs/remotes/origin/*层次结构中相应的远程跟踪分支。

当您开始将分支名称传递给git pullgit fetch时,这种行为就不再适用了,正如@torek他的回答中指出的那样。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68934976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档