Я просто заметил что-то странное git pull
, чего я не понимаю.
В пятницу я работал в местном филиале. давай назовем это mybranch
. Перед тем как покинуть кабинет , я толкнул его происхождение (который является моим GitHub репо) git push origin mybranch
.
Вчера дома я pull
прикрепил свою ветку к ноутбуку, сделал еще немного кода, а затем отправил свои изменения обратно в github (origin).
Теперь я снова на работе и попытался перенести вчерашние изменения на свою рабочую машину (я ничего не менял в локальном репозитории моего рабочего места за выходные):
git pull origin mybranch
это вызвало быстрое слияние вперед, и это нормально. Затем я сделал git status
, и он сказал:
# On branch mybranch
# Your branch is ahead of 'origin/mybranch' by 6 commits.
#
nothing to commit (working directory clean)
А? Как это может быть 6 коммитов вперед, если я даже не трогал их на выходных, а просто вытащил из источника? Итак, я запустил, git diff origin/mybranch
и отличия были именно теми 6 изменениями, которые я только что извлек с пульта.
Я мог только "исправить" это, запустив git fetch origin
:
From git@github.com:me/project
af8be00..88b0738 mybranch -> origin/mybranch
Судя по всему, в моем локальном репозитории отсутствовали некоторые ссылочные объекты, но как это могло быть? Я имею в виду, что pull уже выполняет выборку, и я не работал ни над чем, кроме этой ветки, поэтому a git fetch origin
и git fetch origin mybranch
должны иметь тот же результат?
Всегда ли использовать git pull origin
вместо git pull origin branchname
?
Я в замешательстве.
источник
git push
также, кажется, решает эту проблему (сообщение «все в актуальном состоянии»).git config --get-regexp br.*
может сказать вам, есть ли в вашей конфигурации локальная ветка, отслеживающая другую веткуgit config branch.master.remote yourGitHubRepo.git
свой workRepo и проверить (на следующемgit pull origin
), остается ли статус с предупреждением «впереди»?git remote show origin
показывает мне, что происхождение указывает на мой репозиторий GitHub, так что, думаю, все в порядке?Your branch is ahead
" предупреждающего сообщения после ""git pull
, вам нужно сначала также определить удаленное имя для ветви . Отсюда мое предложение: введитеgit config branch.master.remote yourGitHubRepo.git
, затем попробуйте agit pull
и agit status
и посмотрите, сохраняется ли проблема.Ответы:
git pull
вызываетgit fetch
с соответствующими параметрами перед объединением явно выбранных голов (или, если ни одна, удаленная ветвь, настроенная для слияния) в текущую ветвь.Синтаксис:
git fetch <repository> <ref>
где<ref>
просто имя ветки без двоеточия - это «одноразовая» выборка, которая не выполняет стандартную выборку всех отслеживаемых ветвей указанного пульта дистанционного управления, а вместо этого извлекает только названную ветвьFETCH_HEAD
.Обновление: для версий Git, начиная с 1.8.4, если есть ветка удаленного отслеживания, которая отслеживает ссылку, которую вы просили получить, теперь ветка отслеживания будет обновляться
fetch
. Это изменение было сделано специально, чтобы избежать путаницы, вызванной предыдущим поведением.Когда вы выполняете
git pull <repository> <ref>
,FETCH_HEAD
обновляется, как указано выше, а затем объединяется с извлеченными,HEAD
но ни одна из стандартных ветвей отслеживания для удаленного репозитория не будет обновлена (Git <1.8.4). Это означает, что локально похоже, что вы опережаете удаленную ветку, тогда как на самом деле вы в курсе последних событий.Лично я всегда делаю это
git fetch
,git merge <remote>/<branch>
потому что я вижу любые предупреждения о принудительных обновлениях перед слиянием, и я могу предварительно просмотреть то, что я сливаю. Если бы я использовалgit pull
немного больше, чем я, я бы сделал простойgit pull
без параметров большинство времени, опираясь наbranch.<branch>.remote
иbranch.<branch>.merge
«делать правильные вещи».источник
git fetch
послеgit pull <repository> <ref>
устранения проблемы, поскольку выборка обновит стандартные ветки отслеживания? Кроме того, спасибо за этот ответ, начинающийgit fetch
а затемgit merge origin/master master
.Что
git remote -v show
возвращается, когда дело доходит до происхождения?Если origin указывает на github, статус должен быть актуальным, а не перед удаленным репо. По крайней мере, с Git1.6.5 я использую для быстрого тестирования.
В любом случае, чтобы этого избежать, явно определите удаленное репо главной ветки:
затем a
git pull origin master
, за которымgit status
следует a, должен вернуть чистый статус (не впереди).Зачем? потому что мастер источника получения извлечения (включенный в мастер источника извлечения git) не будет просто обновлять
FETCH_HEAD
(как объясняет Чарльз Бейли в своем ответе ), но он также обновит «удаленную главную ветку» в вашем локальном репозитории Git.В этом случае ваш локальный мастер больше не будет «опережать» удаленного мастера.
Я могу проверить это с помощью git1.6.5:
Сначала я создаю рабочее репо:
Я имитирую репозиторий GitHub, создавая голое репо (которое может получать push отовсюду)
Я добавляю модификатор в свое рабочее репо, которое я нажимаю в репозиторий github (добавлен как удаленный)
Я создаю домашнее репо, клонированное GitHub, в котором я вношу пару модификаций, помещенных в GitHub:
Затем я клонирую workrepo для первого эксперимента
В этом репо в git status упоминается master geing перед '
origin
':Но это только
origin
не github:Но если я повторю последовательность в репо, который имеет происхождение от github (или вообще не имеет происхождения, просто определен удаленный github), статус будет чистым:
Если бы я только
origin
указалgithub
,status
было бы чисто для git1.6.5.Это может быть с предупреждением «впереди» для более раннего git, но в любом случае,
git config branch.master.remote yourGitHubRepo.git
явно определенный должен иметь возможность позаботиться об этом, даже с ранними версиями Git.источник
git remote show origin
.Осторожно ли вы добавляете весь свой пульт (кроме того,
origin
который идет с вашим исходным клоном), используяgit remote add NAME URL
? Я видел эту ошибку, когда они только что добавлялись в конфигурацию git.источник
git checkout -b mybranch origin/mybranch
. Согласно странице руководства git-branch, origin / mybranch является начальной точкой, и, кроме того, в нем указано для --track: "... Используйте это, если вы всегда переходите из одной и той же восходящей ветки в новую ветвь, и если вы не хотите явно использовать «git pull <repository> <refspec>». Это поведение по умолчанию, когда начальная точка является удаленной ветвью ».