Jak zgodzić się w git, aby utrzymać swoją historię w czystości
Kiedy pracujesz z git, często jest dobrze popełniać, więc zawsze możesz wrócić do stanu kodu, jeśli zepsujesz się. Jednak popełnienie wszystkich tych miniban do głównej gałęzi nie zawsze jest dobrym pomysłem. To sprawia, że historia jest nieuporządkowana i trudna do naśladowania.
Git zapewnia sposób na zgniatanie wielu zobowiązań za pomocą polecenia rebazy. Po lokalnym wprowadzeniu zmian w konkretnym pliku lub dla konkretnej funkcji, zawsze możesz użyć metody squasha, aby połączyć zmiany razem, zanim zobowiązujesz się do głównej gałęzi. Pomoże to innym lepiej zrozumieć twoje zmiany.
OSTRZEŻENIE: Mimo że możesz pobrać się z zewnętrznych repozytoriów i squasha, to zły pomysł. Może powodować konflikty i zamieszanie. Unikaj zmiany historii, która jest już publiczna. Trzymaj się tylko zatłoczenia, które są lokalne w Twojej pracy.
Przejrzyjmy przykładową sprawę.
Załóżmy, że mamy dwa pliki a.Py i b.py. Najpierw przejdźmy do procesu tworzenia plików i dokonywania modyfikacji:
$ mkdir myProject
$ cd myProject/
$ git init
$ echo "print (" hello a ")"> a.py
$ git add -a && git commit -m "dodał.py "
$ echo "print (" hello b ")"> b.py
$ git add -a && git commit -m "dodał b.py "
$ echo "print (" hello bb ")"> b.py
$ git add -a && git commit -m "b.Modyfikacja PY 1 ”
$ echo "print (" hello bbb ")"> b.py
$ git add -a && git commit -m "b.Modyfikacja PY 2 ”
Jeśli sprawdzimy historię zatwierdzeń, zobaczymy następujące:
$ git log --oneline --graph -decoorate
* dfc0295 (głowa -> master) b.Modyfikacja PY 2
* CE9E582 b.Modyfikacja PY 1
* 7A62538 dodano B.py
* 952244a dodał.py
Po zakończeniu naszej pracy postanawiamy wprowadzić wszystkie zmiany w B.Py w jednym zatwierdzeniu dla jasności. Liczymy, że na B są 3 zatwierdzenia.py z głowy. Wydajemy następujące polecenie:
git rebase -i head ~ 3
Opcja -i mówi Git, aby używał trybu interaktywnego.
Powinien wyskoczyć okno na edytor tekstu Git:
Pick 7a62538 dodał B.py
Pick Ce9E582 b.Modyfikacja PY 1
Wybierz DFC0295 b.Modyfikacja PY 2
# Rebase 952244a… DFC0295 na 952244a (3 polecenia (s))
#
# Polecenia:
# P, Pick = Użyj zatwierdzenia
# r, przerób
# e, edytuj = użyj zatwierdzenia, ale zatrzymaj się do zmiany
# s, squash = użyj zatwierdzenia, ale mało się w poprzedni zatwierdzenie
# f, fixup = Like „Squash”, ale odrzuć komunikat dziennika tego zatwierdzenia
# x, exec = uruchom polecenie (reszta linii) za pomocą powłoki
#
# Te linie można ponownie zamówić; Są one wykonywane od góry do dołu.
#
# Jeśli usuniesz tutaj linię, która zatwierdzenie zostanie utracone.
#
# Jednak jeśli wszystko usuniesz, rebaz zostanie przerwany.
#
# Zauważ, że skomentowane są puste zatrudnienia
~
Zobowiązania są wymienione chronologicznie na górze od najwcześniejszych do najnowszych. Możesz wybrać, które zobowiązują się do „wyboru”, a które zobowiązuje się do squasha. Dla uproszczenia wybierzemy pierwsze zatwierdzenie i zamaskujemy resztę. Dlatego zmodyfikujemy tekst w ten sposób:
Pick 7a62538 dodał B.py
Squash CE9E582 b.Modyfikacja PY 1
Squash DFC0295 b.Modyfikacja PY 2
# Rebase 952244a… DFC0295 na 952244a (3 polecenia (s))
#
# Polecenia:
# P, Pick = Użyj zatwierdzenia
# r, przerób
# e, edytuj = użyj zatwierdzenia, ale zatrzymaj się do zmiany
# s, squash = użyj zatwierdzenia, ale mało się w poprzedni zatwierdzenie
# f, fixup = Like „Squash”, ale odrzuć komunikat dziennika tego zatwierdzenia
# x, exec = uruchom polecenie (reszta linii) za pomocą powłoki
#
# Te linie można ponownie zamówić; Są one wykonywane od góry do dołu.
#
# Jeśli usuniesz tutaj linię, która zatwierdzenie zostanie utracone.
#
# Jednak jeśli wszystko usuniesz, rebaz zostanie przerwany.
#
# Zauważ, że skomentowane są puste zatrudnienia
Jak tylko zapiszesz i zamkniesz plik tekstowy, powinno pojawić się inne okno tekstowe, które wygląda na to:
# To jest kombinacja 3 zatrudnionych.
# Przesłanie pierwszego zatwierdzenia brzmi:
Dodano b.py
# To jest druga wiadomość zatwierdzenia:
B.Modyfikacja PY 1
# To jest trzecia wiadomość zatwierdzenia:
B.Modyfikacja PY 2
# Wprowadź wiadomość o zatwierdzeniu dla swoich zmian. Linie zaczynają
# z „#” zostanie zignorowane, a pusta wiadomość przerywa zatwierdzenie.
#
# Data: pt. 30 marca 21:09:43 2018 -0700
#
# Rebase w toku; na 952244a
# Obecnie edytujesz zatwierdzenie podczas ponownej renowacji oddziału „Master” na „952244a”.
#
# Zmiany do popełnienia:
# Nowy plik: B.py
#
Zapisz i zamknij również ten plik. Powinieneś zobaczyć coś takiego:
$ git rebase -i head ~ 3
[Odłączona głowa 0798991] Dodano B.py
Data: pt. 30 marca 21:09:43 2018 -0700
1 Zmieniony plik, 1 wstawienie (+)
Utwórz tryb 100644 B.py
Pomyślnie ponownie zbudowane i zaktualizowane Refs/Heads/Master.
Jeśli sprawdzisz teraz historię zatwierdzenia:
$ git log --oneline --graph -decoorate
* 0798991 (głowa -> master) Dodano B.py
* 952244a dodał.py
Wszystkie zobowiązania za B.Py został zgodzony w jednym zatwierdzeniu. Możesz zweryfikować, patrząc na B.plik PY:
$ cat b.py
Drukuj („Hello BBB”)
Ma zawartość modyfikacji 2.
Wniosek
Rebaz jest potężnym poleceniem. Może pomóc ci utrzymać swoją historię w czystości. Ale unikaj używania go do publicznych zobowiązań, ponieważ może to powodować konflikty i zamieszanie. Używaj go tylko dla własnego lokalnego repozytorium.
Dalsze badanie:
- https: // git-scm.COM/DOCS/GIT-REBASE
- https: // git-scm.com/book/en/v2/git-branching-mrebasing
- https: // git-scm.com/book/en/v2/git-tools-rządząca-historia