Ок, с самого начала вы все делаете правильно. Я думаю, что комментарий, который вы добавили ранее, является довольно хорошим объяснением:
Проще говоря, "git pull" выполняет "git fetch" с последующим
"мерзавец слияния"
Вот как я об этом думаю. Таким образом, вам не нужно вызывать git fetch
после прямой линии вверх git pull
- но, я почти гарантирую вам, это прекрасно работает на всем, кроме ЗАКЛЮЧЕНИЯ master
.
В одном из связанных постов сказано удалить следующую строку:
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/* <--- Remove this
И это должно решить эту проблему - однако я не могу объяснить, почему это работает. Это очень сложно исследовать, но я думаю, что когда вы вызываете fetch
, ваш git config фактически указывает, что именно захватить. Когда вы запускаете pull
, я не уверен, что он считает, что master
синхронизирован.
Я могу гарантировать вам, что если вы сделаете это из другой ветки, не являющейся мастером, вы не увидите эту проблему. Надеюсь, один из git-гуру сможет подробно объяснить строку fetch
в конфигурации.
Кроме того, я бы порекомендовал выполнить следующую команду, которая устанавливает HEAD для удаленного репозитория, чтобы обеспечить его синхронизацию с локальным: git push -u origin master
Вот еще один интересный вопрос:
с трудом разбирается в git-fetch
Хорошо, я проверил это на одном из моих рабочих процессов и обнаружил следующее.
Когда вы выполняете git pull origin master
на удаленном сервере, в каталоге .git/
есть файл, который указывает, где находится ваш HEAD. Два файла для записи:
ORIG_HEAD
FETCH_HEAD
Вы заметите, что ваш FETCH_HEAD
правильный, но ORIG_HEAD
показывает старый коммит, следовательно, причина, по которой вы получаете Ahead by x
. Когда вы запустите git fetch
, вы на самом деле исправите ссылку в ORIG_HEAD
, и все вернется к норме. Я смотрю, как изменить строку fetch
в конфигурации, чтобы исправить это поведение.