Перш ніж відповісти, давайте додамо деяку інформацію, пояснивши, що це 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 <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>
Ви завжди можете використовувати reflog
також.
git reflog
відобразиться будь-яка зміна, яка оновила, HEAD
і перевірка потрібного запису відмикання HEAD
повернеться до цього зобов'язання.
Кожен раз, коли зміниться HEAD, буде новий запис у reflog
git reflog
git checkout HEAD@{...}
Це поверне вас до бажаного завдання
"Перемістіть" голову назад до потрібної фіксації.
# 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
також.
"Скасувати" заданий діапазон фіксації чи фіксації.
Команда скидання "скасує" будь-які зміни, внесені в дану комісію.
Нова фіксація з виправленням патча буде здійснена, тоді як оригінальна комісія також залишиться в історії.
# 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
.