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?

Author: CodeWizard, 2015-12-30

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.

Tutaj wpisz opis obrazka

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

Tutaj wpisz opis obrazka


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

Tutaj wpisz opis obrazka


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.

Tutaj wpisz opis obrazka

 207
Author: CodeWizard,
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.

 8
Author: Kay V,
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.

 3
Author: antak,
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