Чи можу я зробити так, щоб швидке переадресація вимкнено за замовчуванням у 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 трохи схоже на альпінізм; але замість того, щоб починати з невеликих скель і переходити до більш жорстких, git змушує вас підніматися на одну і ту ж гору знову і знову, тільки щоразу падаючи на різну висоту, щоразу настільки ж дивуючись, що рятувальний круг не прив’язаний.
conny

12
@Thomas: Так; git pullє git fetch+ git merge.
Мішель Тіллі

9
Це виглядає добре, але чи можна зробити це в усьому світі для всіх гілок, замість того, щоб встановлювати його для кожної гілки?
bwinton

33
Остерігайся драконів. Цей параметр небезпечний так само, як сказав @Thomas ... Кожен git pull створює об'єднання. git pull --ff не змінює mergeoptions = no-ff у git config.
Dalibor Filus

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"
1212 року

11
Терес також є (зараз див. Git-scm.com/docs/git-config ) опцію pull.ff, яку можна встановити лише на , яка буде робити так само, як псевдонім.
jotomo

1
Дякую, @jotomo. Ця функція доступна у Git v2.0.0 (from commit 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 # noti 'true' в кінці рядка
Zowers

Подяки @zowers Я виправив це
Бастіан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.