返回介绍

Discard History 丢弃

发布于 2024-06-16 10:29:35 字数 1274 浏览 0 评论 0 收藏 0

交互式变基操作当然能够完成这样的任务,但是如果历史版本库有成百上千个,将这些操作的 pick 都改成 fixup 是很费事的。git 有更简单的方式完成该操作。

如果想要把 A 之前的历史提交全部清除。

基于 A 对应的提交构建一个跟提交,然后在将 master 分支在里程碑 A 之后的提交变基的新的根提交上,实现对历史提交的清除。

A 对应的提交的构造出一个根提交至少有两种方法,

方法一: git commit-tree

查看里程碑 A 指向的目录树 用 A^{tree} 语法访问里程碑 A 对应的目录树。

$ git cat-file -p A^{tree}

使用 git commit-tree 可以直接从该目录树创建提交

$ echo "Commit from tree of tag A." | git commit-tree A^{tree}

该指令输出一个提交的 SHA1 哈希值。

查看该提交,会发现这个提交没有历史提交。

$ git log --pretty=raw 提交 ID

方法二:git hash-object

查看里程碑 A 指向的提交。用 A^0 语法访问里程碑 A 对应的提交

$ git cat-file commit A^0

将上面的输出(里程碑 A 指向的提交)过路掉以 parent 开头的行,并将结果保存到一个文件中。

$ git cat-file commit A^0 | sed -e '/^parent/ d' > tmpfile

执行 git hash-object 命令,将文件 tmp 作为一个 commit commit 对象写入对象库。

$ git hash-object -t commit -b -- tmpfile

上面的结果就是 至此那个提交的对象 ID. 可以查看以验证该提交确实没有父提交。

$ git log --pretty=raw 提交 ID

无论哪种方法创建了新的根提交,都可以使用变基操作,将 master 分支在里程碑 A 之后的提交变基到新的根提交上。

执行变基,将 master 分支里程碑 A 之后的提交全部迁移到新的根提交之上

$ git rebase --onto <根提交 ID> A master

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文