git switch分支而不丢弃本地更改


178

好吧,可以说有一天我们碰巧做了很多修改,当我们提交它们时,我们注意到我们在错误的分支上工作。

我们如何在不丢弃本地更改的情况下强制git切换分支。

我可能会天真地等待回复,但是我想知道是否存在正确的程序,因为如果我说以前没有发生过这种情况,我会撒谎。

  • 备份已更改的回购
  • git reset --hard
  • git checkout right-branch
  • 恢复更改
  • git commit -m "changes"

Answers:


338

有多种方法,具体取决于您走多远以及您希望它们在哪个分支上。

让我们来看一个经典的错误:

$ git checkout master
... pause for coffee, etc ...
... return, edit a bunch of stuff, then: oops, wanted to be on develop

因此,现在您希望尚未更改的这些更改master继续进行develop

  1. 如果你没有一个develop呢,方法很简单:

    $ git checkout -b develop
    

    develop无论您现在在哪里,这都会创建一个新分支。现在您可以提交了,新的东西就全部启用了develop

  2. 确实有一个develop。看看Git是否会让您不做任何事情切换:

    $ git checkout develop
    

    这要么成功,要么抱怨。如果成功,那就太好了!刚犯下。如果不是(error: Your local changes to the following files would be overwritten ...),您仍然有很多选择。

    最简单的可能是git stash(就像其他击败我的其他回答者post所说)。运行git stash savegit stash push1或只是简单的git stash,它是save/的缩写push

    $ git stash
    

    这使用怪异的non-branch-y方法提交了您的代码(是的,确实确实进行了一些提交)。它所做的提交不在任何分支上,而是现在安全地存储在存储库中,因此您现在可以切换分支,然后“应用”存储:

    $ git checkout develop
    Switched to branch 'develop'
    $ git stash apply
    

    如果一切顺利,并且您喜欢结果,那么应该git stash drop隐藏。这将删除对奇怪的非分支提交的引用。(它们仍然在存储库中,有时可以在紧急情况下进行检索,但是对于大多数目的,您应该考虑到它们已经消失了。)

apply步骤使用Git强大的底层合并机制合并隐藏的更改,与分支合并时使用的东西相同。这意味着如果您错误地处理的分支与您要处理的分支有足够的区别,则可能会出现“合并冲突”。因此,最好是在假定存储没有问题的情况下仔细检查结果即使Git本身未检测到任何合并冲突也是如此。

很多人使用git stash pop,这是简写git stash apply && git stash drop。就目前而言,这很好,但这意味着,如果应用程序导致混乱,而您决定不想沿着这条路走下去,就无法轻易地收回藏匿处。这就是为什么我建议单独apply/检查结果(drop仅在满足时)。(当然,这确实引入了另一个观点,您可以再休息一下,而忘记自己在做什么,回来做错事情,因此这不是完美的解决方法。)


1savegit stash save是老动词用于创建新的存储。Git版本2.13引入了新的动词,以使事物更一致,pop并为创建命令添加更多选项。Git版本2.16正式弃用了旧的动词(尽管它仍然可以在Git 2.23中使用,Git 2.23是我编辑此版本时的最新版本)。


3
如果我要切换到另一个分支而不提交到当前分支(例如,更改尚未完成),然后又切换回继续该怎么办?
stt106

@ stt106:您仍然必须提交,但是您可以像在此和其他答案中git stash那样进行提交,以使这些提交(对于git stash,您每个存储项获得两次提交,这是一种不寻常的安排)不在任何分支上。但是,除了非常短期的特殊情况外,我通常更喜欢进行常规提交。你可以git reset --softgit reset --mixed更高版本,或使用git commit --amend来推它放在一边,当你回到该分支上工作。(在现代Git中,您也可以使用git worktree add,这可能是更好的解决方案。)
torek

“这要么成功,要么抱怨。” 结帐时成功或出错的原因是什么?
nanocv


当我按照上述步骤进行切换时,我在<a>分支中进行所有更改的所有本地更改都丢失了,我想移至<b>分支并在其中推送所有更改。当我执行git stash并移至其他分支时,它会拉动<b>分支的所有文件,而我的本地更改正在丢失
Mukul Munjal

38

使用git stash

git stash

它将更改推送到堆栈。当您想将它们拉回原位时使用

 git stash apply

您甚至可以拉出单个物品。要完全清除藏匿处:

 git stash clear

7
最后一个命令应该是git stash drop; git stash clear将清除整个存储堆栈,包括与此命令集可能无关的存储。
Leland

15
  • git stash 保存您未提交的更改
  • git stash list 列出您保存的未提交存储
  • git stash apply stash@{x} 其中x可以是0,1,2 ..

4

您可以:

  • 使用git stash搁置更改,或者,

  • 创建另一个分支并在那里提交更改,然后将该分支合并到您的工作目录中

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.