Move existing, uncommitted work to a new branch in Git
我开始了一些关于新特性的工作,在编码了一会儿之后,我决定这个特性应该在它自己的分支上。
如何将现有未提交的更改移动到新分支并重置当前分支?
我想重置当前分支,同时保留对新功能的现有工作。
使用以下内容:
1
| git checkout -b <new-branch> |
这将使当前分支保持原样,创建并签出新分支并保留所有更改。然后,您可以使用以下命令进行提交:
并承诺您的新分支机构:
1
| git commit -m"<Brief description of this commit>" |
工作目录中的更改和索引中分段的更改还不属于任何分支。这将改变这些改变的最终结果。
你不会重置你原来的分支,它会保持原样。对的最后一次承诺仍然是相同的。因此,你必须承诺。
- 只是为了确保,我需要在重置原始分支之前提交未完成的特性?或者,这些未提交的文件将被保留,而不管是否提交?
- 仅供参考:工作目录中的更改和索引中的阶段性更改不属于分支。git checkout -b 的变化将以这些变化结束。
- 如果您已经有一个分支,并且希望将更改移动到现有分支,请签出stackoverflow.com/questions/556923/&hellip;
- 如果要将新分支推送到远程存储库:stackoverflow.com/questions/2765421/&hellip;
- 我不知道这个基本事实……工作目录中的更改和索引中分段的更改还不属于任何分支"。我正要手动完成这项任务。这个答案很方便!
- @天哪,似乎是这样。我刚刚做了git checkout -b ,然后没有承诺,切换回主分支和git checkout -- ,它吹走了两个分支的变化。(没什么大不了的,变化不多,但吸取了教训。
- 值得注意的是,已添加但未在旧分支上提交的更改将无痛地移动到新分支。
- "这改变了那些改变的结局。"不明白这一点。有人能解释一下吗?
- @nickvolynkin:签出更改/切换将提交编辑的分支。
- @ KNITTL:哦。谢谢,现在我看到了。)这将更改这些更改将结束的分支"。
- 如果我尝试切换分支时得到这个error: Your local changes to the following files would be overwritten by checkout:会怎么样?
- @MAAHD:这意味着在分支之间更改了文件。Git无法自动合并这些更改,因此您必须提交、隐藏或删除它们。
- @Daneo'Connor,是的,似乎您必须在重置原始分支之前提交未完成的功能,否则在执行git checkout -- .或git checkout .时,未提交的更改将在两个分支中被清除。我很惊讶没有人对此发表评论。
- @jdsmith:取消提交更改不属于任何分支。它们只存在于工作目录中,git checkout ./git reset --hard将无法恢复地删除它们。
- 如果我最初不在master上工作,这个答案会起作用吗?也就是说,我在一个功能分支上,意识到这是错误的,想把我的工作转移到另一个功能分支上?
- @Maahd:然后您可以简单地签出另一个分支(不带-b标志)。如果问题文件没有在分支之间更改,那么它将正常工作。但是,如果编辑了它们,git checkout将中止,并且您必须存储/签出/取消存储。
- 我有一个很快的问题,当我创建一个新的分支时,是否所有未打包的内容都会像您所说的那样,以及要提交的更改,或者我应该先将它们打包?我有要添加的文件,但我不确定是否应该先取消它们的存储,然后更改分支,然后再进行所有操作。
- @fallenreaper:所有分段/未分段/未跟踪的文件都将保持其状态。
可选地:
将当前更改保存到临时存储:
$ git stash
基于此存储创建新分支,然后切换到新分支:
$ git stash branch stash@{0}
提示:使用tab键减少输入存储名称。
- 如果另一个分支已经存在,您只需使用checkout切换到它,然后使用git stash apply。
- 史塔什根本不安全。
- @你能解释一下为什么吗?
- @Wickywills的库存是本地回购,因此,如果您的本地回购发生了什么事,您的库存就会随之丢失。
- stash仅用于创建分支,然后可以将分支推送到远程存储库中。
- 我相信你不必这么做。被接受的答案可以更好地解释这种情况。
- 我不明白提示"提示:使用tab键减少输入隐藏名称。"。"stash@0"不是名字吗?我不能成功地运行它。
- 为什么这比公认的答案stackoverflow.com/a/1394804/754997更好?
- 你是谁?t=548
- 我不明白为什么这比git checkout -b 的公认答案更好。
- @noitidart如果您想使用一个现有的分支(您可以切换到它并使用EDOCX1[1]),这会更好。
- 别忘了在你离开之前先离开1〔2〕。
- 在藏匿之前,你不需要先把东西拿出来。
- "结帐-B"是好的,但我认为你应该记住,当分行存在时,你应该为这些案件申请"藏匿申请"…就像@archonic说的。
- @{0}是什么意思?
如果您在编写代码时对主分支进行了提交,但现在希望将这些提交移动到其他分支:
将当前历史记录复制到新的分支上,同时带来任何未提交的更改:
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之外的某个位置,那么该配置将丢失。
另一种方法是使用这种重置技术。但这些指令将丢弃您所拥有的任何未提交的更改。如果你想保留这些,先把它们藏起来,最后再把它们拆开。
- 这回答了一个问题,这个问题与OP提出的问题略有不同。我决定把这个答案放在这里,因为这是谷歌在我寻找答案时带给我的地方。处理这种情况的实际问题在这里。
如果你提交它,你也可以选择单一的提交ID。当我在master中开始工作时,我经常这样做,然后在我向上推到我的源/之前创建一个本地分支。
1
| git cherry-pick <commitID> |
如本文所述,您可以使用cherry pick做很多事情,但这可能是您的一个用例。
- 将部分更改移动到新分支的更好解决方案…因为你现在可以提交你想要的,隐藏所有其他更改,检查你想要分支的分支,cherry-pick那个提交到新的分支,回到原来的分支,硬重置一个提交,然后做一个stash-pop,添加,提交,并唱哈利路亚。
- @梅雷迪思,哈哈,你就是这样。这很好,除非你提前计划好你的改变……谁来做这件事;)
常见的场景如下:我忘记为新特性创建新的分支,并且在旧特性分支中完成了所有工作。我把所有的"老"工作都交给了总分行,我希望我的新分行能从"总分行"成长起来。我对我的新工作一点承诺都没有。这是分支结构:"主"->"旧功能"
1 2 3 4
| git stash
git checkout master
git checkout -b"New_branch"
git stash apply |