Jak zatrzasnąć git popełnia

Jak zatrzasnąć git popełnia

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