HEAD и ORIG_HEAD в Git - PullRequest
       70

HEAD и ORIG_HEAD в Git

222 голосов
/ 08 июня 2009

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

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

Ответы [ 3 ]

288 голосов
/ 09 июня 2009

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 перед опасной операцией).

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

94 голосов
/ 08 июня 2009

С 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 является НЕ синонимом "текущей ветви" уже везде.

HEAD означает повсюду "current" в 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 года: повторно введено с commit 9ba89f4 )

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

См. коммит cdfd948

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

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

Так что теперь мы можем использовать 'git show @~1' и все такое доброе совершенство.

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


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

См. commit 2c2b664 :

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

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

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

2 голосов
/ 08 июня 2009

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

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

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