将git提交拆分为几个提交

5
我已经修复了一份代码中的两个错误,并且修改了公共文件。例如,错误修复1更改了文件A、B、C,错误修复2更改了文件B、C和D。我将所有更改合并到一个提交中。出于代码审核的目的,我需要将更改拆分为两个提交(实际上是两个分支)。
我的想法是从当前的分支fix创建两个新分支,如git branch fix-1 fix和git branch fix-2 fix。这两个分支都有所有的更改。现在,在fix-1分支中,我希望只保留与修补程序1相关的更改,也就是文件A中的所有更改以及文件B和C中的部分更改。在Git中是否可以做到这一点?哪个命令与此相关?
我知道在git add中,我可以进行交互式添加,其中我可以选择要添加的程卷片段,而不仅仅是文件级别。我是否可以在这里执行类似的操作?

可能是如何使用Git将提交拆分为较小的提交?的重复问题。 - user456814
2个回答

6
如果这是您的最后一次提交,这里提供了一个解决方案。
  1. Checkout the branch with the fix

    git checkout fix
    
  2. Reset back to before the fixes, but keep the changes in your working dir

    git reset HEAD^
    
  3. Create branch for fix-1

    git checkout -b fix-1
    
  4. Add/commit fix-1 fixes

    git add -p
    git commit
    
  5. Stash the remaining changes

    git stash
    
  6. Checkout/create branch for fix-2

    git checkout -b fix-1
    
  7. Pop off your stashed changes

    git stash pop
    
  8. Commit/add them

    git commit -a
    

我认为第二个命令应该是 git reset --mixed HEAD^。这个解决方案对我非常有效。谢谢。 - Yogeshwer Sharma
1
当没有标志时,它将默认为--mixed。 - Andy
我使用它与 git rebase -i HEAD~X 结合起来,前进我想要拆分的提交。其中 X 是要重新排序以推进目标提交的向后提交数量。 - Antonio Sánchez-Padial

3
从你所处的状态(两个分支,每个分支都有所有更改)进入每个分支并执行git rebase -i fix^,然后选择“edit”来编辑fix提交。然后当它暂停让你编辑提交时,使用git reset HEAD^将提交抛弃但保留更改在工作树中。然后使用你通常的git add -p策略将提交拆分成多个git commits,然后git rebase --continue
我认为这在git rebase手册下的SPLITTING COMMITS部分中有说明。

在执行 git add -p 后,我执行了 git commit,但是在执行 git rebase --continue 之后,出现以下结果: /path/to/file1.txt: 需要更新 /path/to/file2.txt: 需要更新 工作树是脏的 并且我停留在 (no branch)。不知道该怎么办。我所做的是 git stash,它丢弃了更改,并回到了原始分支。当我得到 Working tree is dirty 时,有什么想法吗? - Yogeshwer Sharma
哦,没错,既然你不想要所有的更改,你需要使用 git reset --hard 命令来丢弃你提交前的工作副本编辑。这样你就能够只提交你想要的部分了。 - Ben Jackson
谢谢Ben。这个解决方案很好,但是Andy上面的解决方案更简单,我更理解正在发生的事情。每当git开始显示“(no branch)”时,我的理解就会动摇,而这个解决方案涉及进入“(no branch)”模式! :-) 感谢您建议这个解决方案。 - Yogeshwer Sharma
1
我也喜欢@Andy的答案,尽管如果您在需要拆分的提交之后进行了其他更改,您可能需要类似于我的解决方案的解决方案。 - Ben Jackson
同意。我正好在想要分割的提交之后有一些提交。 - Yogeshwer Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接