git 怎么删除 指定 commit 快照 ?

2019-01-27 21:27:05 +08:00
 frylkrttj

git reset --hard <commit_id>

我运行该命令为什么不是删除这个快照而是调到这个快照了。前几个小时实验的,应该不会记错。

7132 次点击
所在节点    git
45 条回复
frylkrttj
2019-01-29 09:50:42 +08:00
@limuyan44
A,B,C 三个 commit 其中 A 是几乎空白的提交,而 B 是不小心用了 "git add ." 把密码本提交到了 B,于是我删除了密码本文件又提交了一个 C 快照。

现在看你表演了。
lfzyx
2019-01-29 10:09:08 +08:00
julyclyde
2019-01-29 10:40:39 +08:00
单个 commit 如果没有后继的话,可以删除:没有其它东西指向它,然后 fsck 掉
如果有后继,那就只能连它带后继一起重做一遍
fan123199
2019-01-29 11:05:24 +08:00
@frylkrttj 并没有一个删除 commit 的命令(除了最近一个)。因为删除单个 commit 可能会对后续 commit 有影响,必须要 rebase 一条龙解决。

假设有三个 commit,A->B->C,改动分别是往文件中写入 a,b,c 字符。假设按你的理解要删去 B,也就是删去加入 b 这个字符。 那么这时 C 其实无法存在的,因为你删去了 B,也就是没有 b,而 C 是在 ab 上加入 c,没法简单变成 A->C。 所以 rebase -i <commit>的内核是, 让你重写所有那个 commit 之后的所有记录。如果按 hash 值来看,rebase 后的 C 并不是 C,而是 C'。你删去 B 后的历史应该是 A->C'。因为这是危险动作,需要一堆备注让你看清楚。
fan123199
2019-01-29 11:06:26 +08:00
@frylkrttj 所以,还是 revert 最靠谱,最推荐。只是不适合强迫症。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/531078

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX