Я просто не понимаю этого. Я много читал в Интернете и в книгах, и что-то просто не оставалось у меня в голове. Может кто-нибудь, пожалуйста, дайте мне фиктивную версию следующего:
- git fetch vs pull
- git merge vs rebase
Я просто не понимаю этого. Я много читал в Интернете и в книгах, и что-то просто не оставалось у меня в голове. Может кто-нибудь, пожалуйста, дайте мне фиктивную версию следующего:
fetch
будет загружать любые изменения из ветки удаленного *, обновляя данные вашего репозитория, но оставляя вашу локальную ветвь * неизменной.
pull
выполнит fetch
и дополнительно merge
изменения в вашей локальной ветки.
Какая разница? pull
обновляет локальную ветвь с изменениями от вытащенной ветки. A fetch
не продвигает вашу локальную ветвь.
Учитывая следующую историю:
C---D---E local / A---B---F---G remote
merge
объединяет две истории развития вместе. Это происходит путем повторения изменений, произошедших на вашей локальной ветке после того, как они расходятся поверх удаленной ветки и записывают результат в новую фиксацию. Эта операция сохраняет родословную каждой фиксации.
Эффект a merge
будет:
C---D---E local / \ A---B---F---G---H remote
rebase
возьмет коммиты, которые существуют в вашей локальной ветки, и повторно примените их поверх удаленной ветки. Эта операция перезаписывает предков ваших локальных коммитов.
Эффект a rebase
будет:
C'--D'--E' local / A---B---F---G remote
Какая разница? A merge
не изменяет родословную коммитов. A rebase
переписывает родословную ваших локальных коммитов.
*
В этом объяснении предполагается, что текущая ветвь является локальной ветвью, а ветвь, указанная как аргумент fetch
, pull
, merge
или rebase
, является удаленной ветвью. Это обычный случай. pull
, например, загрузит любые изменения из указанной ветки, обновит ваш репозиторий и merge
изменения в текущую ветку.
Fetch vs Pull
Git fetch просто обновляет ваши данные репо, но притяжение git в основном выполняет выборку, а затем объединяет ветвь, вытащенную
В чем разница между 'git pull' и 'git fetch'?
Слияние с Rebase
из Atlassian SourceTree Blog, Объединить или перезагрузить:
Слияние объединяет две линии развития, сохраняя при этом предки каждой истории фиксации.
В отличие от этого, rebasing унифицирует линии развития путем повторной записи изменения из ветки источника, чтобы они отображались как дети из пункт назначения - эффективно притворяется, что эти написанное сверху ветки назначения.
Кроме того, проверьте Изучите git Ветвление, которое является хорошей игрой, только что отправленной в HackerNews (ссылка на сообщение) и учит много разветвлений и слияния. Я считаю, что это будет очень полезно в этом вопросе.
pull vs fetch:
То, как я это понимаю, заключается в том, что git pull
- это просто git fetch
, за которым следует git merge
. То есть вы извлекаете изменения из удаленной ветки, а затем объединяете их в текущую ветвь.
merge vs rebase:
Слияние будет выполняться по команде; объединить различия между текущей ветвью и указанной ветвью (в текущую ветку). То есть команда git merge another_branch
будет слить another_branch
в текущую ветку.
Ребаза работает немного по-другому и выглядит круто. Скажем, вы выполняете команду git rebase another_branch
. Git сначала найдет последнюю общую версию между текущей ветвью и another_branch
. То есть точка до разветвления ветвей. Затем Git переместит эту расходящуюся точку на головку another_branch
. Наконец, все коммиты в текущей ветке, начиная с исходной расходящейся точки, воспроизводятся из новой расходящейся точки. Это создает очень чистую историю, с меньшим количеством ветвей и слияниями.
Однако, это не без ловушек! Поскольку история версий "перезаписана", вы должны сделать это, только если коммиты существуют только в локальном репозитории Git. То есть: никогда не делайте этого, если вы переместили коммиты на удаленное репо.
Объяснение по переустановке в этой онлайн-книге неплохое, с легко понятными иллюстрациями.
вытащить с перезагрузкой вместо слияния
Я использую rebase довольно много, но обычно он в сочетании с pull:
git pull --rebase
будет извлекать удаленные изменения, а затем rebad вместо merge. То есть он будет воспроизводить все ваши локальные коммиты с момента последнего притяжения. Я нахожу это намного более чистым, чем обычное нажатие слияния, которое создаст дополнительную фиксацию слияниями.