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.