Ответ 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 запишите исходный кончик ветки, прежде чем применять какие-либо изменения.