Miałeś kiedyś problem, aby usunąć przedostatni commit? Dziś o tym, jak usunąć dowolną rewizję z Git-a na 2 sposoby.
Krok po kroku 👣
Na początku przedstawiam historię repozytorium:
git log --oneline
09ee68e Rewizja 4 (HEAD)
60c495b Rewizja 3
6e45e15 Rewizja 2
749fcaa Rewizja 1
Do czego dążymy?
Zdefiniujmy cel zadania, aby wszystko było jasne:
Cel
Usunięcie commita o
id=60c495b, który ma commit message “Rewizja 3”.
Realizacja
Skorzystajmy z polecenia git rebase, które jest w stanie zarządzić historią.
1. Cofamy się o dwa commity, czyli do “Rewizja 1”
git rebase -i 749fcaa
Po tej linijce powinien uruchomić się domyślny edytor. Na liście zobaczysz tylko rewizje nowsze od wskazanej, czyli od “Rewizja 2” w górę. Sama “Rewizja 1” jest punktem odniesienia, więc się na niej nie pojawi.
Wskazówka
Jak zmienić domyślny edytor? Nadpisz zmienną środowiskową
$EDITORza pomocą polecenie:export EDITOR="nano". Git najpierw sprawdza jednak zmiennąGIT_EDITORi ustawieniecore.editor, więc pewniej jest wydać poleceniegit config --global core.editor nano.
2. (dla starych wersji Gita) Usuwamy linijkę z commitem
pick 6e45e15 - Rewizja 2
pick 09ee68e - Rewizja 4
2. (dla nowych wersji Gita) Ustawiamy stan commita na drop
pick 6e45e15 - Rewizja 2
drop 60c495b - Rewizja 3
pick 09ee68e - Rewizja 4
3. Zapisujemy plik oraz wychodzimy z edytora
Naszym oczom powinien ukazać się komunikat w stylu:
Successfully rebased and updated refs/heads/master.
Efekt końcowy jest następujący:
- Nie ma rewizji w historii,
- Nie ma zmian wprowadzanych przez usuniętą rewizję.
Uwaga
git rebaseprzepisuje historię: wszystkie rewizje po usuniętej dostają nowe identyfikatory. Jeśli wcześniej wypchnąłeś je na serwer, a korzystają z nich inne osoby, lepiej użyćgit revert 60c495b, które dopisuje nową rewizję cofającą zmiany i nie rusza historii.
Dla przypomnienia
W edytorze Vim plik zapisujemy za pomocą polecenie
:w(write), natomiast opuszczamy edytor za pomocą:q(quit).
Powyższe polecenia można uruchomić za pomocą jednego::wq.
⭐️ Ćwiczenie dodatkowe
Spróbuj zmienić kolejność rewizji, tak aby git log --oneline pokazywał inną
niż pierwotnie historię rewizji.
Wskazówka
Gdy będzie otwarty edytor, zmień kolejność linijek z rewizjami.
Cya! 👋