Podczas pracy z Git zauważysz, że czasami zatwierdzenia wymagają usunięcia, ponieważ wprowadziły błąd lub wymagają przeróbki.
Jeśli tak jest ostatnie zatwierdzenie to jest bardzo proste. Po prostu uruchom:
git reset HEAD^
Spowoduje to usunięcie ostatniego zatwierdzenia, ale pozostawi wszystkie zmiany w plikach nienaruszone.
Jeśli chcesz usunąć więcej niż tylko ostatnie zatwierdzenie, możesz użyć dwóch metod. Pierwszym jest użycie rebase, które pozwoli ci usunąć jedno lub więcej kolejnych zatwierdzeń, a drugim jest cherry-pick, który pozwala na usunięcie nie kolejnych zatwierdzeń.
Przykład git log
Numer | Hash | Komunikat zatwierdzenia | Autor |
---|---|---|---|
1 | 2c6a45b | (HEAD) Dodawanie metody publicznej aby uzyskać dostęp do metody chronionej | Tom |
2 | ae45fab | Aktualizacje interfejsu bazy danych | Wykonawca 1 |
3 | 77b9b82 | Poprawa interfejsu bazy danych | Wykonawca 2 |
4 | 3c9093c | Scalono gałąź deweloperską w master | Tom |
5 | b3d92c5 | Dodawanie nowego modułu Event CMS | Paweł |
6 | 7feddbb | Dodawanie klasy i plików CMS | Tom |
7 | a809379 | Dodawanie projektu do Git | Tom |
Korzystanie z Rebase
Korzystając z powyższego dziennika git, chcemy usunąć następujące zatwierdzenia; 2 & 3 (ae45fab & 77b9b82). Ponieważ są to kolejne zatwierdzenia, możemy użyć rebase.
git rebase --onto <branch name>~<first commit number to remove> <branch name>~<first commit to be kept> <branch name>
np. Do usunięcia zatwierdzeń 2 & 3 powyżej
git rebase --onto repair~3 repair~1 repair
Korzystanie z Cherry Pick
Krok 1: Znajdź zatwierdzenie przed zatwierdzeniem chcesz usunąć git log
Krok 2: Sprawdź, czy zatwierdzenie git checkout <commit hash>
Krok 3 : Stwórz nową gałąź, używając aktualnego zatwierdzenia płatności git checkout -b <new branch>
Krok 4: Teraz musisz dodać zatwierdzenie po usuniętym zatwierdzeniu git cherry-pick <commit hash>
Krok 5: Teraz powtórz krok 4 dla wszystkich innych zatwierdzeń, które chcesz zachować.
Krok 6: Po dodaniu wszystkich zatwierdzeń do nowej gałęzi i został zaangażowany. Sprawdź, czy wszystko jest w odpowiednim stanie i działa zgodnie z przeznaczeniem. Dokładnie sprawdź, czy wszystko zostało zatwierdzone: git status
Krok 7: Przełącz się na uszkodzony oddział git checkout <broken branch>
Krok 8: Teraz wykonaj twardy reset uszkodzonej gałęzi do zatwierdzenia przed tą, którą chcesz usunąć git reset --hard <commit hash>
Krok 9: Scal swoje naprawiona gałąź do tej gałęzi git merge <branch name>
Krok 10: Przenieś scalone zmiany z powrotem do początku. OSTRZEŻENIE: Spowoduje to nadpisanie zdalnego repozytorium! git push --force origin <branch name>
Możesz wykonać ten proces bez tworzenia nowej gałęzi, zastępując krok 2 & 3 krokiem 8, a następnie nie wykonywać kroku 7 & 9.
Przykład
Powiedzmy, że chcemy usunąć zmiany 2 & 4 z repozytorium.
-
git checkout b3d92c5
Sprawdź ostatnie dostępne zatwierdzenie. -
git checkout -b repair
Utwórz nową gałąź do pracy. -
git cherry-pick 77b9b82
Wykonaj zatwierdzenie 3. -
git cherry-pick 2c6a45b
Wykonaj zatwierdzenie 1. -
git checkout master
wzorzec realizacji transakcji. -
git reset --hard b3d92c5
Zresetuj wzorzec do ostatniego nadającego się do użycia zatwierdzenia. -
git merge repair
Połącz naszą nową gałąź z wzorcem. -
git push --hard origin master
Push master do zdalnego repozytorium.
Ostatnia uwaga
Git rebase & cherrypick są niebezpieczne, ale potężne rozwiązania, które powinny być używane tylko jako ostatnie opcji i być podejmowane tylko przez kogoś, kto wie, co robią. Uważaj, oba rozwiązania mogą mieć negatywny wpływ na innych użytkowników, którzy pracują w tym samym repozytorium / gałęzi.
Na koniec pamiętaj, aby zachować ostrożność i powodzenia!