При просмотре определенной фиксации в командной строке с помощью git show
может возникнуть неустранимая ошибка.
Например, вы можете получить ошибку bad object
локально:
$ git show 1095ff3d0153115e75b7bca2c09e5136845b5592
> fatal: bad object 1095ff3d0153115e75b7bca2c09e5136845b5592
Однако при просмотре фиксации на GitHub.comвы сможете увидеть его без каких-либо проблем:
github.com/ACCOUNT/REPOSITORY/commit/1095ff3d0153115e75b7bca2c09e5136845b5592
Существует несколько возможных объяснений:
- Локальный репозиторий устарел.
- Ветвь, содержащая фиксацию, была удалена, поэтому ссылка на фиксацию больше не существует.
- Кто-то выполнил отправку фиксации с параметром --force.
Локальный репозиторий устарел.
В локальном репозитории еще нет фиксации. Чтобы получить сведения из удаленного репозитория в локальный клон, используйте git fetch
:
git fetch REMOTE
Это позволит безопасно скопировать сведения из удаленного репозитория в локальный клон без внесения изменений в извлеченные файлы. Вы можете использовать git fetch upstream
для получения сведений из репозитория, который вы разветвили, или git fetch origin
, чтобы получить сведения из репозитория, который вы только клонировали.
Tip
Дополнительные сведения см. в статье об управлении удаленными и получением данных в книге Pro Git .
Ветвь, содержащая фиксацию, была удалена
Если участник совместной работы в репозитории удалил ветвь, содержащую фиксацию, или отправил фиксацию в ветвь с параметром --force, недостающая фиксация может быть потеряна (т. е. к ней невозможно будет перейти по ссылке), поэтому вы не сможете получить ее в локальный клон.
К счастью, если у участника совместной работы есть локальный клон репозитория с отсутствующей фиксацией, он может отправить ее обратно в GitHub. Необходимо убедиться, что на фиксацию ссылается локальная ветвь, а затем отправить ее как новую ветвь в GitHub.
Предположим, что у пользователя по-прежнему есть локальная ветвь (например, B
), которая содержит фиксацию. Она может отслеживать ветвь, которая была удалена или получила фиксацию с параметром --force, и эти изменения пока не поступили в локальную ветвь. Чтобы сохранить фиксацию, они могут отправить локальную ветвь в новую ветвь (например, recover-B
) на GitHub. В этом примере предположим, что у них есть удаленный репозиторий upstream
, через который у них есть доступ на отправку в github.com/ACCOUNT/REPOSITORY
.
Другой пользователь выполняет:
$ git branch recover-B B
# Create a new local branch referencing the commit
$ git push upstream B:recover-B
# Push local B to new upstream branch, creating new reference to commit
Теперь вы можете выполнить:
$ git fetch upstream recover-B
# Fetch commit into your local repository.
Избегание отправки с параметром --force
Избегайте отправки в репозиторий с параметром --force, если только в этом нет крайней необходимости. Особенно если у нескольких пользователей есть разрешение на отправку в репозиторий. Если кто-то выполняет отправку в репозиторий с параметром --force, эта операция может перезаписать фиксации, на которых другие пользователи основывают свою работу. Отправка с параметром --force меняет журнал репозитория и может привести к повреждению запросов на вытягивание.