将未提交的更改移动到新分支:git中stash和checkout的区别

3

我已经在branch1中对代码进行了一些更改,但现在我需要将这些更改移动到另一个分支。从图形上看,我有:

master
  |___develop
         |___branch1

我需要将所有未提交的更改和未跟踪的文件移动到一个名为branch2的新分支(该分支不存在):

master
  |___develop
         |___branch1
         |___branch2

之后,我将只删除branch1,因为它的所有更改已经推送,并保留branch2中所有未提交的更改和未跟踪的文件:

master
  |___develop
         |___branch2

在SO中有很多类似的问题,但我仍然不确定我应该如何处理我的情况。一些人建议使用git stash如何将本地未提交的更改合并到另一个Git分支中?将更改的文件移动到另一个分支以进行签入),在我的情况下,我想应该是:

git stash -u
git checkout develop
git checkout -b branch2
git stash pop

但是其他答案(将当前更改放入新的Git分支, 将未提交的更改移动到新分支)建议只需使用checkout命令即可:

git checkout -b branch2

但我不确定这是否也会携带我的未跟踪文件。有一个更新的答案建议使用 switch (将现有、未提交的工作移动到 Git 的新分支中),但我的 git 版本 2.17.1 没有这个命令。

任何帮助都将不胜感激。


我非常确定你提到的第一种方法的命令片段(git stash -u等)会起作用。因为-u标志实际上是--include-untracked,这正是你所需要的。 - Itai Klapholtz
switch 实际上与 checkout 没有任何不同之处,而只是更准确地描述了 checkout 功能的子集。restore 是另一个新命令,将执行 switch 不支持的所有与 checkout 相关的操作。在 switchrestore 之间,不应该有使用 checkout 的必要,它可以被废弃。 - chepner
这个问题要求澄清,然后接受第一个答案,即使它并没有给出更多关于这些命令之间差异的细节。最终会有更多的答案出现,最终会让我们回到导致这个问题的混乱状态,基本上使这个问题成为它提到的问题的重复。 - nnsense
2个回答

4

使用stash更安全,因为它避免了在切换分支时可能出现的工作目录脏问题。 stash甚至有一个子命令可以直接从存储创建分支。

git stash -u
git checkout develop
git stash branch branch2

git stash branch 命令创建一个新分支,该分支使用存储的代码状态的父提交记录,这意味着你在这里执行的 git checkout develop 步骤没有效果。 - torek

2

您可以简单地执行以下操作

git checkout -b branch2

这将携带您所有的更改。毕竟,创建分支不过是用名称 branch2“标记”当前提交。

这会包括未跟踪的文件吗?与涉及更多步骤的“stash”有什么区别? - Gabriel
是的,它将携带未跟踪的文件。与涉及“stash”的解决方案的区别在于@chepner在他的答案中提到的:在具有脏工作目录的情况下切换分支可能会出现问题。 - michid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接