Как переместить голову обратно в предыдущее место? (Отрезанная голова)
в git я пытался сделать сквош-коммит, объединившись в другую ветку, а затем сбросив HEAD на предыдущее место через:
git reset origin/master
но мне нужно выйти из этого. Как я могу переместить голову обратно в предыдущее место?
у меня есть SHA1 фраг (23b6772) фиксации, что мне нужно, чтобы переместить его.
Как я могу вернуться к этому обязательству?
3 ответа:
перед ответом давайте добавим некоторый фон, объясняя, что это
HEAD.
First of all what is HEAD?
HEAD- это просто ссылка на текущую фиксацию (последнюю) в текущей ветке.
Там может быть только одинHEADв любой момент времени. (исключаяgit worktree)содержание
HEADхранится внутри.git/HEADи он содержит 40 байт SHA-1 текущего совершать.
detached HEADесли вы не на последней фиксации-это означает, что
HEADуказывает на предыдущую фиксацию в истории ее называютdetached HEAD.в командной строке это будет выглядеть так-SHA-1 вместо имени ветки, так как
HEADне указывает на кончик тока ветка
несколько вариантов о том, как оправиться от отсоединенной головы:
git checkoutgit 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вернуться к этой фиксации.каждый раз, когда голова изменяется будет новая запись в
refloggit reflog git checkout HEAD@{...}это вернет вас к желаемому совершение
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.
вот подход, который может быть очень простым и легко запомнить. Проверьте 2 условия и закончите с 1 командой. Тогда ты снова на верном пути.
если
вы находитесь в "отделенной голове"
(т. е. типаgit status; вы видитеHEAD detached at <commit_id>)и
существующая ветвь соответствует вашим потребностям
(т. е. типаgit branch -v; вы видите имя ветви со связанными сообщениями фиксации, представляющими работу, которую вы хотите продолжить)затем
просто проверьте эту ветку (т. е. типа
git checkout <branch_name>- вы видитеSwitched to branch <branch_name>).итоги
теперь вы можете продолжать добавлять и совершает свою работу, как и раньше, изменения будут отслеживаться на
<branch_name>.обратите внимание, что если вы сохранили работу во время отсоединения HEAD, в большинстве случаев эта работа будет автоматически объединена в вышеуказанном процессе. Если вы видите сообщение о конфликте слияния, не паникуйте. Есть несколько отличных учебники с простыми шагами для устранения конфликта и завершения слияния.
вопрос можно прочитать так:
я был в отстраненном состоянии с
HEADat23b6772и набралgit reset origin/master(потому что я хотел сквош). Теперь я передумал, как мне вернуться кHEADнаходясь на23b6772?прямолинейный ответ будет такой:
git reset 23b6772но я попал в этот вопрос, потому что мне надоело печатать (копировать и вставлять) хеши фиксации или его аббревиатуру каждый раз, когда я хотел ссылаться на предыдущий
HEADи гуглил, чтобы посмотреть, есть ли какая-нибудь стенография.оказывается, есть!
git reset -(или в моем случаеgit cherry-pick -)который, кстати, был таким же, как
cd -чтобы вернуться к предыдущему текущей директории in * nix! Так ура, узнал две вещи одним камнем.



