Подтвердить что ты не робот

HEAD отсоединен от источника/хозяина

Я только что проверил старый проект, чтобы исправить ошибку. git сообщает:

HEAD detached at origin/master

git status Сообщения У меня есть файл без следа:

<project name>.xcworkspace/xcshareddata/

Я хотел бы заняться исправлением ошибки, но я не уверен, что происходит. Если я попробую git checkout master, я получу:

error: The following untracked working tree files would be overwritten by checkout:
<project name>.xcworkspace/xcshareddata/

Можно ли просто удалить этот файл? Я на ветке master? Если нет, как мне добраться до него?

4b9b3361

Ответ 1

Как CommuSoft говорит, вы не на хозяине. Вы находитесь в режиме "отсоединенный HEAD" . Вы получаете это в любое время, когда вы явно проверяете то, что не является (локальным) именем ветки:

$ git checkout origin/master    # detach to remote branch

или если есть тег v1.7:

$ git checkout v1.7             # detach to tag

и вы можете даже явно отключиться при использовании имени локальной ветки:

$ git checkout --detach master  # forcibly detach

"Отключенная ГОЛОВА" означает, что вы не на ветке. Быть "на ветке" означает, что вы не используете отдельный режим HEAD. Да, этот довольно круговой; см. этот вопрос и его ответы для более подробной информации.

Что касается:

error: The following untracked working tree files would be overwritten ...

Когда вы получаете git checkout для перехода от одного коммита к другому, он выполняет две основные функции:

  • выберите, следует ли находиться в режиме "отсоединенный HEAD" и
  • перестройте дерево работы, чтобы оно соответствовало перемещенному-commit.

Шаг 2 - это проблема. Вы находитесь в фиксации, идентифицированной origin/master, и в этом коммите нет записи о файлах, с которыми в настоящее время жалуется файл git. Вы попросили переключиться на фиксацию, идентифицированную master, которая, очевидно, является другой фиксацией. 1 git видит, что в фиксации, идентифицированной master, есть некоторые (возможно, просто один) файлы с теми же именами, которые отличаются от файлов или каталогов, которые находятся в вашем рабочем дереве прямо сейчас.

Чтобы перейти от текущей фиксации к новой, git checkout должен удалить существующие файлы или каталоги и заменить их на те, которые были в новой фиксации, - те, к которым вы хотите переключиться. Если эти файлы или каталоги были отслежены в текущей фиксации, git будет рад удалить и заменить их по мере необходимости, так как git всегда может вернуть их для вас: просто вернитесь к этому старому фиксации, и там они, Но они не находятся в текущем, чтобы быть выключенным, от, совершать. Поэтому git сообщает вам: "Эй, если я сделаю этот переключатель, который вы попросили, я не могу гарантировать, что смогу восстановить эти файлы и/или каталоги".

Теперь вам решать, а не git, выяснить, что делать с этими файлами и/или каталогами. Основываясь на сообщении об ошибке, это каталог, 2 и переход на master приведет к тому, что этот каталог будет удален и заменен чем-то другим (возможно, другой каталог с некоторыми файлами в нем, возможно, просто файл). Вы:

  • хотите сохранить его/их?
  • если это так, вы хотите сохранить его/их в фиксации или просто переместить их в сторону?
  • или вы просто хотите сдуть их?

Чтобы сохранить их, либо зафиксировать их, либо отбросить их (например, переименовать их в путь, который не является частью рабочего дерева, или другому неподписанному имени, которое "безопаснее", что бы это ни было).

Чтобы просто удалить их, удалите их вручную или используйте git checkout -f (force), чтобы сделать git сделать это.

Поскольку вы сейчас не находитесь в ветке (находятся в режиме "отсоединенный HEAD" ), если вы хотите окончательно зафиксировать их в репозитории, вы можете использовать что-то вроде метода CommuSoft, добавленного во время написания этого сообщения. (Вы можете создать новую ветку в любое время, до или после выполнения "git commit".)

Вы также можете использовать git stash. git stash обманчиво сложный маленький script: он совершает коммиты, которые вообще не находятся в какой-либо ветки, которые впоследствии могут быть пересажены в ветвь. Использование его довольно просто и просто: вы просто запустите git stash save, и все ожидающие отслеживаемые изменения будут сохранены и очищены, или запустите git stash save -u, и все отложенные отслеживаемые изменения и незатрещенные файлы будут сохранены и очищены. Теперь они все безопасно безводят в репозитории, под фиксацией, хотя это не фиксация на ветке.

Нет единого правильного ответа, что делать здесь.


1 Очевидно, что это разные, потому что если вы уже были в коммите, то вы просите git переместиться, то либо файл будет в фиксации, и, следовательно, будет отслеживаться, или это будет not-in-the-commit и, следовательно, вы не просите git сжать его.

2 Это немного странно. Если я создам каталог, который будет скроен моим git checkout, и я делаю его пустым каталогом, git просто идет вперед и сжимает его. Здесь разница между master^ и master заключается в том, что перемещение вперед от master^ до master создает файл mxgroup.py (поэтому отключение его удаляет):

$ git checkout -q master^  # file goes away, now let mkdir...
$ mkdir mxgroup.py; git checkout -q master
$ file mxgroup.py
mxgroup.py: Python script, ASCII text executable

Однако, если у меня есть непустой каталог, я получаю другое сообщение об ошибке:

$ git checkout -q master^  # file goes away; mkdir and make file
$ mkdir mxgroup.py; touch mxgroup.py/file; git checkout -q master
error: Updating the following directories would lose untracked files in it:
    mxgroup.py

Aborting

Но это с git версией 2.0.2; возможно, более старые хиты не так умны.

Ответ 2

Нет, вы не на ведущей ветке, а на какой-то "недавно изобретенной" ветке без имени, которое когда-то было мастером.

Вам просто нужно вернуться к мастеру:

git checkout master

Однако, если вы хотите исправить ошибку, вы должны работать в своей ветке (в соответствии с большинством git рабочих процессов). Таким образом, проверьте мастер и ветку от него:

git checkout master
git checkout -b fix-issue #give the branch a name that refers to the bug

затем исправить ошибку и запустить:

git checkout master
git merge --no-ff fix-issue -m "Fixed some strange issue, here follows a description"

ИЗМЕНИТЬ

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

Поэтому вы создаете временную ветку:

git commit -m "some temporary message"
git checkout -b temporary
git checkout master
git merge --no-ff temporary