我需要从我的提交历史中删除一个文件.我按照Github的说明删除了敏感数据:
$ git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch <myfile>' \
--prune-empty --tag-name-filter cat -- --all
Run Code Online (Sandbox Code Playgroud)
...但我一定做错了,因为现在我有一堆重复的提交.一组提交仍然有我的文件; 另一个没有.除此之外,它们是完全相同的.如何删除仍包含我的文件的所有提交?
大概你应用了filter-branch然后从遥控器中拉出来.当你git filter-branch,你确实复制了你的历史.除了应用的更改(在您的情况下是已删除的文件)之外,您创建一组与旧的提交相同的新提交.所有(或大多数)提交ID都会发生变化.你的改变只发生在当地.遥控器仍然有原始提交.现在你可能试图推动你的提交,但它说了一些关于"超级头"或你的历史"分歧".通常要做的就是拉.通过这样做,您获取了原始提交并将它们合并到您重写的历史记录中.而不是拉你应该做一个强制推动破坏性地覆盖你的遥控器的历史,git拒绝做没有-f的东西是有充分理由的.
小智 6
鉴于来自问题的信息,现有的答案以及他们的评论,看起来原始海报在做完之后犯了一些错误git filter-branch,并没有制作回购的备份克隆.
所以这里有一些指令,用于将repo返回到filter-branch之前的状态,如果这是原始海报想要做的事情.
git filter-branch将自动保存对旧提交的引用,以防您因任何原因需要恢复它们.你会在你的repo .git/refs/original/refs/目录下找到它们:
ls -l .git/refs/original/refs/heads/
total 1
-rw-r--r-- 1 Keoki Administ 41 May 23 01:13 master
ls -l .git/refs/original/refs/tags/
total 1
-rw-r--r-- 1 Keoki Administ 41 May 23 01:13 v1.0
Run Code Online (Sandbox Code Playgroud)
上述每个引用都包含旧提交的提交sha ID:
cat .git/refs/original/refs/heads/master
276fc24dc4b12edf75aea40f4fd50e25a5840005
cat .git/refs/original/refs/tags/v1.0
475593a612141506f59a141e38b8c6a3a2917f85
Run Code Online (Sandbox Code Playgroud)
要恢复原始master分支(从进行过滤器分支之前),只需使用上面的引用进行硬重置,或使用其中包含的commit sha ID:
git checkout master
# Use reference
git reset --hard refs/original/refs/heads/master
# Or use sha ID
git reset --hard 276fc24dc4b12edf75aea40f4fd50e25a5840005
Run Code Online (Sandbox Code Playgroud)