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

mbjcgjjk  于 2023-03-06  发布在  Git
关注(0)|答案(6)|浏览(117)

好吧,假设有一天我们碰巧做了一系列修改,当我们提交它们时,我们注意到我们在错误的分支上工作。
我们如何强制git切换分支而不丢弃本地修改
我可能会去一个天真的方式,而我等待答复,但我想知道是否有一个正确的程序,因为我会撒谎,如果我说这从来没有发生在我身上...

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

r1wp621o1#

有一堆不同的方式取决于你沿着多远,你希望他们在哪个分支。
让我们来看看一个经典的错误:

$ 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上。
1.你 * 确实 * 有一个develop,看看Git是否会让你不做任何事情就切换:

$ git checkout develop

这要么成功,要么抱怨。如果成功,太好了!只要提交。如果不成功(error: Your local changes to the following files would be overwritten ...),你 * 仍然 * 有很多选择。
最简单的可能是git stash(就像所有其他比我先点击帖子的回答者说的那样),运行git stash savegit stash push,1或者只是简单的git stash,它是save/push的缩写:

$ git stash

这会使用一种奇怪的non-branch-y方法提交代码(是的,它确实会提交一些代码),它所做的提交不会“在”任何分支上,而是安全地存储在仓库中,所以你现在可以切换分支,然后“应用”隐藏的代码:

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

如果一切顺利,并且你喜欢结果,你应该git stash drop the stash.这会删除对奇怪的non-branch-y提交的引用.(它们仍然在仓库中,有时候可以在紧急情况下被检索,但大多数情况下,你应该认为它们已经不在了.)
apply步骤使用Git强大的底层合并机制来合并隐藏的修改,这和你进行分支合并时使用的机制是一样的。这意味着如果你错误地操作了分支,你可能会遇到“合并冲突”。与您要处理的分支有很大的不同。因此,最好仔细检查结果即使Git本身没有检测到任何合并冲突 *,也要确保stash应用干净。
许多人使用git stash pop,它是git stash apply && git stash drop的简写,就其本身而言,这是很好的,但这意味着如果应用程序导致混乱,而您决定不想继续使用这条路径,则无法轻松地将其恢复。这就是为什么我建议单独使用apply,检查结果,drop只有在满意的情况下(当然,这也引入了另一个观点,即您可以再次喝咖啡休息,忘记您正在做的事情,然后回来做“错误”的事情,因此这不是一个完美的治疗方法)。
1 git stash save中的save是创建新仓库的旧动词。Git 2.13版引入了新动词,使之与pop更一致,并为创建命令添加了更多选项。Git 2.16版正式弃用了旧动词(尽管它在Git 2.23中仍然有效,这是我编辑本文时的最新版本)。

cidc1ykv

cidc1ykv2#

使用git stash

git stash

它将更改推送到堆栈。当您希望将更改拉回时,请使用

git stash apply

您甚至可以拉出单个项目。
为了彻底摧毁藏匿点:

git stash drop
zzlelutf

zzlelutf3#

您可以使用:

  1. git stash * 保存您的工作 *
  2. git checkout <your-branch>
  3. git stash apply * 或 * git stash pop * 以加载上一个工作 *
    当你想暂时保存未完成或凌乱的工作,同时又想在另一个分支上做一些事情时,Git stash非常有用。
    git -stash documentation
dauxcl2d

dauxcl2d4#

  • git stash保存未提交的更改
  • git stash list以列出您保存的未提交存储
  • git stash apply stash@{x},其中x可以是0、1、2 ...您已进行的藏匿数量
iq0todco

iq0todco5#

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

  • m-合并
    切换分支时,如果您对当前分支和要切换到的分支之间的一个或多个文件进行了不同的本地修改,则该命令将拒绝切换分支,以便在上下文中保留您的修改。但是,使用此选项时,将完成当前分支、工作树内容和新分支之间的三向合并,并且您将位于新分支上。
    来源:https://git-scm.com/docs/git-checkout
sshcrbum

sshcrbum6#

您可以:

  • 使用git stash搁置更改,或者,
  • 创建另一个分支并在那里提交更改,然后将该分支合并到工作目录中

相关问题