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

Другие вопросы по тегам