我在代码库里做了一些工作,当我准备提交时才发现我当前没有在任何分支上。
在处理子模块时,这种情况经常发生,虽然我可以解决问题,但这个过程很繁琐,我一直在想肯定有更简单的方法。
有没有一种简单的方法可以回到一个分支上,并保留更改?
我在代码库里做了一些工作,当我准备提交时才发现我当前没有在任何分支上。
在处理子模块时,这种情况经常发生,虽然我可以解决问题,但这个过程很繁琐,我一直在想肯定有更简单的方法。
有没有一种简单的方法可以回到一个分支上,并保留更改?
如果您还没有提交:
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 gc
,你会丢失那些提交,但除非你自动运行git gc
,否则这应该是一种相当安全的方法。我仍然会选择babay的答案,但如果你想节省写两个额外命令的时间,我猜这是一个可行的方法。 - Erik B在从远程分支进行rebase后,有可能会陷入这种情况。在这种情况下,新的提交由 HEAD
指向,但是 master
没有指向它们——它指向了在rebase之前的位置。
你可以通过以下方式将此提交作为新的 master
:
git branch -f master HEAD
git checkout master
这会强制将 master
指向 HEAD
(而不会让你处于 master
),然后切换到 master
分支。
这里提供另一种方式
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
文件? - Hertzel Guinness我最近再次遇到了这个问题。自从我上次使用子模块以来已经有一段时间了,而且通过学习更多关于git的知识,我意识到只需切换到你想提交的分支即可。Git会保留工作树,即使你不stash它。
git checkout existing_branch_name
git checkout -b new_branch_name
如果您的工作树中存在冲突,结帐将失败,但这应该是相当罕见的情况。如果出现这种情况,您可以将其stash,然后pop并解决冲突。
与被接受的答案相比,这个答案将为您节省执行两个命令的时间,这些命令实际上也不需要花费太长时间来执行。因此,除非这个答案奇迹般地获得更多的赞同(或至少接近于目前被接受的答案),否则我将不会接受这个答案。
git rebase HEAD master
git checkout master
这将使你的当前HEAD更改在主分支之上进行变基。然后你可以切换分支。
另一种方法是先检出分支:
git checkout master
然后Git应该会显示您分离的提交的SHA1,然后您可以挑选它们,例如:
git cherry-pick YOURSHA1
或者,您也可以合并最新的版本:
git merge YOURSHA1
要查看来自不同分支的所有提交记录(以确保您已经拥有它们),请运行:git reflog
。
无论如何,我认为创建一个新分支有点过度了。你只需要做以下几步:
git checkout some-branch
git merge commit-sha
如果在切换到其他分支之前没有复制提交的sha值,您可以通过运行以下命令轻松找到它:
git reflog
git show
或git rev-parse HEAD
命令),然后切换到目标分支,最后使用git cherry-pick
命令加上该提交的哈希值即可。 - araqnidgit merge _hash_
。 - Danielgit merge <hash-of-the-commit-you-just-made>
将其合并到该分支中。 - Erik B