Git filter-branch给了我两组提交

时间:2014-05-23 02:53:04

标签: git

我需要从提交历史记录中删除文件。我跟着Github's instructions for removing sensitive data

$ git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch <myfile>' \
--prune-empty --tag-name-filter cat -- --all

...但我一定做错了,因为现在我有一堆重复的提交。一组提交仍然有我的文件;另一个没有。除此之外,他们是完全相同的。如何删除仍包含文件的所有提交?

2 个答案:

答案 0 :(得分:5)

据推测,您应用了filter-branch,然后从遥控器中拔出。当您git filter-branch时,您确实复制了您的历史记录。除了应用的更改(在您的情况下是已删除的文件)之外,您创建一组与旧的提交相同的新提交。所有(或大多数)提交ID都会发生变化。你的改变只发生在当地。遥控器仍然有原始提交。现在你可能试图推动你的提交,但它说了一些关于“超级头”或你的历史“分歧”。通常要做的就是拉。通过这样做,您获取了原始提交并将它们合并到您重写的历史记录中。不应该拉你应该强行推动破坏性地覆盖你的遥控器的历史,git在没有-f的情况下拒绝这样做是有充分理由的。

答案 1 :(得分:5)

根据问题,现有答案及其评论的信息,原来的海报似乎在执行git filter-branch后犯了一些错误,并且没有制作回购的备份克隆。 / p>

所以这里有关于将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

以上每个引用都包含旧提交的提交sha ID:

cat .git/refs/original/refs/heads/master
276fc24dc4b12edf75aea40f4fd50e25a5840005

cat .git/refs/original/refs/tags/v1.0
475593a612141506f59a141e38b8c6a3a2917f85

使用硬重置恢复

要取回原来的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