Ben*_*Ben 289 git split commit revision-history
我记录了我的历史,并希望对它做一些改变.问题是,我提交了两个不相关的更改,并且此提交被我的本地(非推送)历史记录中的一些其他更改所包围.
我想在推送之前拆分此提交,但我看到的大多数指南都与拆分最近的提交或未提交的本地更改有关.是否可以对历史记录中的提交执行此操作,而不必从那时起"重新执行"我的提交?
Cas*_*bel 444
在rebase手册页中有一个拆分提交的指南.快速摘要是:
执行包括目标提交(例如git rebase -i <commit-to-split>^ branch)的交互式rebase,并将其标记为要编辑.
当rebase到达该提交时,使用git reset HEAD^在提交之前重置为,但保持工作树完好无损.
逐步添加更改并提交它们,根据需要进行尽可能多的提交.add -p可以用于仅添加给定文件中的一些更改.使用commit -c ORIG_HEAD,如果你想重新使用原来的提交信息有一定承诺.
如果你想测试你提交的内容(好主意!)git stash用来隐藏你没有提交的部分(或者stash --keep-index在你提交它之前),测试,然后git stash pop将其余部分返回到工作树.继续提交,直到你完成所有修改,即有一个干净的工作树.
运行git rebase --continue以在现在拆分提交后继续应用提交.
假设 commit ed417ae 是您要更改的那个;它包含两个不相关的更改,并隐藏在一个或多个提交之下。点击ll以显示日志,然后导航到 ed417ae:
然后点击r打开rebase弹出窗口
并m在此时修改提交。
请注意@现在您要拆分的提交是如何存在的 - 这意味着 HEAD 现在处于该提交:
我们想将 HEAD 移动到父级,因此导航到父级 (47e18b3) 并点击x( magit-reset-quickly,o如果您正在使用,则绑定到evil-magit) 并输入说“是的,我的意思是在点提交”。您的日志现在应如下所示:
现在,点击q进入常规 Magit 状态,然后使用常规 unstageu命令取消暂存第一次提交中没有发生的内容,c照常提交其余部分,然后标记s并c忽略第二次提交中发生的内容,以及完成后:点击r打开 rebase 弹出窗口
另一个r继续,你就完成了!ll现在显示: