Вчера я клонировал репозиторий Git (размещенный на экземпляре GitLab). HEAD был каким-то коммитом (26337128
). Сегодня я сделал git pull
, но этот коммит больше не отображается в журнале (git log | grep 26337128
и git branch -a --contains 26337128
оба ничего не дают). Почему?
Обратите внимание, что коммит по-прежнему виден с помощью git show 26337128
(и в веб-интерфейсе GitLab), я не делал никаких локальных изменений и все еще нахожусь в ветке по умолчанию.
Обновлено:
Вот вывод git reflog --all
, но я не знаю, как его интерпретировать:
8d0f83b389ec (HEAD -> drm-tip, origin/drm-tip, origin/HEAD) refs/heads/drm-tip@{0}: pull (finish): refs/heads/drm-tip onto 8d0f83b389ec64b9f7f9b2ee241fc352346868f1
8d0f83b389ec (HEAD -> drm-tip, origin/drm-tip, origin/HEAD) HEAD@{0}: pull (finish): returning to refs/heads/drm-tip
8d0f83b389ec (HEAD -> drm-tip, origin/drm-tip, origin/HEAD) HEAD@{1}: pull (start): checkout 8d0f83b389ec64b9f7f9b2ee241fc352346868f1
8d0f83b389ec (HEAD -> drm-tip, origin/drm-tip, origin/HEAD) refs/remotes/origin/drm-tip@{0}: pull: forced-update
26337128da9b refs/heads/drm-tip@{1}: clone: from https://gitlab.freedesktop.org/drm/tip
26337128da9b refs/remotes/origin/HEAD@{0}: clone: from https://gitlab.freedesktop.org/drm/tip
26337128da9b HEAD@{2}: clone: from https://gitlab.freedesktop.org/drm/tip
Трудно сказать. Возможно, ваш коммит уже был в исходной версии (светлые умы исправляют те же ошибки). Вам придется копать глубже (посмотрите на ветки, например, с помощью gitk).
Если вам все еще нужен этот коммит или вы хотите понять, как была изменена история, вы можете проверить журнал обновлений с помощью git reflog, чтобы увидеть, какие изменения произошли в репозитории.
Коммит, о котором вы спрашиваете, присутствует в вашем локальном репозитории; он указан в трех нижних строках рефлога.
Что касается того, что произошло: ну, было бы полезнее, если бы вы сказали git reflog --date iso
, чтобы мы могли видеть, сколько времени прошло между вашими действиями; но, судя по рефлогу и небольшим подсказкам, которые вы нам дали, очевидно, между вашим вчерашним клоном и сегодняшним извлечением кто-то выполнил принудительное нажатие (обратите внимание на «pull: принудительное обновление») — и поэтому 26337128
был вырван переписанной ветки.
Конечно, люди не должны делать подобные вещи (принудительно отправлять в общую ветку). Но, очевидно, ваш пульт gitlab не настроен для предотвращения этого.
В любом случае, этот коммит у вас все еще есть, если вы этого хотите (на данный момент). Поскольку его больше нет ни в одной ветке, в конечном итоге он будет удален сборщиком мусора, если вы его не закрепите. На данный момент сам рефлог сохраняет фиксацию.
Хорошо, проблема объясняется принудительным нажатием, но я думал, что это категорически не рекомендуется (т. е. никогда не используется, за исключением исключительных причин, таких как юридические вопросы). Более того, о вынужденном толчке командование git pull
даже не предупредило. Настолько плохой дизайн. И тот факт, что удаленный коммит может быть подвергнут сборке мусора, тоже плох (например, если кто-то хочет воспроизвести проблему с соответствующим состоянием исходного кода).
«принудительный толчок объясняет проблему, но я думал, что это категорически не рекомендуется» Да, именно это я сказал в своем ответе. Предполагается, что один из них будет предупреждать всех остальных пользователей (вручную) при принудительном нажатии на общую ветку. Кто-то повел себя плохо.
Я не могу вдаваться в подробности, не видя результата git log --all --graph --oneline --decorate
. Мой ответ, как я уже сказал, основан на очень малой информации, которую вы предоставили. Возможно, вы захотите проконсультироваться по адресу stackoverflow.com/questions/12063345/…, где ваш вопрос, возможно, является дубликатом.
Что ж, выходные данные git log --all --graph --oneline --decorate
имеют 1581190 строк, так что это, вероятно, слишком велико, чтобы их предоставить. Но 26337128
не может быть найден в выводе.
При поиске я не увидел stackoverflow.com/questions/12063345/… в названии которого даже не упоминается git pull
(поэтому он не был найден в поиске). Кстати, в этом вопросе упоминается «принудительное обновление», которого я не видел. Но, глядя на ответ, текст «принудительного обновления» просто появляется в середине подробного вывода, поэтому едва заметен.
Извините, я имел в виду «принудительное обновление», которое должно появиться с git pull
(как упоминалось в другом вопросе). Я не видел этого текста. Для чего-то, что люди не должны делать, я бы ожидал какого-то выделенного текста и даже сбоя без возможности принимать принудительные обновления (Как отклонить принудительное обновление GIT на стороне клиента при выполнении git fetch или git тянуть? могло быть решением, но это не глобально и не по умолчанию).
Поскольку я был очень удивлен, я просто хочу знать, что произошло. Я добавил полный вывод рефлога.