Answers:
如果您尚未提交:
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 show
或git rev-parse HEAD
),切换到分支,然后git cherry-pick
是提交哈希值。
git merge _hash_
git merge <hash-of-the-commit-you-just-made>
。
这帮助了我
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 gc
在运行这两个命令之间运行会丢失那些提交,但是除非您git gc
自动运行,否则这应该是一种完全无风险的方法。我仍然会接受babay的回答,但是如果您想避免自己编写两个额外的命令,我想这就是要走的路。
另外,您可以设置子模块,以便签出分支而不是处于其默认的分离头状态。
编辑添加:
一种方法是在使用-b标志添加子模块时检出子模块的特定分支:
git submodule add -b master <remote-repo> <path-to-add-it-to>
另一种方法是直接进入子模块目录并签出
git checkout master
gitmodules
也许?
解决这种情况的一种方法是在从远程分支进行了基础更改之后。在这种情况下,新的提交由指向,HEAD
但master
不指向它们-指向重新建立另一个分支之前的位置。
您可以master
通过执行以下操作使此提交成为您的新提交:
git branch -f master HEAD
git checkout master
这会强制更新master
为指向HEAD
(不带您master
),然后切换为master
。
我最近又遇到了这个问题。自从我上次使用子模块并了解了git以来,已经有一段时间了,我意识到只需签出要提交的分支就足够了。即使您不隐藏它,Git也会保留工作树。
git checkout existing_branch_name
如果您想在新分支上工作,则应该适合您:
git checkout -b new_branch_name
如果您在工作树中存在冲突,则签出将失败,但这应该是非常不寻常的,如果发生,您可以将其隐藏,弹出并解决冲突。
与已接受的答案相比,此答案将为您节省两条命令的执行,无论如何它们实际上并不需要花费很长时间。因此,我不会接受这个答案,除非它奇迹般地获得(或至少接近)比当前接受的答案更多的投票。
我知道我在2012年告诉babay,我认为有人不太可能不会意识到自己不在分支机构并承诺。这只是发生在我身上,所以我想我不得不承认我错了,但是考虑到这种情况直到2016年才发生在我身上,你可以说这实际上是不可能的。
无论如何,我认为创建一个新分支是过大的。您要做的就是:
git checkout some-branch
git merge commit-sha
如果在签出另一个分支之前没有复制提交sha,则可以通过运行以下命令轻松找到它:
git reflog