HEAD и ORIG_HEAD в Git
Что означают эти символы и что они означают?
(Я не могу найти никакого объяснения в официальной документации)
3 ответа
HEAD
является (прямой или косвенной, то есть символической) ссылкой на текущий коммит. Это коммит, который вы проверили в рабочем каталоге (если вы не внесли какие-либо изменения или эквивалент), и это коммит, поверх которого "git commit" сделает новый. Обычно HEAD
является символической ссылкой на какую-то другую именованную ветку; эта ветка в настоящее время извлечена веткой или текущей веткой. HEAD
также может указывать непосредственно на коммит; это состояние называется "отделенная голова", и его можно понимать как находящееся в неназванной анонимной ветви.
А также @
один является ярлыком для HEAD
, начиная с Git 1.8.5
ORIG_HEAD
это предыдущее состояние HEAD
, устанавливается командами, которые могут иметь опасное поведение, чтобы их было легко отменить. Это менее полезно сейчас, когда Git имеет reflog: HEAD@{1}
примерно эквивалентно ORIG_HEAD
(HEAD@{1}
всегда последнее значение HEAD
, ORIG_HEAD
является последним значением HEAD
перед опасной операцией).
Для получения дополнительной информации прочитайте man-страницу git(1), руководство пользователя Git, книгу сообщества Git и глоссарий Git.
Из git reset
"тянуть" или "объединить" всегда оставляет исходный конец текущей ветви в
ORIG_HEAD
,
git reset --hard ORIG_HEAD
Сложный сброс приводит к тому, что ваш индексный файл и рабочее дерево возвращаются в это состояние и сбрасывает кончик ветви на этот коммит.
git reset --merge ORIG_HEAD
Изучив результат слияния, вы можете обнаружить, что изменение в другой ветке неудовлетворительное. Бег "
git reset --hard ORIG_HEAD
"позволит вам вернуться туда, где вы были, но отменит ваши локальные изменения, которые вам не нужны".git reset --merge
"сохраняет ваши локальные изменения.
Перед применением каких-либо исправлений ORIG_HEAD устанавливается на вершину текущей ветви.
Это полезно, если у вас есть проблемы с несколькими коммитами, такими как запускgit am
'в неправильной ветке или ошибка в фиксациях, которую легче исправить, изменив почтовый ящик (например, + ошибки в строках "От:").Кроме того, слияние всегда устанавливает
.git/ORIG_HEAD
"в исходное состояние HEAD, поэтому проблемное слияние может быть удалено с помощью"git reset ORIG_HEAD
".
Примечание: отсюда
ГОЛОВА - это движущийся указатель. Иногда это означает текущую ветку, иногда нет.
Таким образом, HEAD уже не является синонимом "текущей ветки".
HEAD означает "текущий" везде в git, но это не обязательно означает "текущую ветвь" (т.е. отделенный HEAD).
Но это почти всегда означает "текущий коммит".
Это коммитgit commit
"строит поверх, и"git diff --cached
" а также "git status
"сравнить с.
Это означает, что текущая ветвь только в очень ограниченных контекстах (именно тогда, когда мы хотим, чтобы имя ветви работало - сбрасывая и увеличивая наконечник ветвления с помощью commit / rebase / etc.).Reflog - это средство возвращения во времени, и машины времени интересны взаимодействием с понятием "ток".
HEAD@{5.minutes.ago}
может означать "разыменовать HEAD symref, чтобы узнать, на какой ветке мы находимся ПРЯМО СЕЙЧАС, а затем выяснить, где кончик этой ветви был 5 минут назад".
В качестве альтернативы это может означать "что такое коммит, который я бы назвал HEAD 5 минут назад, например, если бы я сделал"git show HEAD"тогда".
git1.8.4 (июль 2013) вводит введено новое обозначение!
(на самом деле, это будет для 1.8.5 или 1.9, четвертый квартал 2013 года: повторно введен с коммитом 9ba89f4)
Вместо того, чтобы печатать четыре заглавные буквы
HEAD
", ты можешь сказать "@
" сейчас,
напримерgit log @
".
Смотрите коммит cdfd948
Печатать
HEAD
"утомительно, особенно когда мы можем использовать"@
'вместо.Причина выбора '
@
что это естественно следует изref@op
синтаксис (например,HEAD@{u}
), за исключением того, что у нас нет ни ссылки, ни операции, и когда у нас их нет, имеет смысл предположить 'HEAD
".Так что теперь мы можем использовать
git show @~1
и все такое доброе совершенство.До сих пор '
@
'было допустимым именем, но оно противоречит этой идее, поэтому давайте сделаем его недействительным. Вероятно, очень мало людей, если таковые имеются, использовали это имя.
В сообщении блога в период 1.8.4-rc3 (14 августа 2013 г.) было объявлено, что эта функция была отменена и отложена (спасибо, кекс, хедз-ап).
Снова, это снова введено с коммитом 9ba89f4 (сентябрь 2013).
Смотрите коммит 2c2b664:
Вернуть "Добавить новый @
ярлык для HEAD
"
Это отменяет фиксацию cdfd948, так как это относится не только к
@
"(и формы с такими модификаторами, как@{u}
применяется к нему), но также влияет, например,refs/heads/@/foo
", чего не должно быть.Основная идея создания короткой руки может быть хорошей, и тему можно повторить позже, но давайте вернемся, чтобы не затрагивать существующие варианты использования на данный момент для предстоящего выпуска.
Из man 7 gitrevisions
:
HEAD называет коммит, на котором вы основываете изменения в рабочем дереве. FETCH_HEAD записывает ветку, которую вы извлекли из удаленного репозитория при последнем вызове git fetch. ORIG_HEAD создается командами, которые резко перемещают вашу HEAD, чтобы записать положение HEAD перед их операцией, так что вы можете легко вернуть кончик ветви в состояние до того, как вы их запустили. MERGE_HEAD записывает коммит (и), которые вы объединяете в свою ветку при запуске git merge. CHERRY_PICK_HEAD записывает фиксацию, которую вы выбираете при запуске git cherry-pick.
Насколько я понимаю, HEAD указывает текущую ветвь, а ORIG_HEAD используется для хранения предыдущего HEAD перед выполнением "опасных" операций.
Например, git-rebase и git-am записывают исходный наконечник ветви перед тем, как применить какие-либо изменения.