git 切换分支而不丢弃本地更改

标签 git git-branch

好吧,假设有一天我们碰巧做了一堆修改,当我们提交它们时,我们发现我们在错误的分支上工作。

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

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

  • 备份更改的repo
  • git reset --hard
  • git checkout 右分支
  • 恢复更改
  • git commit -m "changes"

最佳答案

有很多不同的方法,具体取决于您走了多远以及您希望它们位于哪个分支。

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

$ 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. 确实有开发。看看 Git 是否会让你在没有的情况下切换 做任何事:

    $ git checkout develop
    

    这要么成功,要么报错。如果成功了,太好了!只是 犯罪。如果不是(错误:您对以下文件的本地更改将被覆盖...),您仍然有很多选择。

    最简单的可能是 git stash(和所有其他回答者一样 这让我不得不点击 post 说)。运行 git stash savegit stash push1 或只是 git stash 的缩写 保存/推送:

    $ git stash
    

    这会提交你的代码(是的,它确实做了一些提交)使用 一种奇怪的非分支方法。它所做的提交不是“在”任何 分支但现在安全地存储在存储库中,所以你现在可以 切换分支,然后“应用”存储:

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

    如果一切顺利,并且您喜欢结果,那么您应该 git stash drop 存储。这会删除对奇怪的非分支 y 提交的引用。 (它们仍然在存储库中,有时可以在紧急情况下取回,但对于大多数用途,您应该认为它们在此时已经消失。)

apply 步骤 merge stash 的更改,使用 Git 强大的底层 merge 机制,这与您进行分支 merge 时使用的是同一种东西。这意味着如果您错误地处理的分支与您打算处理的分支有很大不同,您可能会遇到“merge 冲突”。因此,在假设存储应用干净之前,仔细检查结果是个好主意,即使 Git 本身没有检测到任何 merge 冲突也是如此。

许多人使用 git stash pop,它是 git stash apply && git stash drop 的简写。就目前而言这很好,但这意味着如果应用程序导致一团糟,并且您决定不想继续沿着这条路前进,那么您将无法轻易取回 stash 的东西。这就是为什么我建议单独 apply,检查结果,drop 仅当/当满意时。 (这当然会引入另一个点,您可以再喝杯咖啡休息一下,然后忘记自己在做什么,然后回来做的事情,所以这不是一个完美的治疗方法。)


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

关于git 切换分支而不丢弃本地更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22082307/

相关文章:

git - 在 Github 项目中搜索代码

git - 我如何编辑一个包含数百个 merge 和 merge 冲突的 Git 提交?

带有私钥的 Docker 容器上的 git 权限被拒绝

git - 当输出重定向到文件时,git show 可以安全地用于二进制文件吗?

git - 你应该在 Github 上 fork 还是分支?

git - 如何停止推送到 git 中的多个远程分支? (又名,如何取消跟踪远程 git 分支?)

Git 跟踪非原始分支的上游分支

git - 强制删除 Git 中的一个分支?

git - 如何使用 Jenkins 为许多 repos 创建和推送新的 Github 分支?

git - 如何在裸 Git 存储库中搜索当前修订内容中的字符串?