【问题标题】:git erroneously states I'm ahead of origin/master by 1 commitgit 错误地指出我领先于 origin/master 1 次提交
【发布时间】:2012-02-23 15:39:31
【问题描述】:

[编辑:根据要求添加命令输出,并为清晰起见重新组织] 我已经签出了一个特定 repo 的两个克隆。

git log
commit e06424b5...
...
commit 557a0eb8...

在两者中显示相同的内容,顶部有相同的哈希。

git remote show origin

两者都一样

git branch
* master

两者都一样

现在有些不同了。

来自“好”克隆:

git log origin/master..
commit e06424b5...

git show-ref HEAD
e06424b5... refs/remotes/origin/HEAD

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

来自“坏”克隆:

git log origin/master..
commit 557a0eb8...

git show-ref HEAD
557a0eb8... refs/remotes/origin/HEAD

git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.

这是不同的[更正:我之前报告过这个输出是相同的]。 show-ref 似乎表明此结帐是一个提交落后,而状态表示它是领先的。但是git reset --hard e06424b5 没有任何改变。

当我问“坏”克隆它认为需要推送什么时:

git diff --stat origin/master

它显示了作为 e06424b5 提交的一部分的文件,但事实上,这个结帐甚至拥有这些文件的唯一原因是因为我提取了它们。

任何人都知道如何让结帐意识到它没有什么可以推送的吗?

[编辑:这里有一些额外的命令及其来自“坏”克隆的输出...]

git log --graph --decorate --oneline    
* e06424b (HEAD, master)
* 557a0eb (origin/master, origin/HEAD) 

git rev-parse origin/master
557a0eb

git rev-parse HEAD
557a0eb (the previous hash)
e06424b (the correct, most recent hash)

【问题讨论】:

  • 你的cmets不是很清楚。来自 git 的一些实际响应会比你给它的命令更有帮助......“git diff HEAD origin/master”有什么帮助吗?
  • 是的,'git diff HEAD origin/master' 显示了大量差异,这是有道理的,因为 HEAD 指向的是前一个哈希,而不是最新的
  • 您将 HEAD 设置为什么?当您执行“git 分支”时,显示的当前分支是什么?
  • 您能否在两个克隆上显示git rev-parse origin/mastergit rev-parse HEAD 和任一克隆上的git ls-remote origin 的输出?
  • git fetch 不清除此消息?我以前解决过这个问题:stackoverflow.com/questions/7365415/…

标签: git


【解决方案1】:

您可能已经从其中一个存储库(没有预先消息的那个)推送。仅仅因为你从一个仓库推送,并不意味着另一个仓库会看到同样的事情。您必须执行git fetch origin 以便更新跟踪分支。

【讨论】:

    【解决方案2】:

    考虑到您的 cmets,在我看来您实际上是在“分离头”模式下工作。

    问题在于,您的初始帖子暗示一个分支指向您不希望它指向的特定位置(如果您实际上发布了您拥有的任何 git 命令的输出,这将更加清楚运行)在这种情况下 git reset --hard 是您希望解决此问题的方法。

    但事实上,HEAD 似乎只是指向了您不希望它在的地方,git checkout 是您用来修复 HEAD 指向的位置的命令。我假设可能有一些东西阻止了结帐工作,这就是我添加 --force 的原因。

    警告:使用带有 --force 参数的 git checkout 可能会终止您拥有的任何未提交的更改,或类似的东西。

    git checkout --force master
    

    假设您有一个 master 分支,它是您要检查的分支,并且它实际上是在跟踪 origin/master,这应该可以让您摆脱困境。

    【讨论】:

      【解决方案3】:

      查看输出

      git log origin/master HEAD master --graph --decorate --oneline
      

      它将以图形方式显示每个参考指向的位置。您也可以使用

      进行调查
      gitk master origin/master HEAD
      

      【讨论】:

      • 我已经知道 HEAD 指向了错误的地方,我就是无法让 git 更正它... reset --hard 似乎没有任何效果
      • 你使用 checkout 来移动 HEAD,git reset 会改变当前分支。 'git checkout master' 将 head 移动到 master 分支,或者 'git checkout origin/master' 从 origin 远程移动到 master 分支。你也可以只做一个'git checkout
      • 如果你 git status 它应该显示“# not on any branch”。这意味着你是无头的——不在任何分支上。但如果它说你领先于某事,那就意味着你在一个分支上。
      猜你喜欢
      • 2012-04-27
      • 1970-01-01
      • 2013-04-23
      • 2011-01-21
      • 2022-01-04
      • 2015-10-20
      • 2021-02-07
      相关资源
      最近更新 更多