В git как получается выборка, отличная от pull, и как слияние отличается от rebase?

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

  • git fetch vs pull
  • git merge vs rebase

Ответ 1

выборка vs pull

fetch будет загружать любые изменения из ветки удаленного *, обновляя данные вашего репозитория, но оставляя вашу локальную ветвь * неизменной.

pull выполнит fetch и дополнительно merge изменения в вашей локальной ветки.

Какая разница? pull обновляет локальную ветвь с изменениями от вытащенной ветки. A fetch не продвигает вашу локальную ветвь.

merge vs rebase

Учитывая следующую историю:

          C---D---E local
         /
    A---B---F---G remote

merge объединяет две истории развития вместе. Это происходит путем повторения изменений, произошедших на вашей локальной ветке после того, как они расходятся поверх удаленной ветки и записывают результат в новую фиксацию. Эта операция сохраняет родословную каждой фиксации.

Эффект a merge будет:

          C---D---E local
         /         \
    A---B---F---G---H remote

rebase возьмет коммиты, которые существуют в вашей локальной ветки, и повторно примените их поверх удаленной ветки. Эта операция перезаписывает предков ваших локальных коммитов.

Эффект a rebase будет:

                  C'--D'--E' local
                 /
    A---B---F---G remote

Какая разница? A merge не изменяет родословную коммитов. A rebase переписывает родословную ваших локальных коммитов.

* В этом объяснении предполагается, что текущая ветвь является локальной ветвью, а ветвь, указанная как аргумент fetch, pull, merge или rebase, является удаленной ветвью. Это обычный случай. pull, например, загрузит любые изменения из указанной ветки, обновит ваш репозиторий и merge изменения в текущую ветку.

Ответ 2

Fetch vs Pull

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

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


Слияние с Rebase

из Atlassian SourceTree Blog, Объединить или перезагрузить:

Слияние объединяет две линии развития, сохраняя при этом предки каждой истории фиксации.

В отличие от этого, rebasing унифицирует линии развития путем повторной записи изменения из ветки источника, чтобы они отображались как дети из пункт назначения - эффективно притворяется, что эти написанное сверху ветки назначения.

Кроме того, проверьте Изучите git Ветвление, которое является хорошей игрой, только что отправленной в HackerNews (ссылка на сообщение) и учит много разветвлений и слияния. Я считаю, что это будет очень полезно в этом вопросе.

Ответ 3

pull vs fetch:

То, как я это понимаю, заключается в том, что git pull - это просто git fetch, за которым следует git merge. То есть вы извлекаете изменения из удаленной ветки, а затем объединяете их в текущую ветвь.


merge vs rebase:

Слияние будет выполняться по команде; объединить различия между текущей ветвью и указанной ветвью (в текущую ветку). То есть команда git merge another_branch будет слить another_branch в текущую ветку.

Ребаза работает немного по-другому и выглядит круто. Скажем, вы выполняете команду git rebase another_branch. Git сначала найдет последнюю общую версию между текущей ветвью и another_branch. То есть точка до разветвления ветвей. Затем Git переместит эту расходящуюся точку на головку another_branch. Наконец, все коммиты в текущей ветке, начиная с исходной расходящейся точки, воспроизводятся из новой расходящейся точки. Это создает очень чистую историю, с меньшим количеством ветвей и слияниями.

Однако, это не без ловушек! Поскольку история версий "перезаписана", вы должны сделать это, только если коммиты существуют только в локальном репозитории Git. То есть: никогда не делайте этого, если вы переместили коммиты на удаленное репо.

Объяснение по переустановке в этой онлайн-книге неплохое, с легко понятными иллюстрациями.


вытащить с перезагрузкой вместо слияния

Я использую rebase довольно много, но обычно он в сочетании с pull:

git pull --rebase

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