В git чем fetch отличается от pull и чем merge отличается от rebase?
160
Я просто не могу этого понять. Я много читал в Интернете и книгах, и что-то просто не осталось в моей голове. Может кто-нибудь, пожалуйста, дайте мне фиктивную версию следующего:
Я сочувствую спрашивающему. Документация и рекомендации настолько тяжелы, а возможные перестановки рабочего процесса настолько массивны, что можно запутаться. Голова только что взорвалась, и никто не знает, что спросить, просто это не так очевидно.
Эд Рэндалл
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изменения в текущую ветку.
Это, безусловно, самое простое и лучшее объяснение, не вдаваясь в дебаты за каждой практикой. Спасибо!
Джонатан С. Фишер
3
Абсолютно золотой ответ
ChaseMoskal
5
Хотел бы я "фаворитовать" этот ответ. Может быть, я просто напечатаю это и приклею на стену.
LarsH
2
Я бы сказал, лучший из лучших ответов, которые я получил в stackoverflow, Спасибо
J
1
Если fetch только загружает изменения из удаленной ветви и обновляет данные репозитория, но оставляет локальную ветку без изменений, то какой смысл выбирать, если рабочий каталог не показывает / не отражает изменения? Первоначально у меня был вопрос: как я могу увидеть изменения, сделанные кем-то другим, а затем решить, хочу ли я объединить их в свой рабочий каталог (т.е. поэкспериментировать с изменениями других людей, чтобы убедиться, что он не нарушает мою работу), но я все еще запутался как это сделать? Должен ли я просто исследовать и экспериментировать / исследовать, и если это было проблематично, сделать полный сброс?
28
Fetch vs Pull
Git fetch просто обновляет данные репо, но git pull в основном выполняет выборку, а затем объединяет ветвь
Объединение объединяет две линии развития, сохраняя при этом историю каждого коммита.
Напротив, перебазирование объединяет линии разработки, перезаписывая изменения из ветви-источника, чтобы они выглядели как дочерние элементы ветви-назначения, фактически делая вид, что эти коммиты были записаны поверх ветви-назначения все время.
Кроме того, ознакомьтесь с 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это более уместно. Для более подробной информации обязательно ознакомьтесь с этой статьей слияния или перебазирования .
Ответы:
получить против тяги
fetch
загрузит любые изменения из удаленной * ветки, обновит данные вашего хранилища, но оставит локальную * ветку без изменений.pull
выполнитfetch
и дополнительно внесетmerge
изменения в ваше местное отделение.Какая разница?
pull
обновляет вашу локальную ветку с изменениями из вытащенной ветки. Аfetch
не продвигает ваше местное отделение.объединить против ребаз
Учитывая следующую историю:
merge
объединяет две истории развития вместе. Он делает это путем воспроизведения изменений, произошедших в вашей локальной ветви после того, как они разошлись в верхней части удаленной ветви, и записывает результат в новом коммите. Эта операция сохраняет родословную каждого коммита.Эффект
merge
будет:rebase
примет коммиты, которые существуют в вашей локальной ветке, и повторно применяет их поверх удаленной ветки. Эта операция перезаписывает предков ваших локальных коммитов.Эффект
rebase
будет:Какая разница? А
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:
будет извлекать удаленные изменения и затем перезагружать вместо слияния. Т.е. он будет воспроизводить все ваши локальные коммиты с того момента, когда вы в последний раз выполняли пулл. Я считаю, что это намного чище, чем обычное вытягивание со слиянием, которое создаст дополнительный коммит с слияниями.
источник
Merge - ветка HEAD сгенерирует новый коммит, сохранив происхождение каждой истории коммитов. История может стать загрязненной, если коммиты слияния сделаны несколькими людьми, которые работают в одной ветви параллельно.
Rebase - перезаписывает изменения одной ветви на другую без создания нового коммита. История кода упрощена, линейна и читаема, но она не работает с запросами по запросу, потому что вы не видите, какие незначительные изменения кто-то сделал.
Я бы использовал
git merge
при работе с функциональным процессом или если я не знаком с rebase. Но, если я хочу более чистой, линейной истории, тоgit rebase
это более уместно. Для более подробной информации обязательно ознакомьтесь с этой статьей слияния или перебазирования .источник