Вилка синхронизации с восходящим потоком: git fetch + git checkout + git merge vs. git checkout + git pull

В документации по адресу Github-Help: Syncing a Fork показаны три команды, которые необходимо сохранить. мой форк GitHub синхронизирован с исходным репозиторием.

git fetch upstream
git checkout master
git merge upstream/master

Могу ли я использовать следующие две команды вместо трех предыдущих?

git checkout master
git pull upstream/master

Являются ли два набора команд эквивалентными или между ними есть различия?


person Lone Learner    schedule 15.11.2016    source источник
comment
git pull = git fetch + git merge, по крайней мере, вообще   -  person Tim Biegeleisen    schedule 15.11.2016
comment
К вашему сведению: git pull upstream/master неверно, так как третье слово (upstream/master) должно быть именем удаленного, а upstream/master — именем ветки удаленного отслеживания. Git, к сожалению, использует очень похожие слова, которые означают очень разные (хотя и связанные) вещи: слово branch имеет по крайней мере два значения, слово remote само по себе имеет одно значение, а Фраза ветка удаленного отслеживания имеет еще одну.   -  person torek    schedule 15.11.2016
comment
Второй набор работает, если вы клонировали с помощью git clone -o upstream или извлекали upstream хотя бы один раз. Обратите внимание, что если вы клонировали, ваша основная ветка, вероятно, уже отслеживает upstream/master, и в этом случае git pull достаточно. Git настраивает все за вас. Однако, если вы создали локальную копию с нуля (git init) и добавили удаленную после (git remote add upstream <url>), вам необходимо указать upstream/master, если только вы не настроили отслеживание самостоятельно (git branch --set-upstream-to upstream/master).   -  person Fabien Bouleau    schedule 04.10.2017


Ответы (1)


Эти наборы команд не эквивалентны.

git pull

делится на две команды:

git fetch
git merge

Проблема в том, что для git fetch требуется удаленная ссылка, а для git merge требуется ссылка для отслеживания, поэтому на странице справки Github есть:

git fetch upstream

но у него есть

git merge upstream/master

Команда слияния возьмет ветку upstream/master и объединит ее с текущей проверенной веткой (в данном случае «мастер»). Но команда fetch не работает в ветке, для нее требуется удаленный доступ, поэтому при попытке:

git pull upstream/master

Git разделяет это на:

git fetch upstream/master
git merge upstream/master

который потерпит неудачу при выборке:

$ git pull upstream/master
fatal: 'upstream/master' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
person LightCC    schedule 04.10.2017
comment
Примечание: git pull upstream/master работает, если вы сделали git fetch upstream хотя бы один раз: upstream/master ссылается на локальную копию удаленной ветки, а не на копию на удаленном сервере. - person Fabien Bouleau; 04.10.2017
comment
@FabienBouleau Это неправильно в моей системе. И выборка, и вытягивание завершаются ошибкой с использованием upstream/master, даже если он уже присутствует. Fetch нужна удаленная ссылка, а не ссылка на ветку. Возможно, если вы добавили имя upstream/master в качестве удаленного с тем же URL/папкой, что и у upstream, или с некоторыми другими изменениями конфигурации, но не по умолчанию, по крайней мере, когда upstream является вторичным удаленным (т. е. источник добавляется первым). - person LightCC; 04.10.2017
comment
Плохо, нотация upstream/master в этом случае неверна. Должно быть git pull upstream master или git fetch upstream master. И при первой загрузке удаленного репозитория он должен быть git fetch upstream (без master), иначе информация о ветке удаленного отслеживания не будет установлена ​​(только FETCH_HEAD). Используйте upstream/master только для ссылки на ветку удаленного отслеживания, когда она существует. - person Fabien Bouleau; 04.10.2017