Czy mogę domyślnie wyłączyć szybkie przesyłanie w git?

263

Naprawdę nie mogę sobie wyobrazić czasu, w którym wolałbym git mergezamiast tego git rebasei nie chcę, aby pojawił się zatwierdzony. Czy jest jakiś sposób, aby skonfigurować git, aby domyślnie wyłączał szybkie przekazywanie? Fakt, że istnieje --ffopcja, wydaje się sugerować, że istnieje sposób, ale nie mogę tego znaleźć w dokumentacji.

Jason Baker
źródło
3
mergeCały czas używam dla oddziałów, gdy nie wykonałem żadnych zobowiązań ze swojego pilota, aby je szybko przewinąć. Wydaje się to najprostszym i najbezpieczniejszym sposobem na zrobienie tego. Jestem ciekawy, oczywiście masz przypadek użycia. Dlaczego miałbyś kiedykolwiek chcieć utworzyć zatwierdzenie scalania, gdy po jednej stronie oddziału nie ma żadnych zatwierdzeń?
CB Bailey
12
Korzystam z gałęzi, aby utworzyć logiczną grupę zatwierdzeń. Więc jeśli dokonam scalenia, jest to w zasadzie sposób powiedzenia „te zobowiązania idą w parze”. Możesz niemal myśleć o tym jak o interaktywnej bazie i squasha biedaka. :-)
Jason Baker
13
Wyłączenie szybkiego przewijania jest niezwykle przydatne, szczególnie w przypadku takiego modelu, jak udany model rozgałęziania Git
steinybot 19.09.12
2
Zmień zaakceptowaną odpowiedź na to na odpowiedź Erica Platona stackoverflow.com/a/6810687/3408 - Zrobiłem kroki w zaakceptowanej odpowiedzi, a potem zdałem sobie sprawę, że dotyczy to tylko gałęzi master w bieżącym repozytorium, co jest głupie.
rjmunro
3
@ jpmc26 Chyba każdy według własnego uznania. Nie zgadzam się z tym artykułem. Znalezienie dwóch rodziców zatwierdzenia przez scalenie nie jest trudne i mówi dokładnie, jakie były zmiany. Następnie możesz wprowadzić te zmiany i wykonać „zmianę bazy” na inną gałąź. W przypadku modelu płaskiego musisz ręcznie znaleźć i wybrać cherry. Wybieramy rozgałęzienie. Na pewno jest to skomplikowane, gdy patrzy się na całe drzewo, ale taka jest rzeczywistość, wiele zmian zachodzi równolegle. Spłaszczanie wszystkiego ukrywa tylko to, co się naprawdę wydarzyło.
steinybot,

Odpowiedzi:

282

Tak jest --no-ff. Możesz skonfigurować opcje scalania według gałęzi, np

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

dodaje następujące elementy do $(REPO)/.git/configpliku:

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

Przypis: mówiąc o moim doświadczeniu, w końcu stwierdziłem, że szybkie przejście do przodu i wyłączenie było bardzo pomocne dla początkujących użytkowników - jednak gdy wyczucie przepływów pracy i koncepcji zacznie się w tobie zapadać, zdecydowanie chcesz uniknąć rozmazania wykresu logicznego z mnóstwem bezcelowych „scalonych” zdalne ..blarf 'typu commits.

Przypis 2, dekadę później: inne odpowiedzi poniżej zapewniają bardziej nowoczesne opcje konfiguracji, ale tak naprawdę prawdopodobnie chcesz pozostać przy ustawieniach domyślnych (tj. W miarę możliwości szybko przewijać do przodu) w tym dniu i wieku, ponieważ puste łączenie-zatwierdzanie naprawdę tylko sprawia, że ​​historia jest trudniejsza do uzasadnienia.

conny
źródło
142
Nauka git jest trochę jak wspinaczka górska; ale zamiast zaczynać od małych klifów i przechodzić w trudniejsze, git sprawia, że ​​wspinasz się na tę samą górę raz po raz, tylko po to, by za każdym razem spadać na różne wysokości, za każdym razem równie zaskoczony, że linia życia nie była dołączona.
conny
12
@Thomas: Tak; git pulljest git fetch+ git merge.
Michelle Tilley,
9
Wygląda to dobrze, ale czy można to zrobić globalnie dla wszystkich gałęzi, zamiast konfigurować je dla każdej gałęzi?
bwinton
33
Uważaj na smoki. Ta opcja jest niebezpieczna, tak jak powiedział @Thomas ... Każde ściągnięcie gita powoduje zatwierdzenie scalenia. git pull --ff nie zastępuje mergeoptions = no-ff w git config.
Dalibor Filus
15
Co jeśli jestem zmęczony pisaniem git merge --no-ff (branchname)? I chcę git pullfunkcjonować jak zawsze?
Dogweather
341

Wygląda na to, że w wątku wciąż pozostaje pytanie: jak to zrobić globalnie (tj. Dla wszystkich gałęzi)? Do rejestrów możemy użyć:

git config --add merge.ff false

... aby zastosować ją do wszystkich oddziałów w bieżącym repozytorium. Aby zastosować go do wszystkich oddziałów we wszystkich repozytoriach, w których ktoś nie uruchomił go bez --globalopcji (ustawienia lokalne zastępują globalne), uruchom to:

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

Z dokumentacji :

merge.ff
Domyślnie git nie tworzy dodatkowego zatwierdzenia scalania podczas scalania zatwierdzenia będącego potomkiem bieżącego zatwierdzenia. Zamiast tego wierzchołek bieżącej gałęzi jest przewijany do przodu. Gdy ustawiona na wartość false, ta zmienna mówi gitowi, aby w takim przypadku utworzył dodatkowe zatwierdzenie scalania (równoważne z podaniem --no-ffopcji z wiersza poleceń). Gdy ustawione na tylko, dozwolone są tylko takie szybkie przewijanie do przodu (co odpowiada --ff-onlyopcji z linii poleceń).

Eric Platon
źródło
18
Uwaga: merge.ffwprowadzono w Git 1.7.6. Nie działa w starszych wersjach.
Chris Johnsen,
2
Dla osób korzystających z Git 1.7.6 jest to najlepsze i najprostsze rozwiązanie.
Ryan Lundy,
22
Używam tego razem z pseudonimempuff = "pull --ff --ff-only"
stigi
11
Istnieje również (teraz, patrz git-scm.com/docs/git-config ) opcja pull.ff, którą można ustawić tylko na , która zrobi to samo co alias.
jotomo
1
Dziękuję, @jotomo. Ta funkcja jest dostępna z Git v2.0.0 (z zatwierdzenia b814da891e8261b909fc5d9fb07b4e8b13989c2d).
Eric Platon,
14

Czytając wątek odpowiedzi, skorzystałem z następujących dwóch opcji

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 spokrewnione odkryłem, że to ustawienie pozwala uniknąć problemów podczas ściągania

git config --global pull.rebase true # set up pull to rebase instead of merge
bastian
źródło
1
git config --global pull.rebase true # notice 'true' na końcu linii
zowers
Dzięki @zowers Naprawiłem to
Bastian