IT-Storm

Здравый смысл - всему голова, ибо даже мудрец не сможет оспорить его и при этом, остаться мудрецом

Menu

Git: Команда "git pull --rebase" простыми словами

Git: Команда

Иногда бывает ситуация, когда сотрудник из вашей команды локально изменил порядок коммитов (относительно общего репозитория на сервере) и (после согласования с командой) выполнил 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 pull.
Например:
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 пересоздает историю коммитов, делая её более линейной. Каждый из этих подходов имеет свои преимущества и недостатки.
 

Git