所以我在存储库中完成了一些工作,当我即将提交时,我意识到我目前不在任何分支机构。
使用子模块时会发生很多事情并且我能够解决它,但是这个过程很繁琐,而且我一直认为必须有一种更简单的方法来实现这一点。
是否有一种简单的方法可以回到分支上,同时保留更改?
答案 0 :(得分:187)
如果你还没有承诺:
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
答案 1 :(得分:154)
git checkout -b newbranch
git checkout master
git merge newbranch
git branch -d newbranch
答案 2 :(得分: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
答案 3 :(得分:11)
离开这里
git branch newbranch
git checkout master
git merge newbranch
答案 4 :(得分:9)
或者,您可以设置子模块,以便检查分支而不是处于默认的分离头状态。
已编辑添加:
一种方法是在使用-b标志添加子模块时检出子模块的特定分支:
git submodule add -b master <remote-repo> <path-to-add-it-to>
另一种方法是进入子模块目录并查看它
git checkout master
答案 5 :(得分:4)
我最近又遇到了这个问题。自从我上次使用子模块并学习了更多关于git的知识以来,已经有一段时间了,我意识到只需检查出你想要提交的分支就足够了。即使你没有藏匿它,Git也会保留工作树。
git checkout existing_branch_name
如果你想在一个新的分支上工作,这对你有用:
git checkout -b new_branch_name
如果工作树中存在冲突,则结帐将失败,但这应该是非常不寻常的,如果发生这种情况,您可以将其存储,弹出并解决冲突。
与接受的答案相比,这个答案将为您节省两个命令的执行,这两个命令实际上并不需要那么长时间才能执行。因此,我不接受这个答案,除非它奇迹般地得到比当前接受的答案更多的赞成(或至少接近)。
答案 6 :(得分:2)
以下方法可能有效:
git rebase HEAD master
git checkout master
这会将您当前的HEAD更改重新置于主控之上。然后你可以切换分支。
替代方法是首先签出分支:
git checkout master
然后Git应该显示你的分离提交的SHA1,然后你可以挑选它们,例如。
git cherry-pick YOURSHA1
或者您也可以合并最新的一个:
git merge YOURSHA1
要查看来自不同分支的所有提交(以确保您拥有它们),请运行:git reflog
。
答案 7 :(得分:0)
我知道我在2012年告诉babay,我认为不可能有人不会意识到他们不在分支机构并承诺。这恰好发生在我身上,所以我想我必须承认我错了,但是考虑到直到2016年这件事发生在我身上,你可能会认为它实际上不太可能。
无论如何,在我看来,创建一个新分支是过度的。您所要做的就是:
git checkout some-branch
git merge commit-sha
如果你在签出另一个分支之前没有复制commit-sha,你可以通过运行来轻松找到它:
git reflog
答案 8 :(得分:0)
在这种情况下结束的一种方法是在从远程分支进行重新设置基准之后。在这种情况下,新的提交由HEAD
指向,但是master
并不指向它们,而是指向重新建立另一个分支之前的位置。
您可以执行以下操作,以使其提交新的master
:
git branch -f master HEAD
git checkout master
这会强制更新master
使其指向HEAD
(无需将您放在master
上),然后切换到master
。
答案 9 :(得分:-1)
我发现的最好方法是将我所做更改的文件复制到一个单独的文件夹中, 然后删除我当前在计算机上的存储库文件夹, 然后克隆主存储库并将文件放回。