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

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

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

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

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


当前回答

我也有同样的问题。我把零钱藏在git stash并将本地的分支硬重置为先前的提交(我认为这是导致的),然后执行git pull,我现在无法将其头部分离。别忘了git stash再次申请更改。

其他回答

将分离的提交放到它自己的分支上

只需运行git checkout-b mynewbranch。

然后运行gitlog,您将看到这个新分支上的commit现在是HEAD。

我也有同样的问题。我把零钱藏在git stash并将本地的分支硬重置为先前的提交(我认为这是导致的),然后执行git pull,我现在无法将其头部分离。别忘了git stash再次申请更改。

当我个人发现自己处于这样一种情况时,当我发现自己在不在master中时做了一些更改(即HEAD被分离在master的正上方,并且中间没有提交),隐藏可能会有所帮助:

git stash # HEAD has same content as master, but we are still not in master
git checkout master  # switch to master, okay because no changes and master
git stash apply  # apply changes we had between HEAD and master in the first place

我遇到了这个问题,当我读到最热门的答案时:

HEAD是当前签出提交的符号名称。

我想:啊哈!如果HEAD是当前签出提交的符号名称,我可以通过对master重新设置基址来将其与master进行协调:

git rebase HEAD master

此命令:

签出主机标识HEAD的父提交返回到HEAD从master分支的点在master之上播放这些提交

最终的结果是,所有在HEAD中而不是在master中的提交都在master中。master仍处于检出状态。


关于遥控器:

我在rebase中杀死的几个提交被推送了,而本地提交的新提交不在那里。

远程历史记录不能再使用本地历史记录快速转发。您需要强制push(gitpush-f)来覆盖远程历史记录。如果你有任何合作者,与他们进行协调通常是有意义的,这样每个人都在同一页上。

将master推送到远程源之后,远程跟踪分支origin/master将被更新为指向与master相同的提交。

我今天刚刚遇到这个问题,我很确定我通过以下方式解决了这个问题:

git branch temp
git checkout master
git merge temp

当我在工作电脑上发现如何做到这一点时,现在我在个人电脑上遇到了同样的问题。所以我必须等到星期一我回到工作电脑前,看看我是怎么做到的。