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?
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
.
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łą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
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
.
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 .
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.
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.
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-
-
git pull origin branch_name
(Powiedz Mistrzu) git checkout branch_name
git pull origin branch_name
Wrócisz do poprzedniej lokalizacji ze zaktualizowanym zatwierdzeniem ze zdalnego repozytorium.
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.
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.
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