Git: Команда "git pull --rebase" простыми словами
Иногда бывает ситуация, когда сотрудник из вашей команды локально изменил порядок коммитов (относительно общего репозитория на сервере) и (после согласования с командой) выполнил git push -f (--force) общий репозиторий на сервере в ветку с названием (например) feature_0981. Соответственно вы, хотите выполнить git pull origin feature_0981 чтобы "стянуть" себе эту обновлённую ветку (которую изменил сотрудник), но получаете примерно такое сообщение от Git:
User + 538d044...84e43d3 feature_0981 -> origin/feature_0981 (forced update) hint: You have divergent branches and need to specify how to reconcile them. hint: You can do so by running one of the following commands sometime before hint: your next pull: hint: hint: git config pull.rebase false # merge (the default strategy) hint: git config pull.rebase true # rebase hint: git config pull.ff only # fast-forward only hint: hint: You can replace "git config" with "git config --global" to set a default hint: preference for all repositories. You can also pass --rebase, --no-rebase, hint: or --ff-only on the command line to override the configured default per hint: invocation.Сообщение, которое вы получили, указывает на то, что у вас есть расхождение в ветках и нужно указать, как их согласовать. Это происходит, когда Git не может выполнить автоматическое объединение изменений из-за различий в ветках.
Сообщение также предоставляет подсказки по тому, как можно разрешить это различие:
- git config pull.rebase false - это настройка по умолчанию, когда вы используете git pull. Она подразумевает объединение изменений с помощью merge (слияния).
- git config pull.rebase true - это настройка, которая указывает на объединение изменений с помощью rebase (пересоздания истории коммитов).
- git config pull.ff only - это настройка, где только fast-forward (быстрое перемещение вперед) разрешено при получении изменений.
Например:
git config pull.rebase true
Эта команда устанавливает предпочтение использовать rebase при каждом git pull (что обычно не желательно и лично я не рекомендую так делать).
Намного предпочтительнее использовать флаги --rebase, --no-rebase или --ff-only при выполнении git pull, чтобы временно переопределить настройки, установленные в конфигурации Git для этой операции.
В нашем (описанном выше случае), после того как вы убедитесь, что на вашей локальной ветке feature_0981 нет важных изменений\коммитов (которые вы не хотите потерять), чтобы обновить вашу локальную ветку feature_0981 в соответстие с модифицированной веткой на сервере, вам нужно выполнить:
git pull --rebase origin feature_0981
или, если ваша ветка уже настроена на ветку на сервере, выполнить сокращённую команду:
git pull --rebase
После этого - выша локальная ветка станет копией модифицироанной ветки на сервере. Помните, что все локальные коммиты которых нет на сервер - будут утеряны. Так что перед выполнением данной команды убедитесь что не потеряете ничего важного!
Выбор между merge и rebase зависит от предпочтений вашей команды и специфики вашего рабочего процесса. Merge создает дополнительный коммит слияния, в то время как rebase пересоздает историю коммитов, делая её более линейной. Каждый из этих подходов имеет свои преимущества и недостатки.