使用git
深度修改提交历史通常使用rebase
命令完成。Git提供了强大的工具来随心所欲地操作git历史,但您的问题过于宽泛,无法提供有用的答案:
是否可以重写整个提交历史?
是的,您可以。
但是您到底想做什么?人们需要一个例子和一个您需要帮助解决的具体问题。
一个示例选项,它创建了一个历史记录,每个文件都会在提交时添加:
我假设您当前的 HEAD 在 master
上,并且代码的最终期望状态已经达到。
git rev-list --max-parents=0 HEAD | tail -1 # gets commits with no parents
应该返回第一个提交的SHA。 checkout
该SHA。
git checkout $(git rev-list --max-parents=0 HEAD | tail -1)
git checkout -b rewritten-history
现在,针对你最终所需的代码状态中的每个文件:
git checkout master -- <<filepath>> # gets file and adds to git index
git commit -m "Added <<filepath>>"
完成后,master
和 rewritten-history
应该是相同的:
git diff rewritten-history master # should return no differences
现在你可以将master
移动到新历史记录的顶部:
git checkout master
git reset --hard rewritten-history
git branch -d rewritten-history # optional, since you don't need this anymore
如果你认为这需要很多工作,那么你可能是正确的。就像不断迭代地重构以保持代码质量一致一样,保持 Git 历史记录的清洁要比事后修复历史记录容易得多。