有时,我在工作目录中进行了一些更改,并且我意识到这些更改应该在与当前目录不同的一个分支中提交。当我想尝试新事物或做一些测试并且忘记事先创建一个新分支,但又不想将脏代码提交给 master 分支时,通常会发生这种情况。
因此,如何使未提交的更改(或存储在索引中的更改)提交到与当前分支不同的分支?
其他答案建议先签出另一个分支,然后再提交给其他分支,只有在给定本地修改的情况下签出才可行。如果没有,那么您处于git stash
的最常见用例中:
git stash
git checkout other-branch
git 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 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)
来在提示符下输入当前分支名称。 (例如,请参阅Bash 中的 Git 文档。)
您可以只创建一个新分支并切换到该分支。然后提交您的更改:
git branch dirty
git checkout dirty
// And your commit follows ...
另外,您也可以签出现有分支(只需git checkout <name>
)。但是只有在没有冲突的情况下(所有已编辑文件的基础与您当前分支中的基础相同)。否则,您会收到一条消息。
git checkout my_other_branch
git add my_file my_other_file
git commit -m
并提供您的提交消息。