Git:“目前没有任何分支。”有一个简单的方法来回到一个分支,同时保持更改?

所以我在存储库中做了一些工作,当我即将提交时,我意识到我目前不在任何分支上。

这在使用子模块时会发生很多,我可以解决这个问题,但是这个过程很乏味,而且我一直在想,一定有一个更简单的方法来做到这一点。

有没有一种简单的方法来恢复分支,同时保持更改?

如果你还没有犯下:

git stash git checkout some-branch git stash pop 

如果你已经承诺,并没有改变任何事情,因为:

 git log --oneline -n1 # this will give you the SHA git checkout some-branch git merge ${commit-sha} 

如果你已经犯了,然后做了额外的工作:

 git stash git log --oneline -n1 # this will give you the SHA git checkout some-branch git merge ${commit-sha} git stash pop 

这帮助了我

 git checkout -b newbranch git checkout master git merge newbranch git branch -d newbranch 
 git checkout master 

结果是这样的:

 Warning: you are leaving 2 commits behind, not connected to any of your branches: 1e7822f readme 0116b5b returned to clean django If you want to keep them by creating a new branch, this may be a good time to do so with: git branch new_branch_name 1e7822f25e376d6a1182bb86a0adf3a774920e1e 

所以,让我们来做:

 git merge 1e7822f25e376d6a1182bb86a0adf3a774920e1e 

在这里留下另一种方式

 git branch newbranch git checkout master git merge newbranch 

另外,你可以设置你的子模块,而不是处于默认的分离头状态,你签出一个分支。

编辑添加:

一种方法是在使用-b标志添加子模块时检出子模块的特定分支:

 git submodule add -b master <remote-repo> <path-to-add-it-to> 

另一种方法是进入子模块目录,只是检查出来

 git checkout master 

我最近又遇到了这个问题。 自从我上次使用子模块并学习了更多关于git的知识之后,我意识到仅仅检出想要提交的分支就足够了。 Git会保留工作树,即使你不存储它。

 git checkout existing_branch_name 

如果你想在一个新的分支上工作,这应该为你工作:

 git checkout -b new_branch_name 

如果您在工作树中发生冲突,结账将失败,但这应该是非常不寻常的,如果发生这种情况,您可以存储它,popup并解决冲突。

与已接受的答案相比,这个答案可以节省两个命令的执行时间,而这些命令实际上并不需要太长的时间来执行。 所以我不会接受这个答案,除非它奇迹般地得到更多的赞扬(或至less接近)比目前接受的答案。

以下方法可能工作:

 git rebase HEAD master git checkout master 

这将重新设置您当前的HEAD变化在主人之上。 然后你可以切换分支。


另一种方法是首先检查分支:

 git checkout master 

然后Git应该显示你分离提交的SHA1,然后你可以select樱桃,例如

 git cherry-pick YOURSHA1 

或者你也可以合并最新的一个:

 git merge YOURSHA1 

要查看来自不同分支的所有提交(确保已经提交),请运行: git reflog

我知道我在2012年告诉巴贝说,我认为不可能有人不会意识到他们不在一个分支并承诺。 这只是发生在我身上,所以我想我不得不承认我错了,但是考虑到到2016年这个事情发生在我身上,你可能会认为事实上是不太可能的。

无论如何,创build一个新的分支是在我看来是矫枉过正。 你所要做的就是:

 git checkout some-branch git merge commit-sha 

如果在检出另一个分支之前没有复制commit-sha,则可以通过运行以下命令轻松find它:

 git reflog