Samouczek Git Rebase

Samouczek Git Rebase
Początkujący Git są ostrzegani przed dowództwem rebazowym. I słusznie. Ze wszystkimi nowymi rzeczami, których należy się nauczyć, początkującym lepiej opanować podstawowe pojęcia, zanim zagłębiają. Jeśli jednak rozumiesz podstawy scalania gałęzi, wiedza o tym, jak REBASE może pomóc Ci rozwiązać skomplikowane zagadki rozwojowe, gdy nadejdzie właściwy czas.

Git Rebase: Definicje

Zgodnie z dokumentacją GIT, polecenie rebazy ponownie złoży zobowiązanie na innej bazowej końcówce. Ta definicja może być trochę zniechęcająca. Łatwiej jest wyjaśnić rebazę jako procedurę, która dodaje zmiany bieżącej gałęzi do ogona innej gałęzi. Przejdźmy przez przykład, aby uzyskać lepsze pojęcie o tym, co się stanie.

Przykład Rebasing Git

W tym przykładzie najpierw utworzymy przypadek testowy z oddziałem „Master” i „Feature”. Następnie zrobimy standardowe scalanie. Następnie odtworzymy przypadek testowy i przeprowadzimy Rebase i scalamy.

1. Tworzenie gałęzi głównych i funkcji

Oto scenariusz, który stworzymy:

A - B - C (Master)
\
E - F (funkcja)

W powyższym przykładzie podążamy następującą ścieżką:

  1. Commit a: Dodajemy.plik txt w oddziale „master”
  1. Commit B: Dodajemy B.plik txt w oddziale „master”
  1. Na tym etapie tworzymy „funkcję” gałęzi, co oznacza, że ​​będzie miała.txt i b.tekst
  1. Commit c: Dodajemy c.plik txt w oddziale „master”
  1. Przechodzimy do oddziału „funkcji”
  1. Commit e: Modyfikujemy.txt w oddziale „funkcji”
  1. Commit f: modyfikujemy b.txt w oddziale „funkcji”

Możesz utworzyć folder i uruchomić następujący kod w folderze, aby utworzyć powyższą sytuację:

Git Init
Dotknij a.tekst
Git dodaj -a
git commit -m "commit a: dodał.tekst"
dotyk b.tekst
Git dodaj -a
git commit -m "commit b: Dodano b.tekst"
Funkcja oddziału Git
dotyk c.tekst
Git dodaj -a
git commit -m "commit c: dodano c.tekst"
status git
Funkcja git kasy
echo aaa> a.tekst
Git dodaj -a
git commit -m "commit e: zmodyfikowany a.tekst"
Echo BBB> B.tekst
Git dodaj -a
git commit -m "commit f: zmodyfikowany b.tekst"

2. Proste scalanie

Użyjmy polecenia dziennika, aby sprawdzić oba gałęzie.

Wyniki dla „Master”:

$ git kectout Master
Przełączony na „mistrz” oddziału
$ git log -linia
2BBDE47 COMMIL C: Dodano C.tekst
B430AB5 COMMAL B: Dodano B.tekst
6f30e95 commit a: Dodano a.tekst
$ ls
A.txt b.txt c.tekst

Wyniki dla „funkcji”:

Funkcja kasy $ git
Przełączono na „funkcję gałęzi”
$ git log -linia
0286690 commit f: zmodyfikowany b.tekst
7c5c85e commit e: Zmodyfikowany a.tekst
B430AB5 COMMAL B: Dodano B.tekst
6f30e95 commit a: Dodano a.tekst
$ ls
A.txt b.tekst

Zwróć uwagę, w jaki sposób oddział funkcji nie ma zatwierdzenia c

Teraz uruchommy gałęzie „funkcji” z oddziałem „Master”. Zostaniesz poproszony o podanie komentarza. W komentarzu dodaj „commit g:” na początku, aby ułatwić śledzenie.

$ git kectout Master
Przełączony na „mistrz” oddziału
Funkcja $ git scal
Scalone przez strategię „rekurencyjną”.
A.txt | 1 +
B.txt | 1 +
2 pliki zmienione, 2 wstawki (+)

Wyniki dla „Master”:

$ git kectout Master
Już na „mistrzu”
$ git log -linia
D086ff9 commit g: scal gałąź „funkcja”
0286690 commit f: zmodyfikowany b.tekst
7c5c85e commit e: Zmodyfikowany a.tekst
2BBDE47 COMMIL C: Dodano C.tekst
B430AB5 COMMAL B: Dodano B.tekst
6f30e95 commit a: Dodano a.tekst
$ ls
A.txt b.txt c.tekst

Wyniki dla „funkcji”:

Funkcja kasy $ git
Przełączono na „funkcję gałęzi”
$ git log -linia
0286690 commit f: zmodyfikowany b.tekst
7c5c85e commit e: Zmodyfikowany a.tekst
B430AB5 COMMAL B: Dodano B.tekst
6f30e95 commit a: Dodano a.tekst
$ ls
A.txt b.tekst

W oddziale „głównym” zauważysz, że istnieje nowe zatwierdzenie G, które połączyło zmiany z oddziału „funkcji”. Zasadniczo miało miejsce następujące działanie:

A - B - C - G (Master)
\ /
E - F (funkcja)

W zatwierdzeniu g wszystkie zmiany z oddziału „funkcji” zostały wniesione do gałęzi głównej. Ale sama gałąź „funkcji” pozostała nietknięta z powodu procesu scalania. Zwróć uwagę na skrót każdego zatwierdzenia. Po scalaniu E (7C5C85E) i F (0286690) ma ten sam skrót na oddział „Feature” i „Master”.


3. Połączenie z ponownym unieważnieniem

Powtórzmy krok 1, aby ponownie utworzyć gałęzie „Master” i „Funkcja”.

Wyniki dla „Master”:

$ git kectout Master
Przełączony na „mistrz” oddziału
$ git log -linia
7f573d8 Commit C: Dodano C.tekst
795DA3C COMMAL B: Dodano B.tekst
0f4Ed5b Commit a: Dodano.tekst
$ ls
A.txt b.txt c.tekst

Wyniki dla „funkcji”:

Funkcja kasy $ git
Przełączono na „funkcję gałęzi”
$ git log -linia
8ED0C4E commit f: zmodyfikowany b.tekst
6e12b57 commit e: zmodyfikowany a.tekst
795DA3C COMMAL B: Dodano B.tekst
0f4Ed5b Commit a: Dodano.tekst
$ ls
A.txt b.tekst

RED REBASE z oddziału „Feature”.

Funkcja kasy $ git
Przełączono na „funkcję gałęzi”
$ git rebase master
Po pierwsze, przewijanie głowy, aby odtworzyć swoją pracę na górze…
Zastosowanie: commit e: zmodyfikowany a.tekst
Zastosowanie: commit f: zmodyfikowany b.tekst

Następnie połącz „funkcję” w „Master”.

$ git kectout Master
Przełączony na „mistrz” oddziału
Funkcja $ git scal
Aktualizacja 7F573D8… 9EFA1A3
Szybkie do przodu
A.txt | 1 +
B.txt | 1 +
2 pliki zmienione, 2 wstawki (+)

Wyniki dla gałęzi „Master”:

$ git kectout Master
Już na „mistrzu”
$ git log -linia
9efa1a3 zatwierdzenie f: zmodyfikowany b.tekst
8710174 commit e: zmodyfikowany a.tekst
7f573d8 Commit C: Dodano C.tekst
795DA3C COMMAL B: Dodano B.tekst
0f4Ed5b Commit a: Dodano.tekst
$ ls
A.txt b.txt c.tekst

Wyniki dla gałęzi „funkcji”:

Funkcja kasy $ git
Przełączono na „funkcję gałęzi”
$ git log -linia
9efa1a3 zatwierdzenie f: zmodyfikowany b.tekst
8710174 commit e: zmodyfikowany a.tekst
7f573d8 Commit C: Dodano C.tekst
795DA3C COMMAL B: Dodano B.tekst
0f4Ed5b Commit a: Dodano.tekst
$ ls
A.txt b.txt c.tekst

Zauważ, że po rebazie i połączeniu obu gałęzi są takie same. Również skróty dla E i F zmieniły się w obu gałęziach. Zasadniczo w scenariuszu rebazowym tak się stało:

A - b - c
\
E ' - f' (funkcja, master)

Dlatego nie ma nowego zatwierdzenia. Zobowiązania E i F zostały ponownie obliczone i zatrzymane do końca gałęzi „Master”.

Odrodzenie to przydatne narzędzie, gdy chcesz posprzątać historię swojej pracy. Istnieje jednak niebezpieczeństwo, które urodziło złotą zasadę.


Złota zasada renowacji

Złotą zasadą odrodzenia to:

Nigdy nie renderuj oddział publiczny.

Jak widać z powyższego przykładu, ponowne obliczanie zobowiązań. Kiedy wiele osób rozgałęzionych z publicznego repozytorium, renowacja może tworzyć sytuacje, w których programiści, którzy utworzyli nowe oddziały, napotykają bardzo skomplikowane sytuacje scalania. Tak więc jest dobrym pomysłem, aby nigdy nie renosić dzielonych oddziałów publicznych.

Podsumowując:

Rebasing to wyjątkowa cecha git. Ale używaj go ostrożnie.

Więcej informacji:

Oto kilka linków do dalszych badań:

  • Dokumentacja Git Rebase
  • Atlassian Scaling Vs Rebasing
  • Jak zobaczyć historię zatwierdzenia repozytorium GIT
  • Pokaż git drzewa w terminalu
  • https: // www.Atlassian.com/git/tutorials/scaling-vs-rebasing
  • https: // git-scm.COM/DOCS/GIT-REBASE