Ответ 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; возможно, более старые хиты не так умны.