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

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

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

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

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


当前回答

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

如果您需要保留更改

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

如果您不需要更改

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

其他回答

您所要做的就是“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 checkout master
git cherry-pick 99fe23ab

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

如果您在Eclipse中使用EGit:假设你的硕士是你的主要发展分支

将更改提交到一个分支,通常是一个新的分支然后从遥控器拉出然后右键单击项目节点,选择团队,然后选择显示历史记录然后右键单击主控形状,选择“检出”如果Eclipse告诉,有两个主服务器一个本地一个远程,请选择远程

之后,您应该能够重新附着到原点主控形状。

查看此处了解分离头部的基本说明:

http://git-scm.com/docs/git-checkout

使其可视化的命令行:

git branch

or

git branch -a

您将得到如下输出:

* (no branch)
master
branch1

*(无分支)表示您处于分离状态。

您可以通过执行git checkout somecommit等来达到此状态,它会警告您以下内容:

您处于“分离HEAD”状态。你可以四处看看,做实验更改并提交它们,您可以放弃你在这方面的任何承诺状态而不影响任何分支通过执行另一次结账。如果要创建新分支到保留您创建的提交,您可以这样做所以(现在或以后)使用-b和再次执行checkout命令。例子:git checkout-b new_branch_name

现在,要让他们找到主人:

执行git reflog,甚至只执行git log,并记录您的提交。现在git checkout master和git合并提交。

git merge HEAD@{1}

编辑:

此外,使用gitrebase-i不仅可以删除/删除不需要的提交,还可以编辑它们。只需在提交列表中提到“edit”,您就可以修改提交,然后发出gitrebase——继续。这将确保你永远不会进入一个分离的头部。

只需执行以下操作:

git checkout master

或者,如果要保留更改,请执行以下操作:

git checkout -b temp
git checkout -B master temp