Как переместить голову обратно в предыдущее место? (Отрезанная голова)


в git я пытался сделать сквош-коммит, объединившись в другую ветку, а затем сбросив HEAD на предыдущее место через:

git reset origin/master

но мне нужно выйти из этого. Как я могу переместить голову обратно в предыдущее место?

у меня есть SHA1 фраг (23b6772) фиксации, что мне нужно, чтобы переместить его.
Как я могу вернуться к этому обязательству?

3 82

3 ответа:

перед ответом давайте добавим некоторый фон, объясняя, что это HEAD.

First of all what is HEAD?

HEAD - это просто ссылка на текущую фиксацию (последнюю) в текущей ветке.
Там может быть только один HEAD в любой момент времени. (исключая git worktree)

содержание HEAD хранится внутри .git/HEAD и он содержит 40 байт SHA-1 текущего совершать.


detached HEAD

если вы не на последней фиксации-это означает, что HEAD указывает на предыдущую фиксацию в истории ее называют detached HEAD.

enter image description here

в командной строке это будет выглядеть так-SHA-1 вместо имени ветки, так как HEAD не указывает на кончик тока ветка

enter image description here


несколько вариантов о том, как оправиться от отсоединенной головы:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

это будет проверка новой ветви, указывающей на желаемую фиксацию.
Эта команда выполнит проверку на заданную фиксацию.
На этом этапе вы можете создать ветку и начать работать с этой точки на.

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

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

каждый раз, когда голова изменяется будет новая запись в reflog

git reflog
git checkout HEAD@{...}

это вернет вас к желаемому совершение

enter image description here


git reset --hard <commit_id>

"переместите" голову назад к нужной фиксации.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
  • Примечание: ( С Git 2.7)
    вы также можете использовать git rebase --no-autostash как хорошо.


git revert <sha-1>

"отменить" данное совершить или совершает выбор.
Команда reset "отменит" любые изменения, внесенные в данную фиксацию.
Новая фиксация с исправлением отмены будет выполнена, в то время как исходная фиксация также останется в истории.

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

эта схема иллюстрирует, какая команда что делает.
Как вы можете видеть там reset && checkout изменить HEAD.

enter image description here

вот подход, который может быть очень простым и легко запомнить. Проверьте 2 условия и закончите с 1 командой. Тогда ты снова на верном пути.

если

вы находитесь в "отделенной голове"
(т. е. типа git status; вы видите HEAD detached at <commit_id>)

и

существующая ветвь соответствует вашим потребностям
(т. е. типа git branch -v; вы видите имя ветви со связанными сообщениями фиксации, представляющими работу, которую вы хотите продолжить)

затем

просто проверьте эту ветку (т. е. типа git checkout <branch_name> - вы видите Switched to branch <branch_name>).

итоги

теперь вы можете продолжать добавлять и совершает свою работу, как и раньше, изменения будут отслеживаться на <branch_name>.

обратите внимание, что если вы сохранили работу во время отсоединения HEAD, в большинстве случаев эта работа будет автоматически объединена в вышеуказанном процессе. Если вы видите сообщение о конфликте слияния, не паникуйте. Есть несколько отличных учебники с простыми шагами для устранения конфликта и завершения слияния.

вопрос можно прочитать так:

я был в отстраненном состоянии с HEAD at 23b6772 и набрал git reset origin/master (потому что я хотел сквош). Теперь я передумал, как мне вернуться к HEAD находясь на 23b6772?

прямолинейный ответ будет такой: git reset 23b6772

но я попал в этот вопрос, потому что мне надоело печатать (копировать и вставлять) хеши фиксации или его аббревиатуру каждый раз, когда я хотел ссылаться на предыдущий HEAD и гуглил, чтобы посмотреть, есть ли какая-нибудь стенография.

оказывается, есть!

git reset - (или в моем случае git cherry-pick -)

который, кстати, был таким же, как cd - чтобы вернуться к предыдущему текущей директории in * nix! Так ура, узнал две вещи одним камнем.