将现有的,未提交的工作移动到Git中的新分支

Dan*_*nor 2982 git git-stash git-reset git-branch

我开始研究一个新功能,经过一段时间的编码,我决定这个功能应该在它自己的分支上.

如何将现有的未提交更改移动到新分支并重置当前更改?

我想重置当前分支,同时保留新功能的现有工作.

kni*_*ttl 3484

使用以下内容:

git checkout -b <new-branch>
Run Code Online (Sandbox Code Playgroud)

这将使您的当前分支保持原样,创建并签出新分支并保留所有更改.然后您可以使用以下命令进行提交:

git add <files>
Run Code Online (Sandbox Code Playgroud)

并提交到您的新分支:

git commit -m "<Brief description of this commit>"
Run Code Online (Sandbox Code Playgroud)

工作目录中的更改和索引中的更改不属于任何分支.这会改变这些更改的结束位置.

您没有重置原始分支,它保持不变.最后一次提交<old-branch>仍然是一样的.因此你checkout -b然后提交.

  • 仅供参考:工作目录中的更改和索引中的更改不属于分支.`git checkout -b <new branch>`更改这些更改的结束位置. (187认同)
  • 如果您已经拥有分支机构并希望将更改移至现有分支,请查看http://stackoverflow.com/questions/556923/git-how-to-merge-my-local-working-changes-into-another-科 (149认同)
  • 为了确保,我需要在重置原始分支之前提交未完成的功能?或者,无论提交什么,都会保留那些未提交的文件? (14认同)
  • 如果您想将新分支推送到远程存储库:http://stackoverflow.com/questions/2765421/how-to-push-a-new-local-branch-to-remote-repo-and-track-it -太 (14认同)
  • @JDSmith:取消提交更改_do NOT_属于任何分支.它们只驻留在工作目录`git checkout .` /`git reset --hard`将无法恢复**删除它们 (10认同)
  • 我不知道这个基本事实.."工作目录中的变化和索引中的变化不属于任何分支".我正要手动完成这项任务.这个答案非常方便! (2认同)
  • @thedeeno,它似乎是这样.我只是做了`git checkout -b <new-branch>`,然后没有提交,切换回主分支和`git checkout - <modified file>`并且它消除了两个分支上的更改.:(没什么大不了的,没有太多的变化,但是经验教训. (2认同)
  • 值得注意的是,旧分支上已**添加**但未**提交**的更改将轻松移动到新分支。 (2认同)
  • @DaneO'Connor,是的,看来你必须在重置原始分支之前提交未完成的功能,否则当你执行`git checkout - .`或`git checkout时,未提交的更改将在两个分支中被删除.我'我很惊讶没人评论过这个. (2认同)

Rob*_*Qiu 315

或者:

  1. 将当前更改保存到临时存储:

    $ git stash

  2. 基于此存储创建新分支,并切换到新分支:

    $ git stash branch <new-branch> stash@{0}

提示:使用Tab键减少键入存储名称.

  • 如果另一个分支已经存在,你可以用checkout切换到它,然后`git stash apply`. (49认同)
  • 我不明白为什么这比'git checkout -b <new branch name>`的接受答案更好 (9认同)
  • 我不明白提示"提示:使用tab键减少输入藏匿名称." 这个名字不是"藏匿@ {0}"吗?我无法成功运行它. (6认同)
  • 为什么这比接受的答案更好/sf/answers/97636311/? (6认同)
  • 在存储之前你不需要`git add -A`. (5认同)
  • @Noitidart如果你想使用现有的分支(你可以切换到它并使用`git stash apply`)这样会更好 (2认同)
  • “ checkout -b”很好,但是我想您应该记住分支存在的情况下的“ stash apply” ...就像@Archonic所说的。 (2认同)

joe*_*dle 45

如果您在编码时在主分支上进行了提交,但现在要将这些提交移动到另一个分支:

  1. 将当前历史记录复制到新分支,同时带来任何未提交的更改:

    git checkout -b <new-feature-branch>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 现在强制原来的"凌乱"分支回滚:(没有切换到它)

    git branch -f <previous-branch> <earlier-commit-id>
    
    Run Code Online (Sandbox Code Playgroud)

    例如:

    git branch -f master origin/master
    
    Run Code Online (Sandbox Code Playgroud)

    或者如果你做了4次提交:

    git branch -f master HEAD~4
    
    Run Code Online (Sandbox Code Playgroud)

警告:似乎git branch -f master origin/master重置该分支的跟踪信息.因此,如果您已将master分支配置为推送到除此之外的某个位置,origin/master那么配置将丢失.

另一种方法是使用这种重置技术.但是这些说明将丢弃您拥有的任何未提交的更改.如果你想保留它们,先将它们藏起来并在最后取出它们.

  • 这回答了一个与操作问题略有不同的问题.我决定把这个答案放在这里,因为这是谷歌在我寻找答案时带给我的地方.处理这种情况的实际问题[在这里](http://stackoverflow.com/questions/1628563/move-the-most-recent-commits-to-a-new-branch-with-git). (5认同)

Ale*_*rov 23

常见的情况如下:我忘了为新功能创建新分支,并且正在旧功能分支中完成所有工作.我已将所有"旧"工作提交给主分支,我希望我的新分支从"主"增长.我没有单独提交我的新作品.这是分支结构:"master" - >"Old_feature"

git stash 
git checkout master
git checkout -b "New_branch"
git stash apply
Run Code Online (Sandbox Code Playgroud)


pas*_*ord 18

如果你提交它,你也可以挑选单个提交ID.当我开始在master中工作时,我经常这样做,然后想要在我推送到我的原点之前创建一个本地分支.

git cherry-pick <commitID>
Run Code Online (Sandbox Code Playgroud)

有很多你可以摘樱桃做的,如所描述这里,但是这可能是一个用例为您服务.

  • @Meredith,哈哈,是这样的。这太棒了,除非你提前计划你的改变......以及谁来做这件事;) (3认同)
  • 将部分更改移动到新分支的更好的解决方案...因为您可以提交您现在想要的内容,隐藏所有其他更改,检查您要分支的分支,樱桃选择提交到新分支,返回到原始分支,硬重置提交,然后执行存储弹出,添加,提交和唱哈利路亚. (2认同)

Abu*_*oeb 8

选项 1(现有分支机构)

git stash (from main/any-branch)
git checkout your-existing-branch
git stash apply 
Run Code Online (Sandbox Code Playgroud)

选项2(创建新分支)

git switch -c your-new-branch
Run Code Online (Sandbox Code Playgroud)


Eri*_*tta 8

对于使用 Visual Studio Community 2022(可能还有早期版本)的用户,当您有未提交的更改然后创建新分支时,您将看到如下对话框:

在此输入图像描述

只需选择第一个选项将更改带到“[your-new-branch-name]”,然后单击“继续结账”。将创建新分支,您可以继续在那里提交更改。


Kri*_*man 5

实际上,现在有一种非常简单的方法可以使用 GitHub Desktop 来执行此操作,但我不认为以前有此功能。

您需要做的就是切换到 GitHub Desktop 中的新分支,它会提示您将更改保留在当前分支上(将被隐藏),或者将更改带到新分支。只需选择第二个选项,即可将更改带到新分支。然后您可以照常提交。

GitHub 桌面版