【问题标题】:some confusion on git pull vs git-fetch [duplicate]关于 git pull 与 git-fetch 的一些混淆 [重复]
【发布时间】:2013-12-31 05:37:56
【问题描述】:

所以 - 有人可以澄清这一点:

我跑:

git pull origin master  
git status

然后它提取更改并说:

your branch is ahead of origin/master ... blahblah by 6 commits...

当我然后运行时

git fetch
git status

上面写着:

# On branch master
nothing to commit (working directory clean)

所以 - 我认为 git pull 默认会获取 git - 那么为什么它说“提前 6 次提交”而没有额外的 git fetch

【问题讨论】:

  • 在这种特殊情况下,它意味着它所说的:你的分支在前面,即包含未推送的提交,这与拉取无关,它只是你的提示。
  • @bredikhin 但我刚刚撤消了这些提交 - 为什么它们会被归类为未推送?这就是我感到困惑的地方。为什么当我从远程分支拉取更改时,我不会立即收到“没有什么可提交(工作目录干净)”的消息?
  • 有没有可能在你第二次运行git status之前,你运行了git push
  • @Dannyboy 您的本地提交未推送,而不是您已拉取的提交。
  • @bredikhin 但我没有任何本地提交。如果我做git fetch - 在git pull 之后 -> 这条消息没有出现,我只会得到“没有提交(工作目录干净)”

标签: git git-pull git-fetch


【解决方案1】:

git status 中的“Ahead or behind by X commits”文本基于当前分支的跟踪分支状态;例如,remotes/origin/master 如果您使用的是master

当您在指定远程和分支的情况下运行 git pull 时,它会获取新的提交并将它们合并到当前分支,但它不会更新源的远程跟踪分支。相反,它将刚刚获取的提交指向为FETCH_HEAD

在没有指定参数的情况下运行git fetch,另一方面,确实更新所有远程跟踪分支,因此它使消息消失。没有参数的git pull 也是如此。

我自己遇到了很多次的一个微妙的陷阱!我希望 git 在每次获取特定远程时更新所有远程跟踪分支。

【讨论】:

  • 只是出于好奇,你知道为什么 git pull <remote> <branch> 不更新remote/branch 参考吗?只是歇斯底里的葡萄干,还是有什么好的理由?
  • 原来它其实根本不是git pull <remote> <branch>;真的是git pull <remote> <refspec>。 “refspec”基本上是由冒号分隔的源-目标对,例如master:origin/mastergit pull origin master:origin/master 的意思是“转到远程源,给我它的 master 分支,并在本地存储库中更新 origin/master。”如果您不使用冒号,则 fetch 根本不会更新任何本地 refs,只会更新 FETCH_HEAD
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-08
  • 2017-11-26
  • 2011-11-02
  • 2020-01-31
  • 2018-03-05
  • 2017-03-28
  • 2017-06-30
相关资源
最近更新 更多