我在下面的沙箱中练习git:https://learngitbranching.js.org/?NODEMO
我在两个单独的会话中运行了两组命令。第一组命令按顺序排列如下:
git clone
git checkout -b feature
git push
git fakeTeamwork main 1
git fakeTeamwork feature 1
git pull第二组命令顺序相似,但我最后使用了git fetch + git merge:
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 clone和git fakeTeamwork只是为沙箱构建的命令。
谢谢!
发布于 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 master对origin/master没有影响。
除此之外,我们还有其他几个特例:
git pull被配置或被告知运行git rebase,那么它使用的第二个命令是git rebase,而不是git merge。因此,最明显的替代方法是git fetch和git 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和第二个命令的参数。通常情况下,除了您注意到的关于某些远程跟踪名称有时没有更新的警告之外,这些名称通常都是以相同的方式工作。
发布于 2021-08-26 08:49:36
git pull真的是git fetch+git merge吗?
简而言之,是的。
但是,值得指出的是,git fetch更新哪些远程跟踪分支(当调用时没有任何参数)是由remote..fetch配置变量决定的。
如果您在真实的Git中运行git config remote.origin.fetch,您应该会看到以下内容:
+refs/heads/*:refs/remotes/origin/*这叫做https://git-scm.com/docs/git-fetch#Documentation/git-fetch.txt-ltrefspecgt。*告诉Git要获取origin远程(:的右侧)中的所有分支,并将它们放在本地回购(:的左侧)中。如果不带任何参数运行git pull或git fetch,则由于此设置,所有新的和现有的远程跟踪分支都将被更新。
来自文档
当运行
git fetch时,不指定要在命令行上获取哪些分支和/或标记,例如git fetch origin或git fetch,则使用remote.<repository>.fetch值作为refspecs,它们指定要获取哪些引用以及要更新哪些本地参考信息。上面的示例将获取origin中存在的所有分支(即与值的左侧refs/heads/*匹配的任何ref ),并更新refs/remotes/origin/*层次结构中相应的远程跟踪分支。
当您开始将分支名称传递给git pull或git fetch时,这种行为就不再适用了,正如@torek在他的回答中指出的那样。
https://stackoverflow.com/questions/68934976
复制相似问题