Git:“目前不在任何分支上。”在保持变化的同时,有没有一种简单的方法可以回到分支机构?

问题描述 投票:182回答:9

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

在使用子模块时,这种情况发生了很多,我能够解决它,但是这个过程很繁琐,我一直在想必须有一个更简单的方法来做到这一点。

有没有一种简单的方法可以回到分支上,同时保持变化?

git branch git-checkout
9个回答
190
投票

如果你还没有承诺:

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

155
投票

这对我有帮助

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

22
投票
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

11
投票

在这里留下另一种方式

git branch newbranch
git checkout master 
git merge newbranch 

9
投票

或者,您可以设置子模块,以便检查分支而不是处于默认的分离头状态。

编辑添加:

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

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

另一种方法是进入子模块目录并检查它

git checkout master

4
投票

我最近又遇到了这个问题。自从我上次使用子模块并学习了更多关于git的知识以来,已经有一段时间了,我意识到只需检查出你想要提交的分支就足够了。即使你没有藏匿它,Git也会保留工作树。

git checkout existing_branch_name

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

git checkout -b new_branch_name

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

与接受的答案相比,这个答案将为您节省两个命令的执行,这两个命令实际上并不需要那么长的时间来执行。因此,我不会接受这个答案,除非它奇迹般地得到比当前接受的答案更多的赞成(或至少接近)。


2
投票

以下方法可能有效:

git rebase HEAD master
git checkout master

这将在主服务器之上修改当前的HEAD更改。然后你可以切换分支。


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

git checkout master

那么Git应该显示你的分离提交的SHA1,然后你可以挑选它们,例如

git cherry-pick YOURSHA1

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

git merge YOURSHA1

要查看来自不同分支的所有提交(以确保您拥有它们),请运行:git reflog


0
投票

我知道我在2012年告诉babay,我认为不可能有人不会意识到他们不在分支机构并承诺。这恰好发生在我身上,所以我想我不得不承认我错了,但考虑到直到2016年这件事发生在我身上,你可能会说它实际上不太可能。

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

git checkout some-branch
git merge commit-sha

如果在签出其他分支之前没有复制commit-sha,则可以通过运行以下命令轻松找到它:

git reflog

0
投票

在这种情况下结束的一种方法是在从远程分支执行rebase之后。在这种情况下,新的提交由HEAD指向,但master没有指向它们 - 它指向你重新定位另一个分支之前的任何地方。

你可以通过这样做来提交你的新master

git branch -f master HEAD
git checkout master

这强行更新master指向HEAD(没有把你放在master)然后切换到master

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.