【发布时间】:2011-06-11 18:09:03
【问题描述】:
所以我在存储库中做了一些工作,当我即将提交时,我意识到我目前不在任何分支上。
在使用子模块时经常发生这种情况,我能够解决它,但是这个过程很乏味,我一直在想必须有一种更简单的方法来做到这一点。
有没有一种简单的方法可以在保留更改的同时返回分支?
【问题讨论】:
标签: git branch git-checkout
所以我在存储库中做了一些工作,当我即将提交时,我意识到我目前不在任何分支上。
在使用子模块时经常发生这种情况,我能够解决它,但是这个过程很乏味,我一直在想必须有一种更简单的方法来做到这一点。
有没有一种简单的方法可以在保留更改的同时返回分支?
【问题讨论】:
标签: git branch git-checkout
如果你还没有提交:
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 的回答,但如果你想避免编写两个额外的命令,我想这是要走的路。
这里另辟蹊径
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
【讨论】:
gitmodules 或许?
在这种情况下结束的一种方法是在从远程分支执行 rebase 之后。在这种情况下,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
如果您在工作树中发生冲突,结帐将失败,但这应该是非常不寻常的,如果发生这种情况,您可以将其隐藏、弹出并解决冲突。
与已接受的答案相比,此答案将为您节省两个命令的执行时间,无论如何执行这些命令并不需要那么长时间。因此,我不会接受这个答案,除非它奇迹般地获得了比当前接受的答案更多的赞成票(或至少接近)。
【讨论】:
以下方法可能有效:
git rebase HEAD master
git checkout master
这会将您当前的 HEAD 更改重新设置在 master 之上。然后就可以切换分支了。
另一种方法是先签出分支:
git checkout master
然后 Git 应该显示你分离的提交的 SHA1,然后你可以挑选它们,例如
git cherry-pick YOURSHA1
或者你也可以合并最新的:
git merge YOURSHA1
要查看来自不同分支的所有提交(以确保您拥有它们),请运行:git reflog。
【讨论】:
我知道我在 2012 年告诉 babay,我认为不太可能有人不会意识到他们不在分支上并提交。这只是发生在我身上,所以我想我不得不承认我错了,但考虑到直到 2016 年才发生在我身上,你可能会争辩说这实际上不太可能。
无论如何,在我看来,创建一个新分支太过分了。您所要做的就是:
git checkout some-branch
git merge commit-sha
如果你在检出另一个分支之前没有复制 commit-sha,你可以通过运行轻松找到它:
git reflog
【讨论】:
我发现最好的方法是将我所做更改的文件复制到一个单独的文件夹中, 然后删除我目前在我的计算机上的存储库文件夹, 然后克隆主存储库并将文件放回去。
【讨论】: