博客> 关于GIT的一些问题
关于GIT的一些问题
2019-05-22 13:53 评论:0 阅读:843 connorj
git

今天有个朋友提出了一个问题: 如何删除之前的commit.

因为我之前有事没能及时回复他. 之后他说问题解决了.

解决办法是: 覆盖分支.

我想说的是, git是不可以删除历史commit的.

他说的那个方法, 可以这样解释, 假如他有一个叫做 "X" 的分支, 然后他把这个分支删掉了, 又重新创建了一个叫做 "Y" 的分支, 这时候他一看, 确实没有commit了.

但是, 之前的X上的节点并没有删除. 这个分支和commit可以用C的指针和地址来解释, 分支=指针, commit=地址. 你删除了这个分支只不过是把指针删掉罢了, 但是地址并没有删除掉. 当然如果删除分支是需要权限的...

不过我真的想把以前的commit删除掉,那要该这么做呢.

首先 假如我有一个库, 有一个master的分支, 然后又4个commit节点.

然后, pull到本地, 在本地把.git文件夹删掉, 也就是把本地库删掉. 这个时候push的话git是不允许的. 因为push 就是本地的分支和服务器的分支合并的一个过程, 因为本地的库已经被删除了, 他已经不是一个库了, 只能重新init, 重新remote地址,这个时候只有你重新pull, 才能push到以前的库了. 但是pull回来了不白删了么.

所以, 这个时候就要用到我们的强推了. git push -f . 强推是指不需要pull而强行push的. 就是说, 不管你原来有什么, 我就要把我现在的覆盖过去. 这样我们就强行的开启了另一个起点, 而原有的库里面commit并没有消失, 只是看不见了而已. 执行 git fsck -full 这行命令是查找为引用的对象, 就会发现我们删除过的commit.

这个时候我们就要进行下一步了. 就需要远程服务器来清理一下垃圾, 这样那些commit就跟着被清理走了.

当然了, 上诉说的办法是假设库里面只有一个分支, 因为如果有第二个分支, 那么那些删除掉的commit就不是未引用对象, 也就不会被删除.

如果在清理之前, 有其他程序猿push了的时候, 那些commit就又回来了, 而之前做的那些, 只是变成了另一个起点. 就算是清理掉了, 其他程序猿想跟你撕逼的时候, 你也可以让他们强推一下. 这样你的也会被覆盖啦.

话又说回来, 我们正常人是没有服务器权限的. 也就无法操作清理的步骤.

我做了个实验, 用两个文件夹来模拟服务器和本地的库, 证明是可以的.

所以记住啦, 我们普通的程序猿是没有办法删除远程库的commit的哒, 看不见只不过是骗自己而已啦.

以上都是个人想法, 还请大神指教.

收藏
1
sina weixin mail 回到顶部