Как мне исправить проверку HEAD ^ в git - PullRequest
11 голосов
/ 10 ноября 2009

Хорошо, поэтому я внес некоторые изменения в свой проект, которые привели к огромному беспорядку. Я уже зафиксировал изменения, чтобы я мог вернуться к ним позже, а затем использовал git checkout HEAD ^ для проверки предыдущего коммита. Теперь, когда я делаю коммиты для своего проекта, он показывает SHA-1 в командной строке как рабочую ветвь (вместо master)

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

Я предполагаю, что это связано с rebase, но я не уверен на 100%.

Спасибо.

Ответы [ 3 ]

23 голосов
/ 10 ноября 2009

Теперь, когда я делаю коммиты для своего проекта, он показывает SHA-1 в командной строке как рабочую ветвь (вместо мастера)

Это, вероятно, означает, что у вас «отсоединенная ГОЛОВА». Отделенный HEAD указывает непосредственно на коммит, а не на ветку (которая затем указывает на коммит). Отделенная голова похожа на неназванную ветвь.

Это состояние было вызвано вашей git checkout HEAD^ командой, так как HEAD^ относится к коммиту, а не к имени ветви. Вы, вероятно, хотели сделать git reset --hard HEAD^ - , в то время как master все еще оставался активной веткой - чтобы удалить самый последний коммит из master (он все еще существует на диске и быть доступным через reflog, пока не истечет срок его записи в reflog.

Как я могу указать HEAD на последний коммит, с которого я работаю?

HEAD - это всегда коммит, от которого вы работаете, независимо от того, отсоединен он или нет.

Если вы имеете в виду «Как я могу указать master на последний коммит, с которого я работаю?», То это то же самое, что и вопрос «Как я могу получить master для указать на HEAD? ». Ответ

git branch -f master HEAD

(на самом деле, вы можете отключить HEAD, так как это по умолчанию). Это принудительно сбрасывает master на коммит, который в данный момент находится на HEAD. Любые коммиты на master , которые недоступны через другую ветку или текущий HEAD, отныне будут доступны только через reflog и, в конечном счете, будут собирать мусор (это отбрасывает от master что-нибудь в master , чего нет в HEAD). Вы также, вероятно, захотите после этого присоединить HEAD к этому обновленному мастеру.

git checkout master

Вместо двух приведенных выше команд вы можете сначала присоединить HEAD, а затем сбросить master с помощью этих двух последовательных команд:

git checkout master         # reattach, commit at HEAD is now the unwanted commit
git reset --hard HEAD@{1}   # reset master to the commit at HEAD before the prior command

Запись HEAD@{1} используется для доступа к записям в журнале. Этот пример просто означает «предыдущий HEAD» (то есть «фиксация в HEAD перед самой последней операцией, которая затронула HEAD»).

3 голосов
/ 10 ноября 2009
git checkout HEAD
git reset HEAD^

Это сотрет самый последний коммит. Убедитесь, что он работал с svn log.

Я заметил, что вы пометили этот git-svn. Это будет работать, только если вы еще не передали испорченный коммит в svn. Если у вас есть, вам нужно применить обратное слияние испорченного коммита следующим образом:

$ git log
commit 30480f327040f812cb2afffdd1cdd374bf26fe83
Author: you
Date: today

    messed up commit

$ git revert 30480f327040f812cb2afffdd1cdd374bf26fe83

где 30480f327040f812cb2afffdd1cdd374bf26fe83 - это хэш испорченного коммита.

1 голос
/ 10 ноября 2009

Я думаю, что вы ищете git reset:

git checkout HEAD
git reset --hard HEAD^

Это вернет "master" к одной ревизии до текущей HEAD. То, с чем вы сейчас работаете, называется «оторванной головой», поскольку с ним не связано символическое имя.

...