【问题标题】:Moving uncommitted changes to a new branch: git: stash vs checkout将未提交的更改移动到新分支:git: stash vs checkout
【发布时间】:2021-05-01 12:24:26
【问题描述】:

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

master
  |___develop
         |___branch1

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

master
  |___develop
         |___branch1
         |___branch2

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

master
  |___develop
         |___branch2

SO中有很多类似的问题,但我仍然不确定我应该如何处理我的情况。有人说使用git stash (How do I merge my local uncommitted changes into another Git branch?, moving changed files to another branch for check-in) 在我的情况下我猜是:

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

但其他答案(Put current changes in a new Git branchMoving uncommitted changes to a new branch)说只需将checkout 用作:

git checkout -b branch2

但我不确定这是否也会携带我未跟踪的文件。有一个较新的答案建议使用switch (Move existing, uncommitted work to a new branch in Git),但我的git 2.17.1 版本没有这个命令。

任何帮助将不胜感激。

【问题讨论】:

  • 我很确定您描述您提到的第一种方法的命令(git stash -u 等)会起作用。因为 -u 标志实际上是 --include-untracked,这是你需要的。
  • switchcheckout 并没有什么不同;相反,它是对checkout 功能子集的更准确描述。 restore 是另一个新命令,它将执行 checkout 所做的任何 switch 所做的事情。在switchrestore 之间,应该不需要使用checkout,它可以被淘汰。

标签: git git-branch git-commit git-stash


【解决方案1】:

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

git stash -u
git checkout develop
git stash branch branch2

【讨论】:

  • git stash branch 使用 stash 的父提交创建新分支,这意味着您在此处的 git checkout develop 步骤无效。
【解决方案2】:

你可以这样做

git checkout -b branch2

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

【讨论】:

  • 这也会携带未跟踪的文件吗?涉及更多步骤的stash 有什么区别?
  • 是的,它将携带未跟踪的文件。涉及stash 的解决方案的不同之处在于@chepner 在他的回答中提到:使用脏工作目录切换分支可能会弹出的问题。
猜你喜欢
  • 2016-06-08
  • 2012-11-21
  • 1970-01-01
  • 2012-06-28
  • 2020-07-28
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多