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

Move existing, uncommitted work to a new branch in Git

我开始了一些关于新特性的工作,在编码了一会儿之后,我决定这个特性应该在它自己的分支上。

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

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


使用以下内容:

1
git checkout -b <new-branch>

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

1
git add <files>

并承诺您的新分支机构:

1
git commit -m"<Brief description of this commit>"

工作目录中的更改和索引中分段的更改还不属于任何分支。这将改变这些改变的最终结果。

你不会重置你原来的分支,它会保持原样。对的最后一次承诺仍然是相同的。因此,你必须承诺。


可选地:

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

    $ git stash

  • 基于此存储创建新分支,然后切换到新分支:

    $ git stash branch stash@{0}

  • 提示:使用tab键减少输入存储名称。


    如果您在编写代码时对主分支进行了提交,但现在希望将这些提交移动到其他分支:

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

    1
    git checkout -b <new-feature-branch>
  • 现在强制原来的"凌乱"分支回滚:(不切换到它)

    1
    git branch -f [cc] <earlier-commit-id>

    例如:

    1
    git branch -f master origin/master

    或者,如果您作出了4项承诺:

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

    另一种方法是使用这种重置技术。但这些指令将丢弃您所拥有的任何未提交的更改。如果你想保留这些,先把它们藏起来,最后再把它们拆开。


    如果你提交它,你也可以选择单一的提交ID。当我在master中开始工作时,我经常这样做,然后在我向上推到我的源/之前创建一个本地分支。

    1
    git cherry-pick <commitID>

    如本文所述,您可以使用cherry pick做很多事情,但这可能是您的一个用例。


    常见的场景如下:我忘记为新特性创建新的分支,并且在旧特性分支中完成了所有工作。我把所有的"老"工作都交给了总分行,我希望我的新分行能从"总分行"成长起来。我对我的新工作一点承诺都没有。这是分支结构:"主"->"旧功能"

    1
    2
    3
    4
    git stash
    git checkout master
    git checkout -b"New_branch"
    git stash apply