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

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

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

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

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


当前回答

而不是执行git签出origin/master

只需执行git结账大师

然后gitbranch将确认您的分支。

其他回答

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

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

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

git rebase HEAD master

此命令:

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

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


关于遥控器:

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

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

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

您所要做的就是“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将确认您的分支。

这对我来说非常有效:

1.保存本地修改的git存储

如果要放弃更改git-clean-dfgit结帐--。gitclean会删除所有未跟踪的文件(警告:虽然它不会删除.gitignore中直接提到的忽略文件,但可能会删除驻留在文件夹中的忽略文件),gitcheckout会清除所有未标记的更改。

2.git checkout master切换到主分支(假设您想使用master)3.git pull从主分支提取最后一次提交4.git状态,以便检查一切是否正常

On branch master
Your branch is up-to-date with 'origin/master'.

我遇到了同样的问题,我已经通过以下步骤解决了它。

如果您需要保留更改

首先,您需要运行gitcheckoutmaster命令,以返回到master树枝如果需要保留更改,只需运行git checkout-b changes并git checkout-B主更改

如果您不需要更改

要从分支中删除所有未跟踪的文件,请运行gitclean-df。然后,您需要清除存储库中所有未标记的更改。为了做到这一点,您必须运行git checkout--最后,您必须使用gitcheckoutmaster命令将分支放回主分支。