2012-12-11 19 views
5

Mam git commit historię tak:Usuwanie przypisań popełnić z repozytorium git

  U 
     /
A---B---C---D---E master 

Nic nie wskazuje na commit U, ale znam jego hash. Jak mogę całkowicie usunąć to zatwierdzenie z mojego repozytorium, jakby nigdy nie istniało? Jestem jedyną osobą używającą tego repo.

Próbowałem użyć git rebase, ale to może usunąć części gałęzi lub przenieść zatwierdzenia, ale nie wydaje się być w stanie usunąć jednego zatwierdzenia.

Jeśli wykonam git checkout <hash>, a następnie git reset --hard HEAD~1, nie widzę już zatwierdzenia. Czy faktycznie zniknął całkowicie, czy jest nadal ukryty w repozytorium?

Odpowiedz

2

W końcu zostanie oczyszczony przez git, ale możesz sprawdzić, czy w rzeczywistości wymuszasz zbieranie śmieci.

Polecenie clean jest inne i nie będzie o to dbać.

+0

Co, jeśli sklonowałem całą transakcję repo? Czy można też sklonować niepotrzebne obiekty śmieci? – Jawap

+0

@Jawap: nie, nie zostaną sklonowane – Chronial

4

Jak opisano here, wystarczy użyć

git reflog expire --expire-unreachable=now --all 
git gc --prune=now 

git reflog expire --expire-unreachable=now --all usuwa wszelkie referencje nieosiągalny zobowiązuje się reflog.

git gc --prune=now usuwa same zatwierdzenia.

Uwaga: Używanie tylko git gc --prune=now nie będzie działać, ponieważ te zatwierdzenia są nadal przywoływane w reflog. W związku z tym czyszczenie reflog jest obowiązkowe.