有时我会在我的工作目录中进行一些更改,并且我意识到这些更改应该提交到与当前分支不同的分支中。这通常发生在我想尝试新事物或进行一些测试并且我忘记事先创建一个新分支,但我不想将脏代码提交到主分支时。
那么, 我怎样才能将未提交的更改(或存储在索引中的更改)提交到与当前分支不同的分支?
其他建议签出另一个分支,然后提交到它的答案,只有在考虑到本地修改的情况下可以签出时才有效。如果没有,您将处于最常见的用例中git stash:
git stash
git stash git checkout other-branch git stash pop
第一个stash隐藏您的更改(基本上是临时提交),然后stash pop重新应用它们。这让 Git 可以使用它的合并功能。
stash
stash pop
如果,当您尝试弹出存储时,遇到合并冲突......下一步取决于这些冲突是什么。如果所有隐藏的更改确实属于另一个分支,那么您只需对它们进行排序 - 这是在错误分支上进行更改的结果。
另一方面,如果你真的搞砸了,并且你的工作树有两个分支的混合更改,并且冲突只是在你想要提交回原始分支的那些,你可以节省一些工作. 像往常一样,有很多方法可以做到这一点。这是一个,从您弹出并查看冲突开始:
# Unstage everything (warning: this leaves files with conflicts in your tree) git reset # Add the things you *do* want to commit here git add -p # or maybe git add -i git commit # The stash still exists; pop only throws it away if it applied cleanly git checkout original-branch git stash pop # Add the changes meant for this branch git add -p git commit # And throw away the rest git reset --hard
或者,如果您提前意识到这将发生,只需提交属于当前分支的内容。您可以随时返回并修改该提交:
git add -p git commit git stash git checkout other-branch git stash pop
当然,请记住,这一切都需要做一些工作,下次避免这样做,也许可以通过在bashrc文件中添加PS1环境变量$(__git_ps1)将当前分支名称放在提示符中。(参见例如Git in Bash文档。)
$(__git_ps1)