Git pull изначальный хозяин не обновляет происхождение/мастер?

В соответствии с документацией git pull выполняет git fetch, затем слияние git, однако в этом случае выполнение git pull начальный мастер должен выполнить git fetch главный хозяин. Однако, похоже, это не так. Вот пример.

Предположим, что мой мастер удаленного происхождения (на GitHub в моем случае) имеет следующую историю:

commit 1111111 : my first commit
commit 2222222 : a commit from someone else

и у меня есть только первая локальная локация, как показано ниже:

git checkout master
git log --pretty=format:'%h' -n 1
1111111

git checkout origin/master
git log --pretty=format:'%h' -n 1
1111111

Отсюда я делаю свою попытку и смотрю на результаты следующим образом:

git checkout master
git pull origin master

git log --pretty=format:'%h' -n 1
2222222

git checkout origin/master
git log --pretty=format:'%h' -n 1
1111111

Как видно, притяжение фактически обновило мою ведущую ветвь с новыми фиксациями (s) от удаленного источника, но мой локальный источник/мастер все еще там, где он был. Заставляя меня сделать следующее

git fetch origin master

git checkout origin/master
git log --pretty=format:'%h' -n 1
2222222

Является ли это правильным поведением для git pull или я могу настроить что-то пропущенное? Я просмотрел страницу git pull man и не видел ничего, что предлагало это, но я, возможно, пропустил это.

36
задан Kenneth Baltrinic 31 дек. '12 в 18:58
источник поделиться

1 ответ

Это немного странно, но если вы используете git pull [remote] <refspec>, он фактически не обновляет удаленные ссылки. Это имеет смысл, если вы думаете об этом определенным образом: поскольку вы указываете конкретный рефлектор для извлечения, ему не нужно искать что-либо о ваших удаленных ветвях, поэтому он по сути не знает, что такое удаленная ветвь должен обновляться. Это, конечно, могло бы понять это, и я не удивлюсь, если он будет исправлен в конце концов, но это существующее поведение. (В нем могут быть сообщения в списке рассылки - я не знаю.)

Вы можете легко обойти это. Если вы используете git pull origin/master, так как вы указываете, что выбрать через удаленный филиал, он должен обновить эту удаленную ветку. И если вы все равно находитесь в своей главной ветке (или в любом другом направлении отслеживания происхождения/мастера), вы можете просто сделать git pull и позволить ему заполнить значения по умолчанию и обновить удаленные ветки.

Это задокументировано на странице git-pull man, наиболее сжатой в разделе ПРИМЕРЫ, но также и в другом месте. Соответствующая часть:

Слейте в текущую ветку следующую ветку:

$ git pull origin next

Это временно сохраняет копию следующего файла FETCH_HEAD, но не обновляет ветки удаленного отслеживания. Используя ветки удаленного отслеживания, то же самое можно сделать, вызвав выборку и слияние:

$ git fetch origin
$ git merge origin/next
28
ответ дан Jefromi 01 янв. '12 в 1:02
источник поделиться

Другие вопросы по меткам