就在我认为我已经掌握了 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)
答案 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)安全恢复同步的正确动作序列(假设远程头可能同时升级),我想将其标记为已接受的答案,因为我认为这将是最有用的在这种情况下对其他人。