git local master branch停止跟踪remotes / origin / master,无法推送

时间:2011-03-09 08:45:18

标签: git git-branch

就在我认为我已经掌握了 git checkout -b newbranch - commit / commit / commit - git checkout master - git merge newbranch - git rebase -i master - git push git中的工作流程,爆炸的东西,我看不出任何理由。

以下是一般工作流程,过去对我有用:

# make sure I'm up to date on master:
$ git checkout master
$ git pull # k, no conflicts
# start my new feature
$ git checkout -b FEATURE9 # master @ 2f93e34

Switched to a new branch 'FEATURE9'

...工作,提交,工作,提交,工作,提交......

$ git commit -a
$ git checkout master
$ git merge FEATURE9
$ git rebase -i master # squash some of the FEATURE9 ugliness

好到目前为止;现在我期待看到的 - 通常看到的 - 是:

$ git status

# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)

但相反,我只看到“没有提交(工作目录清理)”,没有“您的分支超过'origin / master'提交1次。 “,git pull显示出这种古怪:

$ git pull
From .                                        # unexpected
 * branch            master     -> FETCH_HEAD # unexpected
Already up-to-date.                           # expected

git branch -a -v显示了这个:

$ git branch -a -v

  FEATURE9                 3eaf059 started feature 9
* master                   3eaf059 started feature 9
  remotes/origin/HEAD      -> origin/master
  remotes/origin/master    2f93e34 some boring previous commit # should=3eaf059

git branch清楚地表明我目前正在使用* master,并且git log清楚地显示master(本地)是3eaf059,而remotes / origin / HEAD - >遥控器/原点/主人卡在叉子上。

理想情况下,我想知道我可能会如何进入这个语义,但我会想办法让我的工作副本再次跟踪远程主控制器。让两个人同步而不会失去历史。谢谢!

注意:我在一个新目录中重新克隆了repo并手动重新应用了这些更改,一切正常,但我不希望这是标准的解决方法。

附录:标题显示“无法推送”,但没有错误消息。即使 git branch -a -v 显示本地主服务器位于/ remotes / origin / master之前,我也只是得到了“已经是最新”的响应。以下是 git pull git remote -v 的输出:

$ git pull
From .
 * branch            master     -> FETCH_HEAD
Already up-to-date.

$ git remote -v
origin  git@git.company.com:proj.git (fetch)
origin  git@git.company.com:proj.git (push)

附录2 :看起来我的本地主人配置为推送到遥控器,但不是从中拉出来的。完成for remote in 'git branch -r | grep -v master '; do git checkout --track $remote ; done后,这就是我所拥有的。看来我只需要再次从远程控制器/ origin / master获取,不是吗?

$ git remote show origin
* remote origin
  Fetch URL: git@git.company.com:proj.git
  Push  URL: git@git.company.com:proj.git
  HEAD branch: master
  Remote branches:
    experiment_f tracked
    master    tracked
  Local branches configured for 'git pull':
    experiment_f merges with remote experiment_f
  Local refs configured for 'git push':
    experiment_f pushes to experiment_f (up to date)
    master    pushes to master    (local out of date)

2 个答案:

答案 0 :(得分:5)

当您执行git pull时,您确实想要git push吗?

由于某些原因,git pull从当前目录中“拉出”,我怀疑你想要从remotes/origin/HEAD撤出。

git push origin产生什么输出?

[保罗的附录]:这让我得到了正确答案,所以我接受了。用于弄清楚发生了什么的额外步骤是:

# see details of the current config:
$ git config -l
branch.master.remote=. # uh oh, this should point to origin
# to see what it should be ,make a clean clone of the same project 
#   in a different directory, checkout the master branch and run the
#   same command. That showed "branch.master.remote=origin", so...

# then to fix:
$ git config branch.master.remote origin

之后,本地主人再次跟踪遥控器/原点/主人。感谢Peter Farmer提供的线索让我来到这里!

答案 1 :(得分:1)

继彼得和尼克的评论之后做了一些调查导致:

# botched local clone:
$ git config -l
branch.master.remote=.
branch.master.merge=refs/heads/master
[...]

# new / clean local clone:
$ git config -l
branch.master.remote=origin
branch.master.merge=refs/heads/master
[...]

希望我可以将此作为答案发布而不接受它(如果不是,我将不得不删除并将其放在评论或原始问题中)。做...

$ git config branch.master.remote origin

...再次branch.master.remote=origin,但它并没有解释它是如何“首先被”解开的。

如果有人可以干净地解释:

a)考虑到我的问题中的工作流程,我的本地“拙劣”回购可能如何进入这样的状态,并且

b)安全恢复同步的正确动作序列(假设远程头可能同时升级),我想将其标记为已接受的答案,因为我认为这将是最有用的在这种情况下对其他人。