git pull origin master не обновляет origin / master? - PullRequest
36 голосов
/ 31 декабря 2011

Согласно документации, git pull выполняет git fetch , а затем git merge, однако в этом случае выполнение master источника 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 и не увидел ничего такого, что подсказывало бы это, но, возможно, я пропустил это.

Ответы [ 2 ]

29 голосов
/ 01 января 2012

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

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

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

Объединить в текущую ветку удаленную ветку следующим:

$ git pull origin next

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

$ git fetch origin
$ git merge origin/next
0 голосов
/ 31 мая 2019

кажется, что вы разветвили репозиторий, и ваша разветвленная ветка не обновлена ​​с последним кодом

...