Обычно, когда мы обновляем наш локальный репозиторий с новыми исходными коммитами, мы делаем git fetch, git rebase. Но мы не делаем git fetch git merge. Обычно причина заключается в том, что мы не хотим добавлять новую фиксацию (слияние фиксации), а просто хотим получить все новые коммиты поверх нашего кода. Итак, почему тогда поведение по умолчанию для git pull не связано с слиянием. Я знаю, что мы можем изменить его, но есть ли причина использовать fetch-merge над fetch-rebase.Почему слияние git pull является поведением по умолчанию?
ответ
Я думаю, что это работает по умолчанию, чтобы избежать перезаписи локальной истории и изменения хэшей существующих коммитов. Эти коммиты могут быть уже перенесены на пульт. rebase
- это деструктивная команда, и вытаскивание изменений с пульта ДУ не должно разрушать ничего по умолчанию.
Вы можете использовать git pull --rebase
или просто создать псевдоним для этого действия.
Но если вы добавляете новое слияние, вы влияете на историю. Потому что в происхождении, что слияние фиксации нет. – Narek
@Narek Я подразумевал, что существующие коммиты не должны меняться. – Stas
@Narek, существует большая разница между * добавлением нового коммита на кончике ветки * (новое слияние с фиксацией) и * переписывание существующих коммитов на наличие новых хэшей * (перезагрузка). – Chris
Я предполагаю, что ваш вопрос заключается в том, почему с git pull
поведение по умолчанию заключается в слиянии, а не в восстановлении вложенных изменений.
Ответ довольно прост: Rebasing воссоздает коммиты, которые переустанавливаются. Эти новые объекты commit заменяют старые. Но эти новые коммиты полностью несовместимы со старыми. Это приводит к тому, что все другие пользователи, которые вытащили оригинальные коммиты, прежде чем имели несовместимые коммиты с переустановленных вами, которые вы только что воссоздали. Таким образом, у вас есть две противоречивые версии с тем же самым изменением. Это обычно означает много проблем, так как вам необходимо исправить эти конфликты вручную (говоря, какую из двух версий сохранить, поэтому, если вы переустановили, другим из них нужно выбросить старые - вручную).
Это также, почему вы должны никогда не переводить фиксации, которые были опубликованы.
Таким образом, решение по умолчанию равно merge, так как слияние - это полностью безопасная операция, которая не вызовет конфликтов. Слитые коммиты - это только коммиты, которые добавили в историю, но не заменяют существующую историю. Да, это может сделать историю немного более сложной, но она полностью прозрачна и совместима со всеми версиями, которые существовали раньше.
Конечно, есть ситуации, в которых перебалансировка просто прекрасна. Прежде всего, если вы работаете локально на некоторых неопубликованных изменениях и хотите обновить свой репозиторий. Затем извлечение и перезагрузка ваши местные изменения все в порядке, поскольку они принадлежат только вам и никто еще не знает о них. Но это всегда должно быть явным действием, поэтому вы не ошибаетесь. И именно поэтому перебазирование - это просто вариант: git pull -r
.
Дайте этому человеку медаль! = D Замечательное объяснение. Благодарю. =) –
Poke, я спрашиваю, когда вы обновляете свой локальный код с фиксацией в начале координат. Поэтому в этом случае вы, я полагаю, предлагаем переупаковать. И это то, что я говорю, для обновления локального кода вы должны использовать 'pull', правильно? И 'тянуть', не делая' rebase'. Вы не используете 'pull' в других случаях, чтобы обновить локальный код, правильно? – Narek
Вы можете использовать 'git pull -r' для восстановления локальных изменений вместо их слияния (это по сути то же самое, что и выборка, за которой следует rebase, но короче). Но да, вы должны делать это только для * локальных изменений, которые никто не получил. Во всех других ситуациях (и когда сомневаетесь), просто сливайте, используя только «git pull». – poke
- 1. По умолчанию поведение «git pull»
- 2. Почему git pull необходимо совершить слияние?
- 3. Предотвратить слияние при git pull
- 4. git plush ('git pull && git push') слияние уже сделанных файлов
- 5. git pull автоматический слияние список слияний
- 6. git rebase after pull
- 7. Проблема с «git pull»
- 8. Почему git fast-forward сливается по умолчанию?
- 9. Что такое удаленная ветка по умолчанию для git pull?
- 10. Git Hook для git pull
- 11. MATLAB git Pull
- 12. Почему значение git core.preloadindex по умолчанию false?
- 13. Git pull after commit
- 14. Переименуйте начало по умолчанию (git)
- 15. git push/git pull ошибка. Что по-другому на пульте?
- 16. git pull origin master дает слияние конфликта: что мне делать?
- 17. Git: pull vs. fetch → pull
- 18. Git слияние без быстрой перемотки вперед по умолчанию
- 19. Является ли слияние спецификаций Feature и Request поддерживаемым поведением rspec?
- 20. GitHub: git pull конфликты, как вы разрешаете «слияние»?
- 21. Как продлить OrderedDict с поведением по умолчанию
- 22. git: 'pull' не является git-командой - CentOS VPS-сервер
- 23. Является ли «Слияние» с сообщением фиксации, созданным битбакетом, или git?
- 24. Почему git не нажимает теги по умолчанию?
- 25. слияние двух git repos
- 26. Является ли это неопределенным поведением и почему?
- 27. Git, слияние ветвей git
- 28. Git pull приводит к посторонним сообщениям «Слияние» в журнале фиксации
- 29. git pull with clean local repo вызывает слияние commit
- 30. Git pull merge fetch
Потому что это сокращение для 'git fetch & git merge FETCH_HEAD'. Или я неправильно понял ваш вопрос? – Maroun