2015-10-21 3 views
2

Обычно, когда мы обновляем наш локальный репозиторий с новыми исходными коммитами, мы делаем git fetch, git rebase. Но мы не делаем git fetch git merge. Обычно причина заключается в том, что мы не хотим добавлять новую фиксацию (слияние фиксации), а просто хотим получить все новые коммиты поверх нашего кода. Итак, почему тогда поведение по умолчанию для git pull не связано с слиянием. Я знаю, что мы можем изменить его, но есть ли причина использовать fetch-merge над fetch-rebase.Почему слияние git pull является поведением по умолчанию?

+0

Потому что это сокращение для 'git fetch & git merge FETCH_HEAD'. Или я неправильно понял ваш вопрос? – Maroun

ответ

3

Я думаю, что это работает по умолчанию, чтобы избежать перезаписи локальной истории и изменения хэшей существующих коммитов. Эти коммиты могут быть уже перенесены на пульт. rebase - это деструктивная команда, и вытаскивание изменений с пульта ДУ не должно разрушать ничего по умолчанию.

Вы можете использовать git pull --rebase или просто создать псевдоним для этого действия.

+0

Но если вы добавляете новое слияние, вы влияете на историю. Потому что в происхождении, что слияние фиксации нет. – Narek

+0

@Narek Я подразумевал, что существующие коммиты не должны меняться. – Stas

+2

@Narek, существует большая разница между * добавлением нового коммита на кончике ветки * (новое слияние с фиксацией) и * переписывание существующих коммитов на наличие новых хэшей * (перезагрузка). – Chris

4

Я предполагаю, что ваш вопрос заключается в том, почему с git pull поведение по умолчанию заключается в слиянии, а не в восстановлении вложенных изменений.

Ответ довольно прост: Rebasing воссоздает коммиты, которые переустанавливаются. Эти новые объекты commit заменяют старые. Но эти новые коммиты полностью несовместимы со старыми. Это приводит к тому, что все другие пользователи, которые вытащили оригинальные коммиты, прежде чем имели несовместимые коммиты с переустановленных вами, которые вы только что воссоздали. Таким образом, у вас есть две противоречивые версии с тем же самым изменением. Это обычно означает много проблем, так как вам необходимо исправить эти конфликты вручную (говоря, какую из двух версий сохранить, поэтому, если вы переустановили, другим из них нужно выбросить старые - вручную).

Это также, почему вы должны никогда не переводить фиксации, которые были опубликованы.

Таким образом, решение по умолчанию равно merge, так как слияние - это полностью безопасная операция, которая не вызовет конфликтов. Слитые коммиты - это только коммиты, которые добавили в историю, но не заменяют существующую историю. Да, это может сделать историю немного более сложной, но она полностью прозрачна и совместима со всеми версиями, которые существовали раньше.

Конечно, есть ситуации, в которых перебалансировка просто прекрасна. Прежде всего, если вы работаете локально на некоторых неопубликованных изменениях и хотите обновить свой репозиторий. Затем извлечение и перезагрузка ваши местные изменения все в порядке, поскольку они принадлежат только вам и никто еще не знает о них. Но это всегда должно быть явным действием, поэтому вы не ошибаетесь. И именно поэтому перебазирование - это просто вариант: git pull -r.

+2

Дайте этому человеку медаль! = D Замечательное объяснение. Благодарю. =) –

+0

Poke, я спрашиваю, когда вы обновляете свой локальный код с фиксацией в начале координат. Поэтому в этом случае вы, я полагаю, предлагаем переупаковать. И это то, что я говорю, для обновления локального кода вы должны использовать 'pull', правильно? И 'тянуть', не делая' rebase'. Вы не используете 'pull' в других случаях, чтобы обновить локальный код, правильно? – Narek

+1

Вы можете использовать 'git pull -r' для восстановления локальных изменений вместо их слияния (это по сути то же самое, что и выборка, за которой следует rebase, но короче). Но да, вы должны делать это только для * локальных изменений, которые никто не получил. Во всех других ситуациях (и когда сомневаетесь), просто сливайте, используя только «git pull». – poke

Смежные вопросы