Как исправить проверку HEAD ^ в git

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

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

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

Спасибо.

Ответ 1

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

Это, вероятно, означает, что у вас есть "отдельно стоящая HEAD". Отдельная HEAD указывает непосредственно на фиксацию вместо указания на ветку (которая затем указывает на фиксацию). Отдельная голова подобна неназванной ветке.

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

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

HEAD всегда является фиксацией, с которой вы работаете, независимо от того, является ли она отключена или нет.

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

git branch -f master HEAD

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

git checkout master

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

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

Обозначение [email protected]{1} используется для доступа к записям в рефлоге. Этот пример просто означает "предыдущий HEAD" (т.е. "Commit в HEAD до самой последней операции, которая затронула HEAD" ).

Ответ 2

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 - это хэш перепутанного фиксации.

Ответ 3

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

git checkout HEAD
git reset --hard HEAD^

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