How can I split up a Git commit buried in history?
我把我的历史弄得一塌糊涂,想对它做些改变。问题是,我有一个带有两个不相关更改的提交,这个提交被我的本地(非推送)历史中的一些其他更改包围。
我想在推出这个提交之前将其拆分,但我看到的大多数指南都与拆分您最近的提交或未提交的本地更改有关。这样做是可行的,一个埋在历史深处的承诺,而不必"重做"我的承诺,从那时起?
在REBASE手册页中有一个拆分提交的指南。简要总结如下:
执行一个包括目标提交(如
git rebase -i 的交互钢筋网)并将其标记为要编辑。^ branch 当Rebase达到该提交时,使用
git reset HEAD^ 在提交之前重置为,但保持工作树不变。以增量方式添加更改并提交它们,根据需要进行尽可能多的提交。
add -p 对于只添加给定文件中的某些更改很有用。如果要为某个提交重新使用原始提交消息,请使用commit -c ORIG_HEAD 。如果你想测试你的承诺(好主意!)用
git stash 隐藏你没有承诺的部分(或在你承诺之前用stash --keep-index 隐藏),测试,然后用git stash pop 将其余部分返回到工作树。在提交所有修改之前一直进行提交,即拥有一个干净的工作树。运行
git rebase --continue 在现在的拆分提交之后继续应用提交。
下面介绍如何使用Magit。
假设commit ed417ae是您想要更改的;它包含两个不相关的更改,并隐藏在一个或多个提交下。点击
。
然后点击
氧化镁
和
请注意,您现在想要分割的承诺中有哪些
氧化镁
我们想将头移到父级,所以导航到父级(47e18b3)并点击
氧化镁
现在,击
氧化镁
另一个江户十一〔十七〕继续,你就完了!
。
要拆分一个提交
编辑
1 | git rebase -i <commit>^^ |
注:也许还需要编辑
樱桃精选
1 | git cherry-pick -n <commit> |
号
以交互方式重置索引中不需要的更改并重置工作树
1 | git reset -p && git checkout-index -f -a |
作为替代方案,只需交互地存储不需要的更改:
进行其他更改(如果有)并创建新的提交
1 | git commit -m"upd something" . |
。
或者,重复项目2-4以添加更多中间提交。
继续重新平衡
1 | git rebase --continue |
如果你还没有推,只需使用