Git szybkie przewijanie VS brak szybkiego łączenia


247

Scalanie Git pozwala nam wykonywać szybkie przewijanie do przodu i brak szybkiego łączenia gałęzi. Jakieś pomysły, kiedy użyć scalania szybkiego przewijania do przodu, a kiedy nie używać scalania szybkiego przewijania do przodu?



2
Myślę, że inną naprawdę dobrą perspektywę można znaleźć tutaj endoflineblog.com/gitflow-consisted-harmful
— Dmitry Minkovsky 24.10.16

Odpowiedzi:


290

Ta --no-ffopcja jest przydatna, gdy chcesz mieć jasne pojęcie o gałęzi funkcji. Więc nawet jeśli w międzyczasie nie dokonano żadnych zatwierdzeń, FF jest możliwe - nadal chcesz czasami, aby każde zatwierdzenie w linii głównej odpowiadało jednej funkcji. Więc traktujesz gałąź funkcji z zestawem zatwierdzeń jako jedną jednostkę i łączysz je jako jedną jednostkę. Z twojej historii jasno wynika, że ​​dokonujesz scalania gałęzi funkcji --no-ff.

Jeśli nie przejmujesz się takimi rzeczami - prawdopodobnie możesz uciec z FF, gdy tylko jest to możliwe. W ten sposób będziesz mieć bardziej podobne do svn poczucie przepływu pracy.

Na przykład autor tego artykułu uważa, że ​​ta --no-ffopcja powinna być domyślna, a jego rozumowanie jest zbliżone do przedstawionego powyżej:

Rozważmy sytuację, w której szereg drobnych zatwierdzeń w gałęzi „Feature” łącznie tworzy jedną nową funkcję: Jeśli po prostu zrobisz „git merge feature_branch” bez --no-ff, „z ​​historii Gita nie można zobaczyć, które z obiektów zatwierdzania mają razem zaimplementowano funkcję - należy ręcznie odczytać wszystkie komunikaty dziennika. Cofanie całej funkcji (tj. grupy zmian) jest prawdziwym bólem głowy [jeśli --no-ffnie jest używana], podczas gdy można to łatwo zrobić, jeśli --no-ffflaga została użyta [ponieważ to tylko jedno zatwierdzenie]. ”

Grafika pokazująca, jak --no-ff grupuje wszystkie zatwierdzenia z gałęzi funkcji w jedno zatwierdzenie w gałęzi głównej


3
A szybkie przewijanie jest świetne, gdy masz kolekcję blisko powiązanych gałęzi, które od czasu do czasu chcesz po prostu się przenieść. Nie wszystkie fuzje są prawdziwymi wydarzeniami historycznymi.
— Cascabel,

3
Po co więc utrzymywać kilka oddziałów? Jeśli są blisko spokrewnione - dlaczego nie robić wszystkiego w jednym oddziale?
— Ivan Danilov

11
Ściśle powiązane nie oznacza identyczne. Poza tym przepływ pracy nie zawsze jest uporządkowany. Nie zawsze popełniasz zobowiązania, które Twoim zdaniem zamierzasz osiągnąć, nie zawsze rozgałęziasz się z najlepszego miejsca. Być może zaczynasz kilka funkcji z jednego miejsca, zaczynasz pracę nad jednym z nich, zdajesz sobie sprawę, że jest ogólny, i przewijasz do drugiego, zanim się rozejdziesz.
— Cascabel,

2
Jeśli chodzi o pierwszą odpowiedź, rozumiem, że OP chce znać najlepsze praktyki, których należy przestrzegać. Rzeczy się zdarzają i nie wszystko jest idealne, ale wydaje się, że to raczej wymuszony kompromis.
— Ivan Danilov

1
Warto zauważyć, że korzyści płynące z --no-ffhistorii zatwierdzeń mogą nie być od razu widoczne przy użyciu podstawowych narzędzi, takich jak git log, które będą nadal wyświetlać wszystkie zatwierdzenia ze wszystkich gałęzi, które zostały połączone w bieżący oddział. To powiedziawszy, korzyści stają się wyraźniejsze, gdy używa się np. W git log --first-parentbranży integracji, takiej jak developlub master. Jeśli użyjesz go religijnie --no-ff, wyświetli to wyłącznie prośby o połączenie, a git logjednocześnie zapewni (bardziej) kompleksową historię. Dlatego Vincent zaleca go do użytku z GitFlow .
— Jeremy Caney

12

Mogę podać przykład powszechnie spotykany w projekcie.

Tutaj opcja --no-ff(tj. Prawdziwe scalenie ) tworzy nowe zatwierdzenie z wieloma rodzicami i zapewnia lepsze śledzenie historii. W przeciwnym razie --ff(tj. Scalanie przewijania do przodu ) jest domyślnie.

$ git checkout master
$ git checkout -b newFeature
$ ...
$ git commit -m 'work from day 1'
$ ...
$ git commit -m 'work from day 2'
$ ...
$ git commit -m 'finish the feature'
$ git checkout master
$ git merge --no-ff newFeature -m 'add new feature'
$ git log
// something like below
commit 'add new feature'         // => commit created at merge with proper message
commit 'finish the feature'
commit 'work from day 2'
commit 'work from day 1'
$ gitk                           // => see details with graph

$ git checkout -b anotherFeature        // => create a new branch (*)
$ ...
$ git commit -m 'work from day 3'
$ ...
$ git commit -m 'work from day 4'
$ ...
$ git commit -m 'finish another feature'
$ git checkout master
$ git merge anotherFeature       // --ff is by default, message will be ignored
$ git log
// something like below
commit 'work from day 4'
commit 'work from day 3'
commit 'add new feature'
commit 'finish the feature'
commit ...
$ gitk                           // => see details with graph

(*) Zauważ, że tutaj, jeśli newFeaturegałąź zostanie ponownie użyta, zamiast utworzyć nową gałąź, git i tak będzie musiał wykonać --no-ffscalenie. Oznacza to, że szybkie łączenie do przodu nie zawsze jest możliwe.


6

Kiedy pracujemy nad środowiskiem programistycznym i łączymy nasz kod z gałęzią pomostową / produkcyjną, wówczas Git nie może być lepszym rozwiązaniem. Zwykle, gdy pracujemy w dziale rozwoju dla jednej funkcji, zwykle mamy wiele zatwierdzeń. Śledzenie zmian za pomocą wielu zatwierdzeń może być później niewygodne. Jeśli połączymy się z gałęzią przemieszczania / produkcji za pomocą Git bez szybkiego przewijania, będzie miał tylko 1 zatwierdzenie. Teraz za każdym razem, gdy chcemy przywrócić tę funkcję, wystarczy przywrócić zatwierdzenie. Życie jest proste.


0

Możliwe jest również, że ktoś może chcieć mieć spersonalizowane gałęzie funkcji, w których kod jest umieszczany na koniec dnia. Pozwala to na dokładniejsze śledzenie rozwoju.

Nie chciałbym zanieczyszczać rozwoju głównego niedziałającym kodem, dlatego robienie --no-ff może być tym, czego się szuka.

Na marginesie, może nie być konieczne zatwierdzenie działającego kodu w spersonalizowanym oddziale, ponieważ historię można przepisać git rebase -ii wymusić na serwerze, o ile nikt inny nie pracuje w tym samym oddziale.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.