Компьютеры · Инструкция
git pull --ff-only: когда использовать
git pull --ff-only: когда использовать — режим подходит, когда pull разрешено только как fast-forward и история не должна получать автоматический merge-коммит.
Короткий ответ
`git pull --ff-only` обновляет текущую ветку только если её можно сдвинуть вперёд без создания merge commit и без rebase. Если локальная и удалённая история разошлись, pull завершится ошибкой вместо автоматического изменения истории.
Что означает fast-forward
Fast-forward возможен, когда текущий локальный commit является предком нового удалённого tip: Git просто передвигает указатель ветки вперёд. Никакого дополнительного merge commit не создаётся, существующие локальные commits не переписываются. При divergence обе стороны имеют уникальные commits, поэтому простой сдвиг указателя невозможен. `--ff-only` в такой ситуации останавливается — именно это и делает его полезным как предохранитель.
Совет: Используйте ff-only как сигнал «нужен выбор», а не как способ автоматически разрешать divergence.
Как применять ff-only в рабочем процессе
- Перед pull выполните `git fetch`, если хотите сначала отдельно увидеть состояние remote-tracking ветки.
- Посмотрите `git log --oneline --graph --decorate --all` или `git status`, чтобы понять ahead/behind.
- Выполните `git pull --ff-only`; при линейной истории ветка обновится без merge commit.
- Если команда отказалась из-за divergence, не добавляйте `--force`: решите, нужен ли rebase локальных commits или merge.
- Если политика команды всегда требует такого поведения, настройте соответствующий pull.ff в конфигурации и документируйте это в onboarding.
Чем ff-only отличается от rebase
`--rebase` может взять ваши локальные commits и воспроизвести их поверх обновлённой удалённой ветки, то есть изменить их идентификаторы. `--ff-only` ничего такого не делает: он либо выполняет простой fast-forward, либо не меняет историю. Обычный merge при divergence может создать merge commit. Поэтому ff-only особенно уместен там, где любой нелинейный случай должен быть явным решением разработчика, а не побочным эффектом `git pull`.
Предупреждение: Не путайте `--ff-only` с `--force`: force здесь не является решением расхождения.
Если pull отказался
- не удалять локальные commits наугад;
- сначала сравнить `HEAD` и remote-tracking branch;
- выбрать rebase или merge по правилам команды;
- при сомнении сделать временную backup-ветку.
Почему команда намеренно завершается ошибкой
Отказ при расходящихся ветках — нормальное поведение `--ff-only`, а не поломка репозитория. Такой режим специально не создаёт merge-коммит и не запускает rebase: сначала нужно явно решить, как должна быть согласована локальная история с удалённой.
Как читать результат после отказа ff-only
После сообщения о невозможности fast-forward сначала выполните `git status` и сравните ветки через `git log --graph --oneline --decorate --all` или более узкий диапазон. Это помогает увидеть, откуда взялись локальные и удалённые коммиты. Затем уже выбирайте rebase или merge по правилам проекта; не переключайте `--ff-only` на автоматический merge только ради исчезновения ошибки.
Пример безопасного отказа
У `origin/main` появились два новых commit, а локально вы сделали один собственный. `git pull --ff-only` не может просто передвинуть `main`, потому что локальный commit потерялся бы из линии. Команда останавливается. После этого вы можете осознанно сделать `git rebase origin/main` либо merge согласно политике проекта, вместо неожиданного автоматического merge.
Важно: Перед rebase общих опубликованных commits оцените последствия переписывания истории.
Что учитывать
Отказ при расходящихся ветках — нормальное поведение `--ff-only`, а не поломка репозитория. Такой режим специально не создаёт merge-коммит и не запускает rebase: сначала нужно явно решить, как должна быть согласована локальная история с удалённой.
Источники и проверка
Инструкция составлена редакцией N1RO на 2026-09-23. Перед действием сверьте актуальные условия на официальном сайте сервиса или производителя.