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