git pull VS git fetch Vs git rebase


294

Ще одне сказане питання - git pullце як git fetch+ git merge.

Але в чому різниця між git pullVS git fetch+ git rebase?


2
хтось повинен зачистити посилання ... і я дивуюсь, скільки голосів отримало інше питання.
ксенотерацид

13
@xeno: Я думаю, що це лише підрахунок, скільки людей йде "У мене теж було це питання"
bobobobo

45
Якось я знайду час, щоб по-справжньому прочитати документацію по git, але до цього часу я додаю свої голоси до таких питань
Еран Медан

Відповіді:


336

З вашого запитання повинно бути досить очевидно, що ви насправді просто запитуєте про різницю між git mergeі git rebase.

Отже, припустимо, що ви є загальним випадком - ви виконали якусь роботу над своєю майстерною галуззю, і ви потягнули з походження, що також виконало певну роботу. Після вибору все виглядає приблизно так:

- o - o - o - H - A - B - C (master)
               \
                P - Q - R (origin/master)

Якщо ви з’єднаєтесь у цей момент (поведінка за замовчуванням git pull), припускаючи, що немає конфліктів, ви закінчите це:

- o - o - o - H - A - B - C - X (master)
               \             /
                P - Q - R --- (origin/master)

Якщо ви, з іншого боку, зробили відповідну базу даних, закінчите це:

- o - o - o - H - P - Q - R - A' - B' - C' (master)
                          |
                          (origin/master)

Вміст вашого робочого дерева повинен закінчуватися однаковим в обох випадках; ви щойно створили іншу історію, яка веде до неї . Ребаза переписує вашу історію, роблячи вигляд так, ніби ви здійснили поверх нової основної гілки походження ( R), а не там, де ви спочатку здійснили ( H). Ніколи не слід використовувати підхід до ребазування, якщо хтось уже вийшов з вашої гілки.

Нарешті, зауважте, що ви можете фактично налаштувати git pullдля даної гілки використовувати ребазу замість злиття, встановивши параметр config branch.<name>.rebaseна значення true. Ви також можете зробити це за один потяг, використовуючи git pull --rebase.


39
Що станеться, якщо ви переобладнаєтесь після того, як хтось уже вийшов з вашої гілки? Це зламає репо?
Дідьє А.

12
Звідки ви знаєте, чи хтось витягнув з вашої ведучої гілки?
Френк

29
Якщо ви точно не знаєте, що хтось цього не зробив , слід припустити, що вони є.
Кріс Даун

4
Я просто думав, що, якщо ви також не підштовхуєте зміни десь крім походження / господаря, я не бачу жодного разу наткнутися на проблему, коли хтось інший потягнув про ці зміни, тому що якщо ви вже підштовхнули ці зміни до походження / господарю, не можна було б переобладнати в першу чергу. Мені здається, що попередження насправді має значення лише у випадках, коли у вас щось складніше, ніж X -> origin / X, але я можу помилитися. Якщо хтось знає про сценарій, який я переглядаю, будь ласка, поділіться.
neverfox

1
@SteveChambers Ні, це не результат. Рядки просто представляють походження родів, тобто A є батьком B. Немає жодних наслідків щодо того, чи Q чи B був першим за часом. Усі ці операції базуються на графіках фіксації, а не часу. База даних просто пересаджує деякі комісії, в результаті чого я показав, незалежно від того, які часові позначки виконуються.
Каскабель

9

TLDR:

git pullце як біг git fetchтоді git merge
git pull --rebase, як git fetchтодіgit rebase

У відповідь на ваше перше твердження,

git pullє як git fetch+ git merge.

"У режимі за замовчуванням git pull - це скорочення, за git fetchяким слідує git mergeFETCH_HEAD." Точніше, git pullпрацює git fetchз заданими параметрами, а потім закликає git mergeоб'єднати отримані голови гілок у поточну гілку "

(Посилання: https://git-scm.com/docs/git-pull )


Для вашої другої заяви / питання:

"Але яка різниця між git pullVS git fetch+ git rebase"

Знову з того ж джерела:
git pull --rebase

"З --rebase, він запускає git rebase замість git spajanje."


Тепер, якщо ви хочете запитати

'різниця між mergeі rebase'

на що відповіли і тут:
https://git-scm.com/book/en/v2/Git-Branching-Rebasing
(різниця між зміною способу запису історії версій)


2
Я хотів би зазначити, що "git pull --rebase" - це як "git fetch then git rebase" більшість часу - але не завжди. У деяких ситуаціях "git pull --rebase" робить трохи більше. Дивіться цей часто посилається приклад тут: gitolite.com/git-pull--rebase
Даніель К.

1
Дуже дякую за вашу відповідь. Я дійсно розумію спосіб git fetch + git rebaseроботи команд відтепер. Відтепер на нашому дереві git більше немає конфліктів :)
Travis Le
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.