我对Git的分支复杂性很陌生。我总是在一个分支上工作,提交更改,然后定期推送到远程源。
最近的某个时候,我对一些文件进行了重置,以使它们脱离提交阶段,后来又进行了重新base-I,以消除最近的几个本地提交。现在我处于一种我不太理解的状态。
在我的工作区,git日志显示了我所期望的一切——我在正确的火车上,有我不想要的提交,还有新的提交,等等。
但我只是推到了远程存储库,这是不同的——我在rebase中删除的几个提交被推送了,而本地提交的新提交不在那里。
我认为“master/origin”与HEAD是分离的,但我不完全清楚这意味着什么,如何使用命令行工具将其可视化,以及如何修复它。
如果您想推送当前分离的HEAD(之前检查gitlog),请尝试:
git push origin HEAD:master
将您分离的HEAD发送到原点的主分支。如果您的推送被拒绝,请首先尝试git pull-origin-master从origin获取更改。如果您不关心源代码的更改,并且它被拒绝,因为您做了一些有意的重基,并且您想用当前分离的分支替换源代码/主代码,那么您可以强制它(-f)。如果您失去了对以前提交的一些访问权限,您可以始终运行git-relog来查看所有分支的历史记录。
要返回主分支,同时保留更改,请尝试以下命令:
git rebase HEAD master
git checkout master
请参见:Git:“当前不在任何分支上。”有没有一种简单的方法可以在保留更改的同时返回分支?
查看此处了解分离头部的基本说明:
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——继续。这将确保你永远不会进入一个分离的头部。