Как переместить голову обратно в предыдущее место? (Отрезанная голова)
в 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 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@{...}
это вернет вас к желаемому совершение
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, в большинстве случаев эта работа будет автоматически объединена в вышеуказанном процессе. Если вы видите сообщение о конфликте слияния, не паникуйте. Есть несколько отличных учебники с простыми шагами для устранения конфликта и завершения слияния.
вопрос можно прочитать так:
я был в отстраненном состоянии с
HEAD
at23b6772
и набралgit reset origin/master
(потому что я хотел сквош). Теперь я передумал, как мне вернуться кHEAD
находясь на23b6772
?прямолинейный ответ будет такой:
git reset 23b6772
но я попал в этот вопрос, потому что мне надоело печатать (копировать и вставлять) хеши фиксации или его аббревиатуру каждый раз, когда я хотел ссылаться на предыдущий
HEAD
и гуглил, чтобы посмотреть, есть ли какая-нибудь стенография.оказывается, есть!
git reset -
(или в моем случаеgit cherry-pick -
)который, кстати, был таким же, как
cd -
чтобы вернуться к предыдущему текущей директории in * nix! Так ура, узнал две вещи одним камнем.