Jak mogę wrócić do poprzedniej lokalizacji? (Odłączona Głowica) & Cofnij commity

W Git, próbowałem wykonać squash commit przez scalenie w innej gałęzi, a następnie zresetowanie HEAD do poprzedniego miejsca poprzez:

git reset origin/master
Ale muszę wyjść z tego. Jak mogę wrócić do poprzedniej lokalizacji?

Mam fragment SHA-1 (23b6772) commita, do którego muszę go przenieść. Jak mogę wrócić do tego zobowiązania?

Author: Peter Mortensen, 2015-12-29

7 answers

Zanim odpowiemy, dodajmy trochę tła, wyjaśniając, czym jest to 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, który nazywa się 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

Tutaj wpisz opis obrazka


Kilka opcji jak odzyskać od odłączonego Głowa:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits to go back

To wykona nową gałąź wskazującą 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 i sprawdzenie żądanego wpisu reflog ustawi HEAD z powrotem do tego / align = "left" /

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 jako cóż.

git revert <sha-1>

"Cofnij" dany commit lub zakres zmian.
Polecenie reset "cofnie" wszelkie zmiany wprowadzone w danym zatwierdzeniu.
Nowy commit z łatką undo zostanie zatwierdzony, podczas gdy oryginalny commit 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 co robi.
Jak widać, reset && checkout zmodyfikować HEAD.

Tutaj wpisz opis obrazka

 465
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
2020-12-05 01:19:12

Pierwszy reset lokalnie:

git reset 23b6772

Aby sprawdzić, czy jesteś na właściwej pozycji, zweryfikuj za pomocą:

git status

Zobaczysz coś w stylu:

Na gałęzi master twoja gałąź jest za 'origin / master' przez 17 commitów, i mogą być szybko przekazywane.

Następnie przepisz historię W zdalnej gałęzi śledzenia , aby odzwierciedlić zmianę:

git push --force-with-lease // a useful command @oktober mentions in comments

Za pomocą --force-with-lease zamiast --force spowoduje błąd, jeśli inni w międzyczasie zobowiązali się do zdalna gałąź, w którym to przypadku powinieneś najpierw pobrać. więcej informacji w tym artykule .

 33
Author: amuliar,
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
2020-12-14 09:46:26

Najszybsze możliwe rozwiązanie (tylko 1 krok)

git checkout -

Zobaczysz Switched to branch <branch_name>. Potwierdź, że to oddział, którego chcesz.


Krótkie wyjaśnienie: to polecenie przesunie głowę z powrotem do swojej ostatniej pozycji. Patrz uwaga na wyniki na końcu tej odpowiedzi.


Mnemonic: to podejście jest podobne do używania cd - do powrotu do poprzednio odwiedzanego katalogu. Składnia i odpowiednie przypadki są całkiem dobre (np. jest to przydatne, gdy faktycznie chce wrócić tam, gdzie było).


Bardziej metodyczne rozwiązanie (2-stopniowe, ale zapadające w pamięć)

Szybkie podejście rozwiązuje pytanie operacji. Ale co, jeśli Twoja sytuacja jest nieco inna: powiedzmy, że ponownie uruchomiłeś Bash, a następnie znalazłeś się z oderwaną głową. W takim przypadku, oto 2 proste, łatwo zapamiętane kroki.

1. Wybierz gałąź, której potrzebujesz

git branch -v

Zobaczysz listę istniejących oddziałów lokalnych. Grab the branch name that pasuje do Twoich potrzeb.

2. Move HEAD to it

git checkout <branch_name>

Zobaczysz Switched to branch <branch_name>. Sukces!


Wyniki

Przy użyciu jednej z metod możesz kontynuować dodawanie i zatwierdzanie swojej pracy tak jak poprzednio: Twoje następne zmiany będą śledzone na <branch_name>.

Zauważ, że zarówno git checkout -, jak i git checkout <branch_name> dadzą dodatkowe instrukcje, jeśli popełniłeś zmiany, gdy głowa była odłączona.

 15
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
2020-02-13 16:51:49

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.

 5
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
2020-01-27 02:14:34

Kiedy uruchomisz komendę {[0] } wtedy HEAD odłączy się od 13ca5593d(say commit-id) i branch będzie już dostępny.

Wróć do poprzedniej lokalizacji uruchom polecenie krok wise-

  1. git pull origin branch_name (Powiedz Mistrzu)
  2. git checkout branch_name
  3. git pull origin branch_name

Wrócisz do poprzedniej lokalizacji ze zaktualizowanym zatwierdzeniem ze zdalnego repozytorium.

 0
Author: Deepak Kumar,
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
2020-01-27 02:16:41

Dzisiaj omyłkowo sprawdziłem commit i zacząłem nad nim pracować, wykonując kilka commitów na stanie głowy detach. Następnie wcisnąłem do zdalnej gałęzi używając następującego polecenia:

git push origin HEAD: <My-remote-branch>

Then

git checkout <My-remote-branch>

Then

git pull

W końcu dostałem wszystkie moje zmiany w mojej gałęzi, które zrobiłem w odłączonej głowie.

 0
Author: Zaid Mirza,
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
2020-01-27 02:18:48

To może nie jest rozwiązanie techniczne, ale działa. (jeśli ktoś z twojej drużyny ma ten sam Oddział w lokalnym)

Przyjmijmy nazwę Twojej gałęzi jako branch-xxx .

Kroki do rozwiązania:

  • nie Aktualizuj ani nie wyciągaj-nic
  • po prostu utwórz nową gałąź (branch-yyy ) z branch-xxx na swojej maszynie
  • to wszystko, wszystkie istniejące zmiany będą w tej nowej gałęzi (branch-yyy). Możesz kontynuować swoją pracę z tym branch.

Uwaga: ponownie, nie jest to rozwiązanie techniczne, ale na pewno pomoże.

 0
Author: Sathish Kumar,
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
2020-06-09 07:20:17