Przed odpowiedzią dodajmy tło, wyjaśniając, co to HEAD
jest.
First of all what is HEAD?
HEAD
jest po prostu odniesieniem do bieżącego zatwierdzenia (najnowszego) w bieżącej gałęzi.
W HEAD
danym momencie może być tylko jeden (wyłączając git worktree
).
Zawartość HEAD
jest przechowywana w środku .git/HEAD
i zawiera 40 bajtów SHA-1 bieżącego zatwierdzenia.
detached HEAD
Jeśli nie korzystasz z ostatniego zatwierdzenia - oznacza HEAD
to, że nazywa się to wcześniejszym zatwierdzeniem w historii detached HEAD
.
W wierszu poleceń będzie to wyglądać tak - SHA-1 zamiast nazwy gałęzi, ponieważ HEAD
nie wskazuje ona końcówki bieżącej gałęzi:
Kilka opcji odzyskiwania po odłączeniu 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
Spowoduje to pobranie nowej gałęzi wskazującej żądany zatwierdzenie.
To polecenie pobierze do danego zatwierdzenia.
W tym momencie możesz utworzyć gałąź i od tego momentu zacząć pracować.
# 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>
Zawsze możesz również użyć reflog
.
git reflog
wyświetli każdą zmianę, która zaktualizowała HEAD
i sprawdzenie żądanego wpisu ponownego logowania spowoduje HEAD
powrót do tego zatwierdzenia.
Za każdym razem, gdy HEAD zostanie zmodyfikowany, pojawi się nowy wpis w reflog
git reflog
git checkout HEAD@{...}
Spowoduje to powrót do żądanego zatwierdzenia
„Przenieś” HEAD z powrotem do żądanego zatwierdzenia.
# 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.
- Uwaga: ( od wersji Git 2.7 ) możesz również korzystać z nich
git rebase --no-autostash
.
„Cofnij” podany zakres zatwierdzania lub zatwierdzania.
Polecenie reset spowoduje „cofnięcie” wszelkich zmian dokonanych w danym zatwierdzeniu.
Nowe zatwierdzenie z łatką cofania zostanie zatwierdzone, podczas gdy oryginalne zatwierdzenie pozostanie również w historii.
# Add a new commit with the undo of the original one.
# The <sha-1> can be any commit(s) or commit range
git revert <sha-1>
Ten schemat ilustruje, które polecenie robi co.
Jak widać, reset && checkout
zmodyfikuj HEAD
.
git checkout 23b6772
powinieneś zrobić.