这经常发生在我身上:我写了一些代码,去检查我的更改,然后意识到我没有在正确的分支中检查这些更改.但是,如果没有我的更改还原,我无法切换到另一个分支.有没有办法将更改移动到另一个分支进行检查?
Bil*_*oor 675
git stash 是你的朋友.
如果您还没有提交,请运行git stash.这样可以省去所有更改.
切换到您想要更改的分支并运行git stash pop.
git stash有很多用途.这当然是更有用的原因之一.
一个例子:
# work on some code
git stash
git checkout correct-branch
git stash pop
Run Code Online (Sandbox Code Playgroud)
Amb*_*ber 235
如果您还没有提交更改,只需使用git checkout移动到新分支然后正常提交它们 - 在您提交文件之前,对文件的更改不会绑定到特定分支.
如果您有已经提交改变:
git log并记住要移动的提交的SHA.git cherry-pick SHA从以上取代SHA.git reset HEAD~1在错误的分支提交之前重置.cherry-pick 获取给定的提交并将其应用于当前已检出的头,从而允许您将提交复制到新分支.
mr_*_*ore 34
如果要将更改移动到新分支,只需两个命令即可完成此操作:
git stash
git stash branch new-branch
Run Code Online (Sandbox Code Playgroud)
根据git stash文档:
科
<branchname> [<stash>]创建并检出
<branchname>从<stash>最初创建的提交开始命名的新分支,将记录的更改应用于新的工作树和索引.
wat*_*HUN 14
可悲的是,这种情况也经常发生在我身上,git stash如果我之前意识到我的错误git commit并使用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就会出错:
错误:以下文件的本地更改将被checkout覆盖:...请在切换分支之前提交更改或存储它们.中止
一个软复位的git会把提交更改回你的指数。接下来,检查您打算提交的分支。然后使用新的提交消息git commit。
git reset --soft <commit>
git checkout <branch>
git commit -m "Commit message goes here"
从git 文档:
git reset [<mode>] [<commit>]这种形式将当前分支头重置为并可能更新索引(将其重置为 的树)和工作树取决于 。如果省略,则默认为 --mixed。必须是以下之一:
--soft根本不接触索引文件或工作树(但将头部重置为 ,就像所有模式一样)。这会留下所有更改的文件“要提交的更改”,正如 git status 所说的那样。