W Git próbowałem zrobić squash commit
, łącząc się z innym oddziałem, a następnie resetując HEAD
się do poprzedniego miejsca poprzez:
git reset origin/master
Ale muszę wyjść z tego. Jak mogę przenieść HEAD z powrotem do poprzedniej lokalizacji?
Mam fragment SHA-1 ( 23b6772
) zatwierdzenia, do którego muszę go przenieść. Jak mogę wrócić do tego zatwierdzenia?
git
git-checkout
git-reset
git-revert
git-reflog
opóźnienie
źródło
źródło
git checkout 23b6772
powinieneś zrobić.Odpowiedzi:
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ącgit 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 historiidetached 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
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ć.
git reflog
Zawsze możesz również użyć
reflog
.git reflog
wyświetli każdą zmianę, która zaktualizowałaHEAD
i sprawdzenie żądanego wpisu ponownego logowania spowodujeHEAD
powrót do tego zatwierdzenia.Za każdym razem, gdy HEAD zostanie zmodyfikowany, pojawi się nowy wpis w
reflog
Spowoduje to powrót do żądanego zatwierdzenia
git reset --hard <commit_id>
„Przenieś” HEAD z powrotem do żądanego zatwierdzenia.
git rebase --no-autostash
.git revert <sha-1>
„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.
Ten schemat ilustruje, które polecenie robi co.
Jak widać,
reset && checkout
zmodyfikujHEAD
.źródło
Robić
Aby sprawdzić, czy jesteś na właściwej pozycji:
Zobaczysz coś
Następnie przepisz historię na pilocie, aby odzwierciedlić zmianę:
źródło
git push --force
. W wielu sytuacjach sprawi, że staniesz się przez jakiś czas najmniej popularną osobą w zespole ....git push --force-with-lease
(artykuł Thoughtbot : thinkbot.com/blog/git-push-force-with-lease )revert
jak zobowiązania, znalazłem się w niezwykle trudnej sytuacji.force-with-lease
dał mi pewność, że przepisałem historię git oddziału bez wpływu na pracę innych ludzi. Brawo!Najszybsze możliwe rozwiązanie (tylko 1 krok)
Posługiwać się
git checkout -
Widać
Switched to branch <branch_name>
. Potwierdź, że to gałąź, którą chcesz.Krótkie wyjaśnienie: to polecenie spowoduje powrót HEAD z powrotem do ostatniej pozycji. Uwaga na temat wyników na końcu tej odpowiedzi.
Mnemoniczny: takie podejście przypomina
cd -
powrót do wcześniej odwiedzonego katalogu. Składnia i odpowiednie przypadki są całkiem dobre (np. Jest to przydatne, gdy naprawdę chcesz, aby HEAD powrócił tam, gdzie był).Bardziej metodyczne rozwiązanie (2 kroki, ale niezapomniane)
Szybkie podejście rozwiązuje pytanie PO. Ale co, jeśli twoja sytuacja jest nieco inna: powiedz, że uruchomiłeś ponownie Bash, a następnie odkryłeś, że HEAD jest odłączony. W takim przypadku oto 2 proste, łatwe do zapamiętania kroki.
1. Wybierz potrzebny oddział
Posługiwać się
git branch -v
Zobaczysz listę istniejących lokalnych oddziałów. Chwyć nazwę oddziału, która odpowiada Twoim potrzebom.
2. Przenieś na nią HEAD
Posługiwać się
git checkout <branch_name>
Widać
Switched to branch <branch_name>
. Sukces!Wyniki
Za pomocą dowolnej z tych metod możesz teraz kontynuować dodawanie i zatwierdzanie swojej pracy jak poprzednio: kolejne zmiany będą śledzone
<branch_name>
.Zauważ, że oba
git checkout -
igit checkout <branch_name>
podadzą dodatkowe instrukcje, jeśli dokonałeś zmian podczas odłączenia HEAD.źródło
git checkout 8acc968
togit branch -v
maMyBranch
na poniższej liście ... ale potemgit checkout MyBranch
usuwa moje komentarze.git checkout 8acc968
sprawdzi zatwierdzenie, a nie oddział. JeśliMyBranch
masz zatwierdzenia, spróbujgit checkout MyBranch
. Jeśli nie zawiera zmian w zatwierdzeniu 8acc968, konieczne będzie scalenie tych zmian po sprawdzeniu gałęzi.git checkout
poprzednie zatwierdzenie i chciałem wrócić do ostatniego zatwierdzenia. Ale bez najnowszego skrótu zatwierdzenia byłem prawie zagubiony. To rozwiązanie jest idealne dla mojej sytuacji!Pytanie można odczytać jako:
Byłem w stanie z oderwanego-
HEAD
u23b6772
i wpisanygit reset origin/master
(bo chciałem squash). Teraz zmieniłem zdanie, jak wrócić doHEAD
bycia23b6772
?Prosta odpowiedź brzmi:
git reset 23b6772
Ale uderzyłem w to pytanie, ponieważ miałem dość pisania na maszynie (kopiowanie i wklejanie) skrótów zatwierdzania lub ich skrótów za każdym razem, gdy chciałem odwoływać się do poprzedniego
HEAD
i byłem w Google, aby sprawdzić, czy istnieje jakiś skrót.Okazuje się, że jest!
git reset -
(lub w moim przypadkugit cherry-pick -
)Który nawiasem mówiąc był taki sam jak
cd -
powrót do poprzedniego bieżącego katalogu w * nix! Hurra, nauczyłem się dwóch rzeczy za pomocą jednego kamienia.źródło
Po uruchomieniu polecenia
git checkout commit_id
HEAD został odłączony,13ca5593d(say commit-id)
a gałąź będzie dłużej dostępna.Wróć do poprzedniej lokalizacji, uruchom komendę krok po kroku -
git pull origin branch_name
(powiedz mistrz)git checkout branch_name
git pull origin branch_name
Powrócisz do poprzedniej lokalizacji ze zaktualizowanym zatwierdzeniem ze zdalnego repozytorium.
źródło
Dzisiaj przez pomyłkę sprawdziłem zatwierdzenie i zacząłem nad nim pracować, wprowadzając pewne zmiany w stanie odłączenia HEAD. Następnie wypychałem do zdalnej gałęzi za pomocą następującego polecenia:
Następnie
Następnie
W końcu dostałem wszystkie moje zmiany w moim oddziale, które wprowadziłem w odłączaniu HEAD.
źródło
To może nie być rozwiązanie techniczne, ale działa. (jeśli ktoś z twojego członka drużyny ma ten sam oddział w lokalnym)
Załóżmy, że nazwa oddziału to gałąź-xxx .
Kroki do rozwiązania:
Uwaga: Ponownie, nie jest to rozwiązanie techniczne, ale na pewno pomoże.
źródło