Jak wrócić do poprzedniej lokalizacji? (Odłączona Głowica)
W git, próbowałem zrobić commit squasha łącząc się z inną gałęzią, a następnie resetując HEAD
do poprzedniego miejsca poprzez:
git reset origin/master
Ale muszę wyjść z tego.
Jak mogę wrócić do poprzedniej lokalizacji?
Mam frag SHA1 (23b6772
) commita, do którego muszę go przenieść.
Jak mogę wrócić do tego zobowiązania?
3 answers
Zanim odpowiemy, dodajmy trochę tła, wyjaśniając, co to jest HEAD
.
First of all what is HEAD?
HEAD
jest po prostu odniesieniem do bieżącego commita (latest)w bieżącej gałęzi.
W danym momencie może istnieć tylko jedna HEAD
. (z wyłączeniem git worktree
)
Zawartość HEAD
jest przechowywana wewnątrz .git/HEAD
i zawiera 40 bajtów SHA-1 bieżącego commita.
detached HEAD
Jeśli nie jesteś na najnowszy commit-co oznacza, że HEAD
wskazuje na poprzedni commit w historii o nazwie detached HEAD
.
W wierszu poleceń będzie wyglądać tak - SHA-1 zamiast nazwy gałęzi, ponieważ HEAD
nie wskazuje na końcówkę bieżącej gałęzi
Kilka opcji, jak odzyskać od odłączonej głowy:
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
To będzie nowe gałąź wskazująca na żądany commit.
Polecenie to zostanie pobrane do danego commita.
W tym momencie możesz utworzyć gałąź i rozpocząć pracę od tego momentu.
# 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
Zawsze możesz użyć reflog
.git reflog
wyświetli każdą zmianę, która zaktualizowała HEAD
, A sprawdzenie żądanego wpisu reflog ustawi HEAD
z powrotem do tego commita.
Za każdym razem, gdy głowica zostanie zmodyfikowana, pojawi się nowy wpis w reflog
git reflog
git checkout HEAD@{...}
To przywróci Ci pożądany commit
git reset --hard <commit_id>
"Przenieś" głowę z powrotem do żądanego commita.
# 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 Git 2.7)
możesz również użyćgit rebase --no-autostash
.
git revert <sha-1>
"Cofnij" dany commit lub zakres zmian.
Polecenie reset spowoduje "cofnięcie" wszelkich zmian dokonanych w danym zatwierdzeniu.
Nowy commit z łatką undo zostanie zatwierdzony, podczas gdy oryginalny commit pozostanie również w historii.
# 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>
Ten schemat ilustruje, które polecenie co robi.
Jak widać reset && checkout
zmodyfikuj HEAD
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-17 14:00:42
Oto podejście, które może być bardzo proste i łatwe do zapamiętania. Sprawdź 2 warunki i zakończ za pomocą 1 polecenia. Więc jesteś z powrotem na dobrej drodze.
If
Jesteś w 'oderwana Głowa'
(tj. typ git status
; widzisz HEAD detached at <commit_id>
)
I
Istniejący oddział odpowiada twoim potrzebom
(np. wpisz git branch -v
; zobaczysz nazwę gałęzi z powiązanymi komunikatami zatwierdzającymi reprezentującymi pracę, którą chcesz kontynuować)
Then
Po prostu sprawdź tę gałąź
(tj. type git checkout <branch_name>
; you Zobacz Switched to branch <branch_name>
).
Wyniki
Możesz teraz kontynuować dodawanie i zatwierdzanie swojej pracy tak jak wcześniej; zmiany będą śledzone na <branch_name>
.
Zauważ, że jeśli zapisałeś pracę, gdy głowa była odłączona, w większości przypadków praca ta będzie automatycznie scalana w powyższym procesie. Jeśli widzisz wiadomość o konflikcie scalania, nie panikuj. Istnieje kilka świetnych samouczków z prostymi krokami do naprawienia konfliktu i zakończenia połączenia.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-02 14:39:37
Pytanie można odczytać jako:
byłem w stanie oderwanym z HEAD
Na 23b6772
i wpisałem git reset origin/master
(bo chciałem się zgnieść). Teraz zmieniłem zdanie, jak mam wrócić do HEAD
bycia w 23b6772
?
Prosta odpowiedź brzmi: git reset 23b6772
Ale trafiłem na to pytanie, ponieważ miałem dość wpisywania (kopiowania i wklejania) hashów commit lub jego skrótu za każdym razem, gdy chciałem odwołać się do poprzedniego HEAD
i szukałem w Googlach, aby zobaczyć, czy są jakieś trochę skrótowo.
Okazuje się, że jest!
git reset -
(lub w moim przypadku git cherry-pick -
)
Który nawiasem mówiąc był taki sam jak cd -
aby powrócić do poprzedniego bieżącego katalogu W *nix! Więc hurra, nauczyłem się dwóch rzeczy na jednym ogniu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-22 04:46:29