Можно ли сделать так, чтобы ускоренная пересылка была отключена по умолчанию в git?

263

Я действительно не могу вспомнить время, когда я бы использовал, git mergeа не git rebaseи не хотел бы показывать коммит. Есть ли способ настроить git для быстрой пересылки по умолчанию? Тот факт, что есть --ffопция, может показаться, что есть способ, но я не могу найти его в документации.

Джейсон Бейкер
источник
3
Я использую mergeвсе время для веток, когда не сделал никаких коммитов с их пульта для быстрой перемотки вперед. Кажется, самый простой и безопасный способ сделать это. Мне любопытно, у вас явно есть вариант использования. Зачем вам когда-либо хотеть создать коммит слияния, когда на одной стороне ветви нет коммитов?
CB Bailey
12
Я использую ветки для создания логической группировки коммитов. Так что, если я сделаю слияние, это в основном способ сказать "эти коммиты идут вместе". Вы можете почти думать об этом как об интерактивном перебазировании и сквоше бедного человека. :-)
Джейсон Бейкер
13
Отключение быстрой пересылки чрезвычайно полезно, особенно если вы следуете модели, подобной успешной модели ветвления Git,
steinybot,
2
Пожалуйста, измените принятый ответ для этого на ответ Эрика Платона stackoverflow.com/a/6810687/3408 - я сделал шаги в принятом ответе, затем понял, что это было только для главной ветви в текущем репозитории, что глупо.
Rjmunro
3
@ jpmc26 Кажется, каждому свое. Я не согласен с этой статьей. Найти двух родителей коммита слияния несложно, и он точно скажет, какими были изменения. Затем вы можете принять эти изменения и выполнить «ребаз» на другую ветку. С плоской моделью вы должны вручную найти вишневый кирку. Мы решили охватить ветвление. Конечно, это сложно, если смотреть на все дерево, но это реальность, множественные изменения происходят параллельно. Уплощение всего лишь скрывает то, что на самом деле произошло.
Steinybot

Ответы:

282

Да, есть --no-ff. Вы можете настроить параметры слияния для каждой ветви, например,

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

добавляет следующее в ваш $(REPO)/.git/configфайл:

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

Сноска: говоря о моем опыте, я в конечном итоге обнаружил, что переключение ускоренной перемотки вперед на отключение было в основном полезным для новичков в git - однако, как только у вас начнут появляться рабочие процессы и концепции, вы определенно захотите избежать размывания своего лог-графа тоннами бессмысленных объединений. Тип удаленного ..blarf 'фиксирует.

Сноска 2, десятилетие спустя: другие ответы ниже предоставляют более современные параметры конфигурации, но на самом деле, вы, вероятно, действительно хотите остаться со значениями по умолчанию (т. Е. С ускоренной перемоткой вперед, когда это возможно) в наше время, потому что пустые коммит-коммиты действительно только сделать историю гораздо труднее рассуждать.

Конни
источник
142
Изучение мерзавца немного похоже на альпинизм; но вместо того, чтобы начинать с небольших скал и переходить к более жестким, git заставляет вас взбираться на одну и ту же гору снова и снова, чтобы каждый раз падать на разную высоту, каждый раз так же удивляясь, что спасательный круг не был привязан.
Конни
12
@ Томас: Да; git pullэто git fetch+ git merge.
Мишель Тилли
9
Это выглядит хорошо, но есть ли способ сделать это глобально, для всех ветвей, вместо того, чтобы настраивать его для каждой ветви?
Bwinton
33
Остерегайтесь драконов. Эта опция опасна, как сказал @Thomas ... Каждый git pull создает коммит слияния. git pull --ff не переопределяет mergeoptions = no-ff в git config.
Далибор Филус
15
Что если я просто устал набирать текст git merge --no-ff (branchname)? И я хочу git pullфункционировать как всегда?
Dogweather
341

Кажется, в ветке все еще остается нерешенный вопрос: как это сделать глобально (т.е. для всех ветвей)? Для записей мы можем использовать следующее:

git config --add merge.ff false

... чтобы применить его ко всем веткам в текущем хранилище. Чтобы применить его ко всем веткам во всех репозиториях, где кто-то не запускал его без --globalопции (локальные настройки переопределяют глобальные), запустите это:

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

Из документации :

merge.ff
По умолчанию git не создает дополнительный коммит слияния при слиянии коммита, который является потомком текущего коммита. Вместо этого верхушка текущей ветви быстро пересылается. Когда установлено значение false, эта переменная говорит git создать дополнительный коммит слияния в таком случае (эквивалентно предоставлению --no-ffопции из командной строки). Если задано значение «только», допускаются только такие ускоренные слияния (эквивалентно предоставлению --ff-onlyопции из командной строки).

Эрик Платон
источник
18
Примечание: merge.ffбыло введено в Git 1.7.6. Это не эффективно в старых версиях.
Крис Джонсен
2
Для людей, использующих Git 1.7.6, это лучшее и простое решение.
Райан Ланди
22
Я использую это вместе с псевдонимомpuff = "pull --ff --ff-only"
stigi
11
Theres также (теперь см. Git-scm.com/docs/git-config ) параметр pull.ff, который может быть установлен только в качестве , что будет делать то же самое, что и псевдоним.
Jotomo
1
Спасибо, @jotomo. Эта функция доступна в Git v2.0.0 (из коммита b814da891e8261b909fc5d9fb07b4e8b13989c2d).
Эрик Платон
14

Читая ветку ответов, я использовал следующие два варианта

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

Только слабо связанный Я также обнаружил, что этот параметр позволяет избежать проблем во время тяги

git config --global pull.rebase true # set up pull to rebase instead of merge
Бастиан
источник
1
git config --global pull.rebase true # уведомление «true» в конце строки
zowers
Спасибо @zowers, я исправил это
Бастиан