2010-03-23 25 views
218

Naprawdę nigdy nie myślę o czasach, w których będę używał git merge zamiast git rebase i , a nie chcę mieć zatwierdzenie. Czy jest jakiś sposób, aby skonfigurować git, aby domyślnie mieć szybkie przekazywanie? Fakt, że istnieje opcja --ff, sugerowałby, że istnieje sposób, ale nie mogę tego znaleźć w dokumentacji.Czy mogę zlecić szybkie przekazywanie dalej domyślnie w git?

+3

używam 'seryjnej 'cały czas dla oddziałów, które nie wykonały żadnych przydziałów z pilota, aby je szybko przesłać dalej. Wydaje się, że jest to najprostszy i najbezpieczniejszy sposób. Jestem ciekaw, oczywiście masz przypadek użycia. Dlaczego miałbyś kiedykolwiek chcieć utworzyć commit merge, gdy nie ma żadnych zatwierdzeń po jednej stronie oddziału? –

+11

Używam oddziałów do tworzenia logicznego grupowania zatwierdzeń. Więc jeśli dokonam scalenia, jest to w zasadzie sposób na powiedzenie "te zobowiązania idą w parze". Możesz prawie myśleć o tym jako o ubogim interaktywnym rebase i squasha.:-) –

+10

Wyłączenie szybkiego przekazywania jest niezwykle przydatne, szczególnie gdy podążamy za modelem takim jak [A successful Git branching model] (http://nvie.com/posts/a-successful-git-branching-model/) – Steiny

Odpowiedz

231

Tak, istnieje --no-ff. Możesz skonfigurować opcje scalania dla każdego oddziału, np.

git config branch.master.mergeoptions "--no-ff" 

dodaje następujące do pliku $(REPO)/.git/config:

[branch "master"] 
    mergeoptions = --no-ff 

Przypis: mówienie z mojego doświadczenia wynika, że ​​w końcu znalazł przejście do przodu na starcie był głównie pomocne dla początkujących git - jednak gdy poczujesz, jak przepływy pracy i koncepcje zaczynają tonąć, zdecydowanie nie chcesz zamazywać wykresu logu z tonami bezsensownych "połączonych zdalnych zatwierdzeń typu" blarf ".

+0

Ach, przypuszczam, że wtedy szukałem w niewłaściwym miejscu. Dzięki! –

+115

Uczenie się jest trochę jak wspinaczka górska; ale zamiast zaczynać od małych klifów i wspinać się na trudniejsze, git sprawia, że ​​wspinasz się na tę samą górę raz za razem, tylko za każdym razem spadając na różne wysokości, za każdym razem tak samo zaskoczony, że linia życia nie była przywiązana. – conny

+0

@conny - Myślę, że to moja nowa ulubiona cytat o git! –

289

Wygląda na to, że wątek nadal oczekuje na pytanie: jak to zrobić globalnie (tj. We wszystkich gałęziach)? W przypadku rekordów możemy użyć następującego:

git config --add merge.ff false 

... w celu zastosowania go do wszystkich oddziałów w bieżącym repozytorium. Aby uczynić go zastosować do wszystkich oddziałów w wszystkie repozytoria gdzie ktoś ma nie uruchomić go bez opcji --global (zastępują lokalne ustawienia globalne) uruchomić to:

git config --global --add merge.ff false 

Z documentation (szukaj merge.ff) :

merge.ff
domyślnie git nie tworzy dodatkowy scalającej podczas scalania commit, który jest potomkiem obecny popełnić. Zamiast tego końcówka bieżącej gałęzi jest szybko przekazywana dalej. Po ustawieniu wartości false ta zmienna mówi gitowi, aby w takim przypadku utworzył dodatkowe zatwierdzenie scalania (równoważne daniu opcji --no-ff z wiersza poleceń). Po ustawieniu na only dozwolone są tylko takie szybkie przewijanie do przodu (co jest równoważne z podaniem opcji --ff-only z wiersza poleceń).

+16

Uwaga:' merge.ff 'został wprowadzony w Git 1.7.6. Nie działa w starszych wersjach. –

+2

Dla osób korzystających z Git 1.7.6 jest to najlepsze i najprostsze rozwiązanie. –

+19

Używam tego razem z aliasem 'puff =" pull --ff --ff-only "' – stigi

1

Czytając wątek odpowiedzi skończyło się stosując następujące dwie opcje

git config --global pull.ff only # Disallows non ff merges on pull. Overrides merge.ff when pulling 
git config --global merge.ff false # even create extra merge commit when fast forward merge would be possible 

tylko luźno związane Ja również znaleźć to ustawienie pozwala uniknąć kłopotów podczas ściągania

git config --global pull.rebase # set up pull to rebase instead of merge