git分支领先于origin/master,而仓库是同步的。

7

大家好,

在git中有一件事情对我来说非常不合理,以下是发生的情况:

  • 我执行git status,看到我在主分支上,并且没有要提交的内容,工作目录也很干净。
  • 然后我执行git pull origin master,拉取了一堆代码,没有问题。
  • 现在当我执行git status时,我看到了一行新的提示您的分支比origin/master领先1个提交

我的本地repo和远程repo完全同步,但您的分支比origin/master领先1个提交是什么意思,这非常非常令人困惑。


1
你认为你的代码库与远程仓库同步了吗? - Daniel Hilgarth
你在拉取时默认不进行变基吗?你能否尝试分别获取和合并而不是拉取? - Christoffer Hammarström
你可以使用命令 "gitk ." 查看哪些提交附有 "master" 和 "origin/master" 标签。 - Thorbjørn Ravn Andersen
你认为本地仓库和远程仓库完全同步的假设是不正确的。 - Thorbjørn Ravn Andersen
@ThorbjørnRavnAndersen 谢谢,gitk . 看起来非常不错,我正在浏览它。 - user1781472
显示剩余3条评论
4个回答

9
我经历过你所看到的情况。我在git-scm.com上找不到合适的解释,但我认为它应该是这样的:
1. 我从origin克隆了一个仓库,假设origin有master分支,现在我在本地仓库中也有了master分支。 2. 现在,origin和你的仓库都引用了最后一次提交。这个引用是master分支,并且在你的本地仓库和origin上引用相同。 3. 假设其他人(不是你)向origin master推送了新的提交。 4. 你执行git pull origin master 5. 现在你执行git status,你会发现你的分支领先于origin/master,即使你在本地仓库中没有新的提交,也没有任何需要推送的内容!(在这个例子中,自第1步(克隆)以来,你没有在本地提交任何新的内容)
==> 我通过在master分支上执行git pull origin来解决这个问题。 git pull origin master将所有新的提交从origin分支拉到你的本地分支。 git pull origin还会重置你的引用,使其等于origin上的master分支所引用的提交!(如果没有这样做,git-bash就会认为你领先了很多提交!因为在提交树中,在你的master引用所指向的提交之后有很多提交!)
这对你有意义吗?对我来说是有意义的 :)
另外,请随时用硬证据/文档支持我的想法 :)

用户1781472在那里解决了他的问题,并对为什么解决了他的问题发表了一些评论。 - deblendewim

4

您已在本地计算机上添加了一个提交,该提交尚未发送到远程服务器。

如果您确定修改应与远程存储库共享,则使用git push命令将提交发送到远程:

git push orgin master:master

不,这正是重点,我本地机器上没有任何未提交的内容。 - user1781472
git push origin mastergit push origin master:origin/master 之间有什么区别? - user1781472
首先:我的错误,命令应该是 git push origin master:master - 已在帖子中更正。 - LeGEC
如果将master设置为跟踪origin/master,则没有区别。它只是允许您明确指定目标远程分支 - 您可以编写git push origin master:testing或其他内容。 - LeGEC
@user1781472,这就是问题所在:本地有一个比远程最新的提交。 - vonbrand

1
你并不完全与远程仓库同步,你有远程仓库的所有内容,但是你本地的主分支比 origin/master 提前了一个提交。
运行以下命令,并展示结果:
git log --all --graph --pretty=format:'%h %d %s'

我期望看到类似这样的东西:
* (master) Commit D
* (origin/master) Commit C
* Commit B
* Commit A

如果我正确地理解了你的帖子,那么你比远程分支领先一个提交,因为你有D,而远程分支在C处。你需要执行git push将提交D推送到远程仓库,然后你就可以完全同步了。

0

实际上,你假设你的本地分支和远程分支是同步的。如果它说你的本地分支比 origin/master 多一个提交,那么肯定是这样的。我们都信任 Git。

使用这个进行测试。

git checkout master // You move to master branch
cat .git/HEAD //shows the commit on which HEAD is pointing to

git checkout origin/master //you switch to origin master branch
cat .git/HEAD 

如果您看到本地主分支和远程主分支中的 HEAD 指向相同提交,则两者已经同步。
如果您的本地分支超前了 1 个提交,只需将其推送(如果需要)到远程分支即可:
git push origin master

1
谢谢你的回答,所以在阅读这篇文章之前,我检查了本地(git log)和远程,它们都有相同的最近提交。然后我执行了 git fetch 命令,现在那个消息已经消失了,它说我的分支领先于1个提交。看起来我通过 git pull 得到的是我的提交,但是没有推送,而 git fetch 解决了这个问题,不知道这里发生了什么。 - user1781472
  1. 你把你的提交推到源了吗?如果你还没有推送,那么你的提交就无法过期。
  2. 你用了硬重置HEAD吗?因为这也会从你的分支中删除提交。
- Sachin Jain
1
在 git-scm 网站上,我找到了以下内容:更新远程跟踪分支:$ git fetch origin 以上命令将从远程 refs/heads/ 命名空间复制所有分支,并将它们存储到本地 refs/remotes/origin/ 命名空间中,除非使用 branch.<name>.fetch 选项指定非默认 refspec。 - deblendewim
1
在这个例子中(http://git-scm.com/docs/git-fetch),“git fetch origin”为您解决了问题。“git pull origin”也会,因为它实际上是一个“git fetch origin”和一个“git merge origin”组合。 - deblendewim

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