В git чем fetch отличается от pull и чем merge отличается от rebase?

160

Я просто не могу этого понять. Я много читал в Интернете и книгах, и что-то просто не осталось в моей голове. Может кто-нибудь, пожалуйста, дайте мне фиктивную версию следующего:

  • мерзавец против тяги
  • git merge vs rebase
techsjs2013
источник
24
Я сочувствую спрашивающему. Документация и рекомендации настолько тяжелы, а возможные перестановки рабочего процесса настолько массивны, что можно запутаться. Голова только что взорвалась, и никто не знает, что спросить, просто это не так очевидно.
Эд Рэндалл
3
Почему бы не выбрать ответ пестреллы как принятый?
Arashsoft
@Arashsoft, потому что его не видели с 2013 года
VdeX

Ответы:

415

получить против тяги

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изменения в текущую ветку.

pestrella
источник
31
Это, безусловно, самое простое и лучшее объяснение, не вдаваясь в дебаты за каждой практикой. Спасибо!
Джонатан С. Фишер
3
Абсолютно золотой ответ
ChaseMoskal
5
Хотел бы я "фаворитовать" этот ответ. Может быть, я просто напечатаю это и приклею на стену.
LarsH
2
Я бы сказал, лучший из лучших ответов, которые я получил в stackoverflow, Спасибо
J
1
Если fetch только загружает изменения из удаленной ветви и обновляет данные репозитория, но оставляет локальную ветку без изменений, то какой смысл выбирать, если рабочий каталог не показывает / не отражает изменения? Первоначально у меня был вопрос: как я могу увидеть изменения, сделанные кем-то другим, а затем решить, хочу ли я объединить их в свой рабочий каталог (т.е. поэкспериментировать с изменениями других людей, чтобы убедиться, что он не нарушает мою работу), но я все еще запутался как это сделать? Должен ли я просто исследовать и экспериментировать / исследовать, и если это было проблематично, сделать полный сброс?
28

Fetch vs Pull

Git fetch просто обновляет данные репо, но git pull в основном выполняет выборку, а затем объединяет ветвь

В чем разница между «git pull» и «git fetch»?


Merge vs Rebase

из блога Atlassian SourceTree, слияние или перебазирование :

Объединение объединяет две линии развития, сохраняя при этом историю каждого коммита.

Напротив, перебазирование объединяет линии разработки, перезаписывая изменения из ветви-источника, чтобы они выглядели как дочерние элементы ветви-назначения, фактически делая вид, что эти коммиты были записаны поверх ветви-назначения все время.

Кроме того, ознакомьтесь с Learn Git Branching , отличной игрой, которая только что была опубликована в HackerNews ( ссылка на публикацию ) и учит множеству трюков с ветвлением и слиянием. Я считаю, что это будет очень полезно в этом вопросе.

Фелипе Сабино
источник
спасибо Felips .. так что, если я сделаю выборку с пульта, в моей главной ветке не будет обновлений? также звучит так, как будто я должен сделать ребаз больше, чем
merga
rebase vs merge зависит от ваших намерений, имея в виду, что rebase переписывает всю историю коммитов. И да, если вы выбираете только, основная ветвь не будет изменена, вам придется объединить (или вытащить), чтобы применить удаленные изменения
Фелипе Сабино
git merge <remote>/<branch>, например, если вы являетесь ведущей веткой, а ваш удаленный имеет имя origin, вы можете это сделать git merge origin/master.
Фелипе Сабино
так что звучит так, будто я всегда должен делать мастер git checkout git fetch git diff origin / master мастер git rebase origin
techsjs2013
8

тянуть против выборки :

Насколько я понимаю, 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

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

Стайнар
источник
так что, если я работаю в и разветвляюсь, и я хочу объединить его обратно в мастер, прежде чем я сделаю толчок. Я должен проверить мастер, затем получить исправление rebase?
techsjs2013
Я до сих пор не понимаю слияние с
ребасом
Я думаю, что иллюстрации, представленные в ответе Пестреллы, показывают разницу достаточно четко. Кроме того, проверьте: git-scm.com/book/en/Git-Branching-Rebasing - который довольно неплохо объясняет это (та же ссылка, что и в ответе, но приведена снова для ленивых).
Steinar
0

Merge - ветка HEAD сгенерирует новый коммит, сохранив происхождение каждой истории коммитов. История может стать загрязненной, если коммиты слияния сделаны несколькими людьми, которые работают в одной ветви параллельно.

Rebase - перезаписывает изменения одной ветви на другую без создания нового коммита. История кода упрощена, линейна и читаема, но она не работает с запросами по запросу, потому что вы не видите, какие незначительные изменения кто-то сделал.

Я бы использовал git mergeпри работе с функциональным процессом или если я не знаком с rebase. Но, если я хочу более чистой, линейной истории, то git rebaseэто более уместно. Для более подробной информации обязательно ознакомьтесь с этой статьей слияния или перебазирования .

Неша Зорич
источник