Skip to main content

Фиксация существует в GitHub, но не в локальном клоне

Иногда фиксацию можно просматривать в GitHub, но она не будет существовать в локальном клоне репозитория.

При просмотре определенной фиксации в командной строке с помощью 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, чтобы получить сведения из репозитория, который вы только клонировали.

Совет. Дополнительные сведения см. в статье об управлении удаленными репозиториями и получением данных в книге 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 меняет журнал репозитория и может привести к повреждению запросов на вытягивание.

Дополнительные материалы