这经常发生在我身上:我写了一些代码,去检查我的更改,然后意识到我没有在正确的分支中检查这些更改。但是,如果没有我的更改还原,我无法切换到另一个分支。有没有办法将更改移动到另一个分支进行检查?
答案 0 :(得分:587)
git stash
是你的朋友。
如果您尚未提交,请运行git stash
。这样可以省去所有更改。
切换到您希望更改的分支,然后运行git stash pop
。
git stash有很多用途。这当然是更有用的原因之一。
一个例子:
# work on some code
git stash
git checkout correct-branch
git stash pop
答案 1 :(得分:214)
如果您尚未提交更改,只需使用git checkout
移至新分支,然后正常提交 - 文件更改不会绑定到特定分支,直到你犯了他们。
如果您已已提交更改:
git log
并记住要移动的提交的SHA。git cherry-pick SHA
替换上面的SHA。git reset HEAD~1
重置。 cherry-pick
接受一个给定的提交并将其应用于当前检出的头部,从而允许您将提交复制到新的分支。
答案 2 :(得分:33)
如果您想将更改移至新分支,只需使用两个命令即可完成此操作:
git stash
git stash branch new-branch
分支
<branchname> [<stash>]
创建并签出一个名为
<branchname>
的新分支 最初创建<stash>
的提交适用于 记录在新工作树和索引中的更改。
答案 3 :(得分:10)
可悲的是,这种情况也经常发生在我身上,如果我在git stash
之前意识到我的错误并使用git commit
,我会使用git cherry-pick
,否则两个命令在其他答案中都会得到很好的解释< / p>
我想为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
(清除和保存更改),只需运行{{1}会出错:
错误:您对以下文件的本地更改将被覆盖 结帐时: ... 请在切换分支之前提交更改或存储它们。中止
答案 4 :(得分:0)
软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一样 它。