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


Answers:


3639

使用以下内容:

git checkout -b <new-branch>

这将使您当前的分支保持不变,创建并签出新分支,并保留所有更改。然后,您可以在文件中进行更改以提交:

git add <files>

并使用以下命令提交到您的新分支

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

工作目录中的更改和索引中暂存的更改尚不属于任何分支。这将更改这些修改的终止分支。

您无需重置原始分支,它会保持原样。最后一次提交<old-branch>将保持不变。因此,您checkout -b然后提交。


更新2020 / Git 2.23

Git 2.23添加了新的switch子命令,以消除由于过载checkout(切换分支,还原文件,分离HEAD等)而引起的一些混乱。

从此版本的Git开始,将上述命令替换为:

git switch -c <new-branch>

行为是相同的,并且保持不变。


15
为了确保在重置原始分支之前,我需要提交未完成的功能?还是将那些未提交的文件保留下来而不考虑提交?
Dane O'Connor 2009年

192
仅供参考:工作目录中的更改和索引中暂存的更改不属于分支。git checkout -b <new branch>其中变化这些变化将结束英寸
的JakubNarębski

152
如果你已经有了一个分支,并希望您的更改移动到现有的分支,结账stackoverflow.com/questions/556923/...
Chirantan

14
如果你想你的新分支推送到远程仓库:stackoverflow.com/questions/2765421/...
Dewayne

10
@JDSmith:取消提交的更改属于任何分支。它们仅驻留在工作目录中git checkout ./ git reset --hard将无法恢复地删除
knittl

329

或者:

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

    $ git stash

  2. 基于此存储区创建一个新分支,然后切换到新分支:

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

提示:使用Tab键可以减少键入存储名称的麻烦。


51
如果另一个分支已经存在,则可以通过checkout切换到该分支git stash apply
Archonic

6
我不明白“提示:使用Tab键减少键入存储名称的提示”。名称不是“ stash @ {0}”吗?我无法成功运行它。
赫伯特

7
为什么这比公认的答案stackoverflow.com/a/1394804/754997更好?
克里斯·佩奇

10
我不明白为什么这样做会更好,然后呢?git checkout -b <new branch name>
Noitidart

6
git add -A藏起来之前不需要。
vichle

48

如果您在编码时一直在主分支上进行提交,但是现在您想将这些提交移动到另一个分支,这是一种快速的方法:

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

    git checkout -b <new-feature-branch>
    
  2. 现在,强制原始的“ messy”分支回滚:(无需切换到该分支)

    git branch -f <previous-branch> <earlier-commit-id>
    

    例如:

    git branch -f master origin/master
    

    或者,如果您进行了4次提交:

    git branch -f master HEAD~4
    

警告: git branch -f master origin/master重置该分支的跟踪信息。因此,如果您已将master分支配置为推送到其他位置,origin/master则该配置将丢失。

警告:如果在分支后重新设置基准,也存在危险,如此处所述。避免这种情况的唯一方法是使用Cherry-Pick创建新的历史记录。该链接描述了最安全的防呆方法。如果您有未提交的更改,则可能需要git stash在开始和git stash pop结束时进行。


6
这回答的问题与操作员提出的问题略有不同。我决定将这个答案放在这里,因为这是Google在寻找答案时带给我的地方。处理这种情况的实际问题在这里
joeytwiddle

26

常见的情况如下:我忘记为新功能创建新分支,并且在旧功能分支中进行了所有工作。我已经将所有“旧”工作都提交给master分支,并且我希望我的新分支能够从“ master”中成长。我还没有提交新工作。这是分支结构:“ master”->“ Old_feature”

git stash 
git checkout master
git checkout -b "New_branch"
git stash apply

18

如果提交,则还可以选择单个提交ID。当我开始在master上工作时,我经常这样做,然后想在我的原点/之前创建一个本地分支。

git cherry-pick <commitID>

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


2
更好的解决方案,用于将部分更改移至新分支...因为您现在可以提交所需的内容,存储所有其他更改,签出要从中进行分支的分支,以樱桃方式选择提交到新分支的内容,然后返回回到原始分支,硬重置一个提交,然后执行隐藏弹出,添加,提交和演唱hallelujah。
Meredith

1
@Meredith,哈哈,是这样的。太好了,除非您预先计划更改...以及由谁进行;)
密码

1

这可能对所有使用GIT的工具都有帮助

命令

切换分支-它将您的更改移至新分支。然后,您可以提交更改。

 $ git checkout -b <new-branch>

乌龟

右键单击您的存储库,然后使用TortoiseGit-> Switch / Checkout

在此处输入图片说明 在此处输入图片说明

源树

使用“签出”按钮切换分支。单击分支后,您将在顶部看到“签出”按钮。当前分支中的更改将自动应用。然后,您可以提交它们。

在此处输入图片说明


0

我用@Robin回答并列出了我所做的所有事情,

git status                               <-- review/list uncommitted changes
git stash                                <-- stash uncommitted changes
git stash branch <new-branch> stash@{1}  <-- create a branch from stash
git add .                                <-- add local changes
git status                               <-- review the status; ready to commit
git commit -m "local changes ..."        <-- commit the changes
git branch --list                        <-- see list of branches incl the one created above
git status                               <-- nothing to commit, working tree (new-branch) is clean
git checkout <old-branch>                <-- switch back

如果存储库有多个存储库,请查看将哪个存储库应用于新分支:

git stash list  
  stash@{0}: WIP on ...  
  stash@{1}: WIP on ...

并检查单个藏匿处,

git stash show stash@{1}

或一次检查所有藏匿处:

git stash list -p

0

现在,使用GitHub Desktop确实有一种非常简单的方法,因为我以前不相信这是一个功能。

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

GitHub桌面

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.