有时,我会在工作目录中进行一些更改,我意识到这些更改应该在与当前不同的分支中提交。这通常发生在我想尝试新的东西或做一些测试,但我忘记事先创建一个新分支,但我不想将脏代码提交给主分支时。
那么,如何将未提交的更改(或存储在索引中的更改)提交到与当前分支不同的分支?
有时,我会在工作目录中进行一些更改,我意识到这些更改应该在与当前不同的分支中提交。这通常发生在我想尝试新的东西或做一些测试,但我忘记事先创建一个新分支,但我不想将脏代码提交给主分支时。
那么,如何将未提交的更改(或存储在索引中的更改)提交到与当前分支不同的分支?
您只需创建一个新分支并切换到它。然后提交您的更改:
git branch dirty
git checkout dirty
// And your commit follows ...
或者,您也可以签出现有的分支(只需gitcheckout<name>)。但只有在没有冲突的情况下(所有编辑文件的基础与当前分支中的基础相同)。否则你会收到一条信息。
注意,在切换到现有分支的情况下,可以使用-m选项告诉git尝试合并更改,即git checkout-m<name>
其他答案建议签出另一个分支,然后提交到它,只有在本地修改后可以签出时才有效。如果没有,您将使用git stash最常见的用例:
git stash
git checkout other-branch
git stash pop
第一个隐藏隐藏了您的更改(基本上是临时提交),随后的隐藏pop会重新应用它们。这使得Git可以使用其合并功能。
如果,当你试图打开隐藏时,你遇到了合并冲突。。。接下来的步骤取决于这些冲突是什么。如果所有隐藏的更改确实属于另一个分支,那么您只需对它们进行排序-这是在错误的分支上进行更改的结果。
另一方面,如果您真的搞砸了,并且您的工作树中有两个分支的混合更改,而冲突恰好发生在您想要提交回原始分支的冲突中,那么您可以节省一些工作。和往常一样,有很多方法可以做到这一点。这里有一个,从你弹出并看到冲突后开始:
# 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文档。)