【问题标题】:git switch branch without discarding local changesgit switch 分支而不丢弃本地更改
【发布时间】:2014-03-31 16:42:54
【问题描述】:

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

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

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

  • 备份已更改存储库
  • git reset --hard
  • git checkout right-branch
  • 恢复更改
  • git commit -m "changes"

【问题讨论】:

标签: git git-branch


【解决方案1】:

有很多不同的方法,具体取决于您的距离以及您希望它们在哪个分支上。

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

$ 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 push,1 或只是简单的git stash 这是save / push 的缩写:

    $ git stash
    

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

    $ 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 仅当/当满意。 (这当然会引入另一点,您可以再喝咖啡休息一下,忘记自己在做什么,回来做错误的事情,所以这不是一个完美的治疗方法。)


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

【讨论】:

  • 如果我想切换到另一个分支而不提交到当前分支(例如更改未完成)然后切换回继续进行怎么办?
  • @stt106:你仍然必须提交,但你可以通过git stash 提交,就像在这个和其他答案中一样,这样提交 - 对于git stash,你会得到 两个 每个 stash 条目的提交,在一个不寻常的安排中——在 no 分支上。不过,除了非常短期的特殊情况,我通常更喜欢进行正常提交。您可以稍后git reset --softgit reset --mixed,或使用git commit --amend 将其推到一边,当您回到该分支上工作时。 (在现代 Git 中,您还可以使用 git worktree add,这可能是一个更好的解决方案。)
  • “这要么成功,要么抱怨。”。结帐时成功或错误的原因是什么?
  • @Brian: git stash 只是提交。不过,在多个 Git 版本中,git stash 中引入了一些错误,总的来说,我现在建议尽可能避免 git stash
【解决方案2】:

使用 git stash

git stash

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

git stash apply

您甚至可以拉出单个项目。

彻底吹走藏匿处:

git stash clear

【讨论】:

  • 最后一个命令应该是git stash drop; git stash clear 将清除整个存储堆栈,包括可能与这组命令无关的存储。
【解决方案3】:
  • git stash 保存您未提交的更改
  • git stash list 列出你保存的未提交的存储
  • git stash apply stash@{x} 其中 x 可以是 0,1,2..no 的 stash,你已经做了

【讨论】:

    【解决方案4】:

    你可以使用:

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

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

    git -stash documentation

    【讨论】:

      【解决方案5】:

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

      -m --合并

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

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

      【讨论】:

      • 首先尝试简单的git checkout thatbranch,如果它完全安全,如果您的任何更改都没有触及结帐更新的文件。
      • @sergey.n 我认为你的答案是正确的。存储并不总是有效,它在子模块、暂存方面存在问题,如果您在没有提交的分支上直接存储将无法正常工作。但是,您始终可以将更改合并到新分支中。
      【解决方案6】:

      你可以:

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

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

      【讨论】:

        猜你喜欢
        • 2021-09-20
        • 1970-01-01
        • 2022-11-02
        • 1970-01-01
        • 2017-02-08
        • 2017-04-22
        • 2017-05-28
        • 2020-06-01
        相关资源
        最近更新 更多