如何将我当前的更改提交到Git中的不同分支

有时我在工作目录下做了一些改动,我意识到这些改动应该提交到与当前目录不同的分支中。这通常发生在我想尝试新事物或做一些测试的时候,我忘记事先创建一个新分支,但我不想把脏代码提交到master分支。

所以,如何将未提交的更改(或存储在索引中的更改)提交到与当前分支不同的分支?

469491 次浏览
  1. git checkout my_other_branch
  2. git add my_file my_other_file
  3. git commit -m

并提供您的提交消息。

您可以创建一个新分支并切换到它。然后提交您的更改:

git branch dirtygit checkout dirty// And your commit follows ...

或者,您也可以签出现有分支(仅git checkout <name>)。但前提是没有冲突(所有编辑文件的基础与当前分支中的相同)。否则,您将收到一条消息。

请注意,在切换到现有发散分支的情况下,您可以使用-m选项告诉git尝试合并更改,即git checkout -m <name>

其他答案建议签出另一个分支,然后提交给它,只有在给定本地修改的情况下可以签出时才有效。如果不是,你处于git stash最常见的用例中:

git stashgit checkout other-branchgit stash pop

第一个stash隐藏了您的更改(基本上是临时提交),随后的stash pop重新应用它们。这让Git可以使用其合并功能。

如果,当您尝试弹出存储时,您遇到了合并冲突……接下来的步骤取决于这些冲突是什么。如果所有隐藏的更改确实属于另一个分支,您只需对它们进行排序-这是在错误的分支上进行更改的结果。

另一方面,如果你真的搞砸了,并且你的工作树有两个分支的更改混合在一起,并且冲突只是在你想要提交回原始分支的更改中,你可以节省一些工作。像往常一样,有很多方法可以做到这一点。这是一个,从你弹出并看到冲突后开始:

# Unstage everything (warning: this leaves files with conflicts in your tree)git reset
# Add the things you *do* want to commit heregit add -p     # or maybe git add -igit commit
# The stash still exists; pop only throws it away if it applied cleanlygit checkout original-branchgit stash pop
# Add the changes meant for this branchgit add -pgit commit
# And throw away the restgit reset --hard

或者,如果您提前意识到这将发生,只需提交属于当前分支的内容。您可以随时回来修改该提交:

git add -pgit commitgit stashgit checkout other-branchgit stash pop

当然,请记住,这一切都需要一些工作,下次避免它,也许可以通过在bashrc文件中的ps1环境变量中添加$(__git_ps1)来将您当前的分支名称放入提示符中。(例如,请参阅Bash中的Git留档。)