Git pull 像 git fetch 一样工作?

3
对于我们公司的一个代码库,命令 git pull 的行为变得像 git fetch。它会拉取所有更新,但不会将更改合并到分支中。我必须运行 git merge origin/master 来将它们合并。

是什么原因导致这种情况?我以前从未见过这种行为。它似乎没有影响代码库的其他用户,只有我受到影响。对我使用的其他代码库也没有影响。我的 git 版本是 git version 2.24.3 (Apple Git-128),该代码库托管在 GitHub 上,但我怀疑这并不重要。

与此相关的请求详细信息的输出:git status

$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

git pull 命令执行如下:

remote: Enumerating objects: 3333, done.
remote: Counting objects: 100% (1623/1623), done.
remote: Compressing objects: 100% (128/128), done.
remote: Total 3333 (delta 1517), reused 1554 (delta 1488), pack-reused 1710
Receiving objects: 100% (3333/3333), 2.07 MiB | 15.83 MiB/s, done.
Resolving deltas: 100% (2113/2113), completed with 355 local objects.
From github.com:repo/url
   6c1fab37s6b7..7acd6e422762  master                                            -> origin/master

git pull 后的 git status

$ git status
On branch master
Your branch is behind 'origin/master' by 94 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

nothing to commit, working tree clean

附带一份git branch -vv的输出结果:

$ git branch -vv
* master                                              6c32ab37afb7 [origin/master: behind 94] commit message

当使用 GIT_TRACE=1 时,可以获得以下额外信息:
在 pull 输出之前:
09:46:36.847574 exec-cmd.c:238          trace: resolved executable dir: /Library/Developer/CommandLineTools/usr/bin
09:46:36.848324 git.c:439               trace: built-in: git pull
09:46:36.865183 run-command.c:663       trace: run_command: git fetch --update-head-ok
09:46:36.870423 exec-cmd.c:139          trace: resolved executable path from Darwin stack: /Library/Developer/CommandLineTools/usr/libexec/git-core/git
09:46:36.871061 exec-cmd.c:238          trace: resolved executable dir: /Library/Developer/CommandLineTools/usr/libexec/git-core
09:46:36.871707 git.c:439               trace: built-in: git fetch --update-head-ok
09:46:36.890545 run-command.c:663       trace: run_command: unset GIT_PREFIX; ssh git@github.com 'git-upload-pack '\''org/repo-name.git'\'''
remote: Enumerating objects: 3232, done.
remote: Counting objects: 100% (1480/1480), done.
remote: Compressing objects: 100% (229/229), done.
09:46:41.239506 run-command.c:663       trace: run_command: git index-pack --stdin -v --fix-thin '--keep=fetch-pack 94201 on USERNAME' --pack_header=2,3232
09:46:41.252417 exec-cmd.c:139          trace: resolved executable path from Darwin stack: /Library/Developer/CommandLineTools/usr/libexec/git-core/git
09:46:41.254014 exec-cmd.c:238          trace: resolved executable dir: /Library/Developer/CommandLineTools/usr/libexec/git-core
09:46:41.256304 git.c:439               trace: built-in: git index-pack --stdin -v --fix-thin '--keep=fetch-pack 94201 on USERNAME' --pack_header=2,3232
remote: Total 3232 (delta 1333), reused 1323 (delta 1243), pack-reused 1752
Receiving objects: 100% (3232/3232), 4.03 MiB | 19.39 MiB/s, done.
Resolving deltas: 100% (1972/1972), completed with 268 local objects.
09:46:42.117286 run-command.c:663       trace: run_command: git rev-list --objects --stdin --not --all --quiet --alternate-refs
09:46:42.126065 exec-cmd.c:139          trace: resolved executable path from Darwin stack: /Library/Developer/CommandLineTools/usr/libexec/git-core/git
09:46:42.126771 exec-cmd.c:238          trace: resolved executable dir: /Library/Developer/CommandLineTools/usr/libexec/git-core
09:46:42.127570 git.c:439               trace: built-in: git rev-list --objects --stdin --not --all --quiet --alternate-refs

拉取输出后:

09:46:43.640301 run-command.c:663       trace: run_command: git gc --auto
09:46:43.647411 exec-cmd.c:139          trace: resolved executable path from Darwin stack: /Library/Developer/CommandLineTools/usr/libexec/git-core/git
09:46:43.648461 exec-cmd.c:238          trace: resolved executable dir: /Library/Developer/CommandLineTools/usr/libexec/git-core
09:46:43.649426 git.c:439               trace: built-in: git gc --auto

有没有显示任何消息或错误?git pull --rebasegit fetch 后跟着 git merge origin/master 不是一样的。 - axiac
2
Rebase和Merge是不同的概念。如果你想合并分支,你应该从命令中删除“--rebase”。 - almanegra
1
阅读 git pullgit fetch 的文档页面。 - axiac
好的,似乎每个人都陷入了“--rebase”的困境中。让我澄清一下,无论我是否使用--rebase,问题都是一样的,与此无关。运行git pull也不会合并更改,仍然需要git merge origin/master。我已经编辑了问题。链接到手册显然对回答没有帮助,并且充其量是居高临下的。如果您认为答案在其中,请引用或链接到文档的特定部分。不,除了普通列出的新分支和提交之外,没有错误或消息。 - temporary_user_name
但是实际上git pull并没有将更改合并到分支中...你认为为什么会这样?有哪些证据支持这一点?从我所看到的输出(6c1fab37s6b7..7acd6e422762 master)来看,合并是成功的。 - Code-Apprentice
你看到问题中描述的在 git pull 之后 git status 的输出部分了吗?"Your branch is behind 'origin/master' by 94 commits" 的哪个部分告诉你合并成功了?很抱歉,我可能误解了你的意思。 - temporary_user_name
1个回答

2

在没有其他参数的情况下运行git pull与运行以下命令基本相同:

git fetch
git merge

也就是说,在这里没有额外的origin/master传递给git merge。因此,如果你在分支br1上,其上游是origin/br1,并且你运行git merge,实际上你正在运行git merge origin/br1,而不是git merge origin/master
我的猜测是,由于你在问题中没有提供足够的信息,无论你现在在哪个分支上,它都有一个上游,但该上游不是origin/master。最好在git pull命令及其实际输出之前显示git status命令及其输出;这些将有助于确认运行git pull时你所在的分支以及它的上游设置。
请注意,你可以将git pull配置为将git rebase作为其第二步运行,并且在现代Git中(但不是过时的Apple版本)你还需要配置其中一个pull.*设置。我建议根本不使用git pull:先运行git fetch,然后运行自己的第二个命令。除了最新的Git需要新的pull.*设置外,git pull很容易做出你没有想到的事情。

奇怪的是,设置GIT_TRACE并没有导致命令输出发生变化。它的输出与未设置时相同。echo $GIT_TRACE确实输出了1。我正在寻找原因,为什么它就是不起作用,但目前还没有找到任何线索。 - temporary_user_name
如果你的shell有什么奇怪的问题,你可以运行env GIT_TRACE=1 git pull - torek
那个有效了,而且你又使用了一个我之前不熟悉的技巧。你显然在这方面有相当丰富的经验。我已经用输出编辑了问题。 - temporary_user_name
更有趣的是,它正确地运行了 git fetch 并修复了一个薄包,然后运行了 git gc --auto,但在两者之间从未运行任何东西。这似乎是不可能的,因为 pull 的最后一步是运行 rebasemerge,而正是合并(或变基)运行了 git gc --auto。我不知道苹果是否在这里搞了什么。您可以尝试从源代码构建 Git(或使用 brew)来使用非苹果品牌的变体... - torek
1
这确实非常奇怪。如果您想继续调试,我建议您对工作的存储库和不工作的存储库执行git config --list,并检查所有不同之处(其中大部分将是无关紧要的,但也许有些事情很重要),或者使用系统调用跟踪工具(我忘记了macOS有哪个,Linux有strace,BSD有ktrace),以防它提供GIT_TRACE遗漏的线索。 - torek
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接