我对Git的分支复杂性很陌生。我总是在一个分支上工作,提交更改,然后定期推送到远程源。

最近的某个时候,我对一些文件进行了重置,以使它们脱离提交阶段,后来又进行了重新base-I,以消除最近的几个本地提交。现在我处于一种我不太理解的状态。

在我的工作区,git日志显示了我所期望的一切——我在正确的火车上,有我不想要的提交,还有新的提交,等等。

但我只是推到了远程存储库,这是不同的——我在rebase中删除的几个提交被推送了,而本地提交的新提交不在那里。

我认为“master/origin”与HEAD是分离的,但我不完全清楚这意味着什么,如何使用命令行工具将其可视化,以及如何修复它。


当前回答

我在搜索“You are in”separated HEAD“状态时发现了这个问题。

在分析了我在这里所做的事情之后,与我过去所做的相比,我发现我犯了一个错误。

我的正常流量是:

git checkout master
git fetch
git checkout my-cool-branch
git pull

这次我做到了:

git checkout master
git fetch
git checkout origin/my-cool-branch
# You are in 'detached HEAD' state.

问题是我无意中做到了:

git checkout origin/my-cool-branch

而不是:

git checkout my-cool-branch

修复方法(在我的情况下)只是运行上述命令,然后继续流程:

git checkout my-cool-branch
git pull

其他回答

您所要做的就是“gitcheckout[branchname]”,其中[branch-name]是原始分支的名称,从该分支进入分离的头部状态。(与asdfasdf分离)将消失。

例如,在分支“dev”中,您签出提交asdfasd14314->

'git checkout asdfasd14314'

你现在处于超然的状态

“gitbranch”将列出类似->

* (detached from asdfasdf)
  dev
  prod
  stage

但要从分离的头部状态返回到dev->

'git checkout dev'

然后'gitbranch'将列出->

* dev
  prod
  stage

但是,如果你不打算从分离的头部状态中保留任何更改,那当然是这样,但我发现自己这样做并不是为了做任何更改,而是为了查看以前的提交

而不是执行git签出origin/master

只需执行git结账大师

然后gitbranch将确认您的分支。

git checkout checksum  # You could use this to peek previous checkpoints
git status # You will see HEAD detached at checksum
git checkout master # This moves HEAD to master branch

我今天遇到了这个问题,我更新了一个子模块,但没有在任何分支上。我已经承诺了,所以藏东西、结账、拆洗都不起作用。我最终选择了那个超然的脑袋。因此,在我提交后(推送失败时),我立即:

git checkout master
git cherry-pick 99fe23ab

我的想法是:我头脑冷静,但我想成为主人。假设我的分离状态与主状态没有太大的不同,如果我能将我的承诺应用于主状态,我就做好了。这正是樱桃树的作用。

我陷入了一种非常愚蠢的状态,我怀疑其他人会觉得这很有用。。。。但以防万一

git ls-remote origin
0d2ab882d0dd5a6db93d7ed77a5a0d7b258a5e1b        HEAD
6f96ad0f97ee832ee16007d865aac9af847c1ef6        refs/heads/HEAD
0d2ab882d0dd5a6db93d7ed77a5a0d7b258a5e1b        refs/heads/master

我最终解决了这个问题

git push origin :HEAD