Ваша ветвь опережает 'origin / branch' по X коммитам. Но не так ли? - PullRequest
0 голосов
/ 23 апреля 2020

Я знаю, что этот вопрос задавался много раз, и обычно я знаю, как его решить, но на этот раз я застрял в следующем сценарии.

Шаг 1

git status
On branch v2.1.10-af
Your branch is ahead of 'origin/v2.1.10-af' by 13 commits.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

Шаг 2

git push
Everything up-to-date

Шаг 3

git status
On branch v2.1.10-af
Your branch is up to date with 'origin/v2.1.10-af'.

nothing to commit, working tree clean

Шаг 4

git pull
From gitlab.com:username/repo
 * [new branch]      v2.1.10-AF -> origin/v2.1.10-AF
Already up to date.

и снова ...

git status
On branch v2.1.10-af
Your branch is ahead of 'origin/v2.1.10-af' by 13 commits.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

и так далее в бесконечном l oop из шага 2.

Я также пытался удалить и восстановить локальное репо

git branch -D v2.1.10-af
git checkout -t origin/v2.1.10-af

, но после вытягивания я всегда получаю Your branch is ahead of 'origin/v2.1.10-af' by 13 commits.

1 Ответ

4 голосов
/ 23 апреля 2020

Это определенно немного странно. Я думаю, что проблема здесь чувствительна к регистру:

Когда вы запускаете git pull и он запускает git fetch, вы получаете это как одну из строк вывода:

 * [new branch]      v2.1.10-AF -> origin/v2.1.10-AF

Запуск git status, однако, говорит:

Your branch is up to date with 'origin/v2.1.10-af'.

Обратите внимание, что для вывода fetch используется верхний регистр: origin/v2.1.10-AF. Вывод status использует строчные буквы: origin/v2.1.10-af.

К Git, это два совершенно разных имени, а Git сохраняет некоторые из этих данных в вашем хранилище как текстовые строки внутри обычных текстовых файлов, где они остаются под разными именами. Но Git хранит некоторые другие данные об именах филиалов и именах удаленного отслеживания в именах файлов , которые хранятся в вашей операционной системе.

На вашем компьютере , файл с именем .git/refs/remotes/origin/v2.1.10-AF - это тот же файл , что и файл с именем .git/refs/remotes/origin/v2.1.10-af, хотя один из них является прописным, а другой - строчным.

Проблема в другом Другими словами, Git считает, что это разные имена (и они различаются на Linux машинах, таких как сервер GitHub), но ваша ОС иногда настаивает на том, что они имеют одно и то же имя .

Ваш git push имеет сервер GitHub, создающий или обновляющий имя в нижнем регистре v2.1.10-af. Это оставляет заглавное имя, v2.1.10-AF, 13 коммитов позади. Pu sh теперь завершен, и все на GitHub обновлено.

Затем ваш pull получает оба имени - v2.1.10-af и v2.1.10-AF - и сохраняет два разных коммита sh Идентификаторы под этими двумя именами, но ваша ОС настаивает на том, что они то же самое имя. Старое значение v2.1.10-AF в верхнем регистре перезаписывает правильное, и git status неожиданно говорит, что вы снова делаете коммит на 13.

Чтобы убедиться, что это так, используйте веб-интерфейс GitHub (или аналогичный) для просмотра GitHub и посмотри, какие у тебя имена. Пожалуйста, сделайте это сначала!

Решение состоит в том, чтобы изменить имена и / или избегать смешивания прописных и строчных букв. Например, вы можете использовать только строчные буквы, указав серверу GitHub удалить имя в верхнем регистре:

git push --delete origin v2.1.10-AF

или удалив вариант в верхнем регистре через веб-интерфейс. Теперь у GitHub будет только строчный вариант. Затем, в вашем собственном репозитории, введите go и найдите любые варианты имени в верхнем регистре в .git/refs/remotes/origin и удалите или переименуйте их в варианты в нижнем регистре (удаление их полностью безопасно, поскольку git fetch создаст их заново, если это необходимо).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...