这经常发生在我身上:我写了一些代码,检查我的更改,然后意识到我不在适当的分支中来检查那些更改。 但是,如果不还原更改,我将无法切换到另一个分支。 有没有办法将更改移动到另一个要在其中检查的分支?
#1楼
如果要将更改移动到新分支 ,只需两个命令即可完成:
git stash
git stash branch new-branch
根据git stash文档 :
分支
<branchname> [<stash>]分支<branchname> [<stash>]从最初创建
<stash>的提交开始创建并签<branchname>为<branchname>的新分支,并将记录的更改应用于新的工作树和索引。
#2楼
 不幸的是,这也经常发生在我身上,如果我在git commit之前意识到自己的错误,就使用git stash ,否则使用git cherry-pick否则在其他答案中都很好地解释了这两个命令 
 我想为git checkout targetBranch添加一个说明: 如果targetBranch与当前分支具有相同的历史记录,则此命令仅保留您的工作目录和暂存快照 
如果尚未提交更改,只需使用git checkout移至新分支 ,然后按常规提交即可
 @Amber的语句不是假的,当您移至newBranch , git checkout -b newBranch ,将创建一个新指针,该指针指向与当前分支完全相同的提交。 
 实际上,如果您碰巧有另一个分支与当前分支共享历史记录(两个点都在同一提交中),则可以通过git checkout targetBranch “移动更改” 
 但是,通常不同的分支意味着不同的历史记录,并且Git不允许您在具有肮脏工作目录或暂存区的这些分支之间进行切换。 在这种情况下,您可以执行git checkout -f targetBranch (清除并丢弃更改)或git stage + git checkout targetBranch (清除并保存更改),仅运行git checkout targetBranch会产生错误: 
错误:检出将覆盖对以下文件的本地更改:...在切换分支之前,请先提交更改或将其存储起来。 堕胎
#3楼
一个软的git reset会将提交的更改放回到索引中。 接下来,签出您打算提交的分支。 然后使用新的提交消息进行git commit 。
- git reset --soft <commit>
- git checkout <branch>
- git commit -m "Commit message goes here"
从git docs :
git reset [<mode>] [<commit>]此表单将当前分支头重置为,并可能根据来更新索引(将其重置为的树)和工作树。 如果省略,则默认为--mixed。 必须为以下之一:
--soft完全不触摸索引文件或工作树(但将头重置为,就像所有模式一样)。 就像git status那样,这会将所有更改的文件保留为“要提交的更改”。
#4楼
 如果尚未提交更改 ,只需使用git checkout移至新分支,然后按常规提交即可-对文件的更改在提交之前不会绑定到特定分支。 
如果您已经提交改变:
-  键入git log并记住要移动的提交的SHA。
- 签出您要将提交移至的分支。
-  输入git cherry-pick SHA并从上方替换SHA。
- 切换回原始分支。
-  在错误分支提交之前,使用git reset HEAD~1重置。
 cherry-pick接受给定的提交并将其应用于当前已检出的头部,从而使您可以将提交复制到新分支。 
#5楼
 git stash是您的朋友。 
 如果尚未提交,请运行git stash 。 这样可以节省您的所有更改。 
 切换到要更改的分支,然后运行git stash pop 。 
git stash有很多用途。 这当然是更有用的原因之一。
一个例子:
# work on some code
git stash
git checkout correct-branch
git stash pop
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3167279