HEAD и ORIG_HEAD в Git

Что означают эти символы и что они означают?

(я не могу найти никаких объяснений в официальной документации)

Ответ 1

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

И @ является ярлыком для HEAD, так как Git 1.8.5

ORIG_HEAD - это предыдущее состояние HEAD, заданное командами, которые могут иметь опасное поведение, их легко вернуть. Теперь менее полезно, что Git имеет reflog: [email protected]{1} примерно эквивалентен ORIG_HEAD ([email protected]{1} всегда является последним значением HEAD, ORIG_HEAD является последним значением HEAD перед опасной операцией).

Для получения дополнительной информации прочитайте git (1) manpage, Git Руководство пользователя, Git Community Book и Git Глоссарий

Ответ 2

Из git reset

"pull" или "merge" всегда оставляет исходный кончик текущей ветки в ORIG_HEAD.

git reset --hard ORIG_HEAD

Слишком сложное восстановление приводит к тому, что ваш индексный файл и рабочее дерево возвращаются в это состояние и сбрасывает кончик ветки на этот коммит.

git reset --merge ORIG_HEAD

После проверки результата слияния вы можете обнаружить, что изменение в другой ветке неудовлетворительно. Запуск "git reset --hard ORIG_HEAD" позволит вам вернуться к тому месту, где вы были, но он отменит ваши локальные изменения, которые вам не нужны. "git reset --merge" сохраняет ваши локальные изменения.


Прежде чем применять какие-либо исправления, ORIG_HEAD устанавливается на вершину текущей ветки.
Это полезно, если у вас возникли проблемы с несколькими коммитами, например, с запуском 'git am' на неправильной ветке или с ошибкой в ​​фиксации, которая легче фиксируется путем изменения почтового ящика (например, + ошибки в строках "От:" ).

Кроме того, merge всегда устанавливает '.git/ORIG_HEAD' в исходное состояние HEAD, поэтому проблемное слияние можно удалить, используя 'git reset ORIG_HEAD'.


Примечание: из здесь

HEAD - это движущийся указатель. Иногда это означает текущую ветвь, иногда это не так.

Итак, HEAD НЕ является синонимом для "текущей ветки".

HEAD означает "текущий" всюду в git, но это не обязательно означает "текущая ветвь" (т.е. отсоединенная HEAD).

Но это почти всегда означает "текущий фиксатор".
Это коммит "git commit" строится сверху, а "git diff --cached" и "git status" сравниваются. Это означает, что текущая ветвь существует только в очень ограниченных контекстах (именно тогда, когда нам нужна ветка имя для работы --- сброс и увеличение кончика ответвления с помощью фиксации /rebase/etc.).

Reflog - это средство возврата назад во времени и времени машины имеют интересное взаимодействие с понятием "ток".

[email protected]{5.minutes.ago} может означать "разыменовать HEAD symref, чтобы узнать, в какой ветке мы находимся прямо сейчас, а затем выяснить, где кончик этой ветки был 5 минут назад".
В качестве альтернативы это может означать "что такое фиксация, которую я бы назвал HEAD 5 минут назад, например. если я сделал" git show HEAD "тогда".


git1.8.4 (июль 2013 г.) вводит новую новую нотацию! < ш > (на самом деле, это будет для 1.8.5 или 1.9, Q4 2013: повторно введено с commit 9ba89f4)

Вместо ввода четырех заглавных букв "HEAD" вы можете сказать "@" сейчас,
например "git log @".

См. commit cdfd948

Ввод 'HEAD' является утомительным, особенно если мы можем использовать '@'.

Причиной выбора "@" является то, что оно естественно следует из синтаксиса [email protected] (например, [email protected]{u}), за исключением того, что мы не имеем ссылки на ref и не выполняем операцию, и когда у нас их нет, позволяет предположить, что "HEAD".

Итак, теперь мы можем использовать 'git show @~1' и все это доброе добро.

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


A сообщение в блоге в течение периода 1.8.4-rc3 (14-е, август 2013 года) объявило, что эта функция была отменена и отложена (спасибо Cupcake для хедз-ап).
Опять же, он вводится снова с commit 9ba89f4 (сентябрь 2013 г.).

См. commit 2c2b664:

Отменить "Добавить новый @ ярлык для HEAD"

Это возвращает commit cdfd948, так как это относится не только к "@" (и формируется с такими модификаторами, как @{u} применяется к нему), но также затрагивает, например, "refs/heads/@/foo", который он не должен.

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

Ответ 3

Я понимаю, что HEAD указывает текущую ветку, тогда как ORIG_HEAD используется для хранения предыдущего HEAD перед выполнением "опасных" операций.

Например, git -rebase и git -am запишите исходный кончик ветки, прежде чем применять какие-либо изменения.