Я просто не можу це зрозуміти. Я багато читав в Інтернеті та книгах, і щось просто не залишається в моїй голові. Може хтось, будь ласка, подарує мені манекенову версію наступного:
- git fetch vs pull
- git merge vs rebase
Я просто не можу це зрозуміти. Я багато читав в Інтернеті та книгах, і щось просто не залишається в моїй голові. Може хтось, будь ласка, подарує мені манекенову версію наступного:
Відповіді:
fetch
буде завантажувати будь-які зміни з віддаленої гілки *, оновлюючи ваші дані сховища, але залишаючи вашу локальну * гілку незмінною.
pull
виконає зміни fetch
та додатково merge
зміни у вашому місцевому відділенні.
Яка різниця? pull
оновлює локальну філію зі змінами на витягнутому відділенні. A 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
зміни в поточну гілку.
Витягнути проти тягнути
Git fetch просто оновлює ваші дані репо, але витягнення git в основному виконує отримання, а потім об'єднає витягнуту гілку
Яка різниця між "git pull" та "git fetch"?
Злиття проти Rebase
з блогу Atlassian SourceTree Blog, Merge або Rebase :
Об'єднання об'єднує дві лінії розвитку разом із збереженням походження кожної історії комісій.
На відміну від цього, rebasing уніфікує лінії розвитку шляхом повторного запису змін із вихідної гілки, щоб вони з'явилися як діти гілки призначення, фактично роблячи вигляд, що ці комісії були написані на верхній частині гілки призначення.
Крім того, ознайомтеся з Learn Git Branching - це приємна гра, яка щойно була розміщена на HackerNews ( посилання на пост ) та вчить багато хитрощів із розгалуження та злиття. Я вірю, що це буде дуже корисно в цій справі.
git merge <remote>/<branch>
. наприклад, якщо ви є головним відділенням, а ваш пульт називається походженням, ви можете це зробити git merge origin/master
.
тягнути проти отримання :
Те, як я це розумію, - git pull
це просто git fetch
слідування git merge
. Тобто ви отримуєте зміни з віддаленої гілки, а потім об'єднуєте їх у поточну гілку.
злиття та відновлення :
Злиття зробить так, як каже команда; об'єднати відмінності між поточною гілкою та вказаною гілкою (у поточну гілку). Тобто команда git merge another_branch
злиється another_branch
в поточну гілку.
Ребазація працює трохи інакше і є якось крутим. Скажімо, ви виконуєте команду git rebase another_branch
. Git спочатку знайде останню поширену версію між поточною гілкою та another_branch
. Тобто точка до того, як гілки розійшлися. Тоді git перемістить цю розбіжну точку на голову another_branch
. Нарешті, всі коміти в поточній гілці, оскільки початкова розбіжна точка відтворюється з нової розбіжної точки. Це створює дуже чисту історію, з меншою кількістю гілок і злиття.
Однак не обійшлося без підводних каменів! Оскільки історія версій "переписана", ви повинні робити це лише в тому випадку, якщо комісії існують лише у вашому локальному git repo. Тобто: Ніколи цього не робіть, якщо ви перенесли комісії на віддалений репо.
Пояснення щодо перезапису, подане в цій онлайн-книзі, є досить хорошим, з легкими для розуміння ілюстраціями.
тягнути з відсіканням замість злиття
Я фактично використовую rebase досить багато, але зазвичай це в поєднанні з pull:
git pull --rebase
отримає віддалені зміни, а потім перезавантажить замість об'єднання. Тобто він відтворюватиме всі ваші місцеві комісії з останнього разу, коли ви здійснили тягнення. Я вважаю це набагато чистішим, ніж робити звичайне тягнення зі злиттям, що створить додатковий комітет зі злиттями.
Об'єднання - відділення HEAD створить нове зобов’язання, зберігаючи походження кожної історії комісій. Історія може забруднитись, якщо об'єднання комітетів здійснюються кількома людьми, які працюють в одній гілці паралельно.
Rebase - повторно записує зміни однієї гілки в іншу, не створюючи нового комітету. Історія коду спрощена, лінійна і читабельна, але вона не працює з запитами на тягу, тому що ви не бачите, які незначні зміни хтось зробив.
Я б використовував, git merge
коли маю справу з функціональним процесом на основі функцій або якщо я не знайомий з базою даних. Але, якщо я хочу більш чистої, лінійної історії, то git rebase
це більш доречно. Щоб отримати докладніші відомості, ознайомтесь із цією статтею про об'єднання чи перезавантаження .