我掩盖了自己的历史,并想对其进行一些更改。问题是,我有两个不相关的更改的承诺,并且该提交被我的本地(未填充)历史记录中的其他一些变化所包围。

我想在将这一提交推出之前将其分开,但是我看到的大多数指南都与分解您的最新提交或不承诺的本地更改有关。这样做是可行的,而不必“重新做”我的承诺,从那时起就可以做到这一点吗?

有帮助吗?

解决方案

有分裂提交的指南 在重新组件中. 。快速摘要是:

  • 执行包括目标提交在内的互动式反弹(例如 git rebase -i <commit-to-split>^ branch)并标记为编辑。

  • 当重生达到该提交时,请使用 git reset HEAD^ 在提交之前重置为,但要保持工作树完整。

  • 逐步添加更改并提交它们,并根据需要进行尽可能多的提交。 add -p 仅添加给定文件中的某些更改很有用。采用 commit -c ORIG_HEAD 如果您想重新使用特定提交的原始提交消息。

  • 如果您想测试自己要做的事情(好主意!)使用 git stash 隐藏您尚未承诺的部分(或 stash --keep-index 在您提交之前),测试,然后 git stash pop 将其余的人归还工作树。继续进行提交,直到您进行所有修改,即有一个干净的工作树。

  • git rebase --continue 在现在的提交后继续应用委员会。

其他提示

这是如何处理的方法 玛格特.

说提交ED417AE是您想更改的委员会;它包含两个无关的变化,并埋葬在一个或多个提交下。打 ll 显示日志并导航到ED417AE:

initial log

然后击中 r 打开弹出式弹出窗口

rebase popup

m 修改在点上的提交。

注意如何 @ 现在有您要分裂的提交 - 这意味着Head现在在该提交中:

modifying a commit

我们想向父母移动,因此请导航到父母(47e18b3)并点击 x (magit-reset-quickly, , 势必 o 如果您正在使用 evil-magit)输入说“是的,我的意思是要在点”。您的日志现在应该看起来像:

log after resetting

现在,点击 q 要转到常规的玛格特状态,然后使用常规的脱落 u 命令拆除第一个提交中没有发生的事情,提交 c 其余的照常 stage和 cOMMIT第二次提交中发生的事情,完成后:命中 r 打开弹出式弹出窗口

rebase popup

还有另一个 r 继续,你就完成了! ll 现在显示:

all done log

拆分提交 <commit> 并添加 在此之前的新提交, ,并保存作者日期 <commit>, , - 这些步骤如下:

  1. 编辑提交 <commit>

    git rebase -i <commit>^^
    

    NB:也许还需要编辑 <commit> 也是。

  2. 樱桃挑选 <commit> 进入索引

    git cherry-pick -n <commit>
    
  3. 从索引中交互重置不需要的更改并重置工作树

    git reset -p && git checkout-index -f -a
    

    作为替代方案,只需交互式藏匿不需要的变化: git stash push -p -m "tmp other changes"

  4. 进行其他更改(如果有)并创建新提交

    git commit -m "upd something" .
    

    可选,重复项目2-4以添加更多中间提交。

  5. 继续重新打击

    git rebase --continue
    

如果您还没有推动,请使用 git rebase. 。更好,使用 git rebase -i 移动交互作用。您可以将有问题的提交移至前面,然后根据需要将其拆分并向后移动(如果需要)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top