как переключиться обратно в ГОЛОВУ - PullRequest
0 голосов
/ 28 апреля 2020

Чтобы протестировать коммит, я сделал:

git checkout 1234

после теста, я хочу go вернуться в HEAD, но я могу только go вернуться к мастеру

git checkout master

$ git status
On branch master

Какую команду я могу go вернуть в ГОЛОВУ?

Ответы [ 2 ]

2 голосов
/ 28 апреля 2020

Git имеет, в этом случае, два режима:

  • "на ветке": специальное имя HEAD, как и все заглавные буквы, 1 содержит имя ветви.
  • «detached HEAD»: специальное имя HEAD содержит необработанный га sh идентификатор коммита.

Учитывая, что второй режим называется отсоединен режим HEAD, мне нравится называть первый режим присоединен режим HEAD .

Хотя вы можете использовать Git во втором режиме столько, сколько вам Например, большинство людей предпочитают использовать Git в первом режиме, потому что это обычно более полезно. Режим отсоединенного HEAD существует по двум основным причинам:

  • , чтобы вы могли просмотреть любой особенно интересный коммит, например, запустив git checkout <em>hash-id</em> или git checkout <em>tag-name</em>; или
  • для обработки текущего git rebase, требующего помощи человека.

Чтобы отключить режим при использовании имени филиала, вы можете (как вы отметили в одной точке) используйте git checkout --detach <em>name</em> - но если вы не реализуете новую команду Git, или что-то в этом роде, это не нормальная вещь.

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

Каждый Git коммит сохраняет некоторые идентификаторы ha sh с более ранним коммитом. Большинство коммитов сохраняют ровно один такой идентификатор, который Git вызывает родительский коммита. Этот идентификатор ha sh является коммитом, который вы извлекли ранее.

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

Вот что делает git checkout: вы даете ему имя (которое * 1148) * превращается в ha sh ID) или ha sh ID, и Git извлекает замороженные фиксации в полезную форму. Теперь вы можете видеть и работать с коммитом. Если вы затем сделаете новый коммит, новый родительский коммит ha sh ID будет ha sh ID Git, использованным для извлечения current совершать. Затем, сделав новый коммит, Git делает этот новый коммит ставшим текущим коммитом.

Вот так растут ветки: вы выбираете имя ветки, например master, работа в файлах вашего рабочего дерева скажите Git, чтобы скопировать все обновления обратно, чтобы они были готовы к фиксации (git add), и используйте git commit для создания нового снимка / фиксации. Этот коммит затем запоминает, какой коммит имя ветви использовал , чтобы сказать, и Git обновляет имя ветки, чтобы сказать этот новый коммит является последним .

Следовательно по определению каждое имя ветви является последним коммитом для этой ветви. Этот коммит запоминает своего (исторического) родителя, который позволяет вам или Git найти свой идентификатор ha sh, если вы извлечете его sh. Если вы это сделаете, вы войдете в режим отсоединенного HEAD с родителем в качестве текущего коммита. Этот коммит запоминает его родительский элемент, который позволяет вам или Git найти идентификатор ha sh, чтобы вы могли проверить этот коммит и т. Д.

В конце концов, на самом деле это означает, что вы обычно не говорите Git: использовать режим подключенного HEAD или использовать режим отдельного HEAD . Вы просто выбираете название ветви, если хотите, чтобы последний коммит и имел возможность добавлять новые коммиты здесь, или необработанный идентификатор ha sh (или имя тега, или какое-либо другое имя), если вы не хотите последний коммит и не беспокоитесь о возможности добавления новых коммитов.

Недостаток режима отключенного HEAD заключается в том, что если вы делаете добавляете новые коммиты. единственное имя , которое может их найти, это HEAD. Как только вы выбираете какой-либо другой коммит или имя ветки, Git теряет способность найти новых коммитов, которые вы сделали. Поэтому редко хочется выполнять new в режиме отсоединенного HEAD. Дело не в том, что вы не можете - и такие команды, как git rebase, дают этому режиму хороший эффект - но редко хотят этого.

(Вы никогда не объясняли почему Вы хотели это, но выше есть ответ на вопрос, как его получить: просто выберите коммит по историческому имени или используйте --detach, если используете имя ветви. Просто помните, чтобы не оставался в этом режиме если вы хотите выполнить новую работу.)


1 Иногда вы можете использовать head в нижнем регистре, и это работает - или, по крайней мере, кажется, работает. Впрочем, это плохая привычка, потому что, хотя она по умолчанию работает нормально в MacOS и Windows, она не работает вообще по умолчанию в Linux. Более того, если вы начнете использовать git worktree add, он перестанет работать правильно даже на MacOS и Linux.

Реальная причина, по которой он работает - или нет, когда это не так - это Git хранит данные для специального имени HEAD в файле с именем .git/HEAD или в файле с другим именем, например .git/worktrees/foo/HEAD. Если вы используете строчные буквы head, Git, довольно рано, попробуйте прочитать файл .git/head. В файловой системе без учета регистра это приводит к чтению файла .git/HEAD, который получает данные этого файла и позволяет Git продолжить. С добавленным рабочим деревом это неправильно HEAD, поэтому Git продолжает использовать неверный коммит .

Если вам не нравится набрав all-caps HEAD, рассмотрите возможность использования его односимвольного синонима @.

0 голосов
/ 28 апреля 2020

Кажется, работает:

git checkout --detach master
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...