Подтвердить что ты не робот

Разница между git слияние начала/ведущего и git pull

Я работаю в местном филиале "BDD-local" и хотел бы получить изменения от других разработчиков. Другие разработчики используют свою собственную ветку, и как только они довольны модульными тестами, они нажимают изменения на дистанционное репо (origin/master).

Я проходил несколько сообщений здесь и получал противоречивую информацию. Мало кто говорит об использовании:

git fetch origin
git merge origin/master

Некоторые думают, что "git pull" должен получить изменения.

Один из наших разработчиков попросил использовать git merge origin/master 'без git fetch'

Кто-нибудь знает, какой из этих вариантов лучше. Я попробовал "git pull" на моей локальной ветке, но он, похоже, не работал. Но если я делаю "git pull" на локальном хозяине, он отлично работает (однако я хочу, чтобы он работал для локальной ветки)

4b9b3361

Ответ 1

извлечение, слияние и растяжка

git fetch и git merge origin/master будут извлекать и интегрировать удаленные изменения. Позвольте мне объяснить общий сценарий. origin/master находится на C. Кто-то нажал D. Вы работали над E и F. Обратите внимание, что вы не увидите D в своем локальном репозитории, пока не запустите git fetch.

   origin/master
    v
A-B-C-E-F < master
     \
     (D) < master on remote

Теперь вы запустите git fetch. Теперь вы можете видеть D, а origin/master обновляется в соответствии с удаленным репозиторием, который он отслеживает.

A-B-C-E-F < master
     \
      D < origin/master, master on remote

Теперь вы запустите git merge, предоставив вам следующее:

A-B-C-E-F
     \   \
      D---G < master
      ^
    origin/master, master on remote

Итак, теперь вы интегрировали свои изменения в master (E, F) с новыми коммитами на origin/master (D).

git pull является просто ярлыком для вышеуказанных шагов.

git слияние без выборки

Выполнение git merge origin/master без git fetch бессмысленно. Без git fetch ваш локальный репозиторий не знает о каких-либо потенциальных изменениях в удаленном репозитории, а исходный/мастер не будет перемещен. Таким образом, вы находитесь в этом состоянии, где D находится только на пульте дистанционного управления и не отображается локально:

   origin/master
    v
A-B-C-E-F < master
     \
     (D) < master on remote

Поскольку ваш локальный репозиторий не имеет D, a git merge origin/master просто даст:

Already up-to-date.

Так как, насколько ваш локальный репозиторий, мастер уже имеет все в оригинале /master.

Что лучше?

Ничего из перечисленного.:)

git fetch
git rebase origin/master master

или ярлык git pull -r, но лично я предпочитаю видеть изменения до того, как переустановить.
Это приведет к повторному изменению ваших изменений на главном (E, F) поверх начала/хозяина (D) без фиксации слияния. Это дает:

A-B-C-D-E'-F' < master
      ^
   origin/master, master on remote

Обратите внимание, что все в одной строке, вы готовы нажать, а история не похожа на браслет дружбы.

Одно предупреждение - никогда не переустанавливайте какие-либо коммиты, которые уже были нажаты. Обратите внимание, что E и F стали E 'и F' после перезагрузки. Коммиты полностью переписаны, с новым SHA и всем остальным. Если вы перезагружаете коммиты, которые уже являются общедоступными, разработчики будут переиздавать свою историю для них, когда они будут тянуть. И это ужасно, и каждый даст вам злые глаза и избежит вас.

Ответ 2

git pull совпадает с git fetch + git merge

Команда

git pull <remote> <branch>

действительно так же, как

git fetch <remote>
git merge <remote>/<branch>

Таким образом, нет никакой практической разницы между

git pull origin master

и

git fetch origin
git merge origin/master

Документация

Как указано в официальной документации ядра Linux git pull :

В режиме по умолчанию git pull является сокращением для git fetch, за которым следует git merge FETCH_HEAD.

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

Рекомендуемое чтение

Ответ 3

A git pull будет запускать a git fetch, а затем a git merge. Если вы хотите довести свой локальный репозиторий до скорости с удаленным репозиторием, это то, что вы могли бы запустить.

A git fetch собирается импортировать фиксации из удаленного репо без их слияния, что дает вам возможность просмотреть их перед интеграцией.