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

时间:2014-02-27 22:47:06

标签: git git-branch

好吧,让我们说有一天我们做了一些修改,当我们去提交它们时,我们注意到我们正在处理错误的分支。

我们如何强制git切换分支而不丢弃本地更改

在我等待回复的时候,我可能会以天真的方式解决这个问题,但我想知道是否有正确的程序,因为如果我说我之前没有发生这种情况我会撒谎...

  • 备份已更改回购
  • git reset --hard
  • git checkout right-branch
  • 还原更改
  • git commit -m "changes"

6 个答案:

答案 0 :(得分:243)

根据您的距离以及您想要的分支,有许多不同的方式。

让我们犯一个经典的错误:

$ 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 save,或只是git stash的简称save

$ git stash

这使用一个奇怪的非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。 (这当然会引入另一个点,你可以再喝一杯咖啡,忘记你在做什么,回来,做错误的事情,所以这不是一个完美的治疗方法。)

答案 1 :(得分:25)

使用git stash

git stash

它将更改推送到堆栈。如果你想将它们拉回来使用

 git stash apply

您甚至可以提取个别物品。彻底吹走藏匿处:

 git stash clear

答案 2 :(得分:9)

  • git stash保存您未提交的更改
  • git stash list列出已保存的未提交的藏匿条件
  • git stash apply stash@{x}其中x可以是0,1,2 ......没有你做过的藏匿

答案 3 :(得分:4)

您可以使用:

  1. git stash 保存您的工作
  2. git checkout <your-branch>
  3. git stash apply git stash pop 加载上一份工作

当您想暂时保存未完成或混乱的工作,而又想在另一个分支上做某事时,Git存放非常有用。

git -stash documentation

答案 4 :(得分:3)

你可以:

  • 使用git stash搁置您的更改,或

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

答案 5 :(得分:0)

您可以使用--merge / -m git checkout选项: git checkout -m <another-branch>

-m --merge

切换分支时,如果您对当前分支和当前分支之间的一个或多个文件进行了本地修改 您要切换到的分支,该命令拒绝切换 分支以便在上下文中保留您的修改。然而, 使用此选项,当前分支,您的分支之间的三向合并 工作树内容,新分支完成,您将进入 新分支。

来源:https://git-scm.com/docs/git-checkout