Git: „Obecnie nie w żadnym oddziale”. Czy istnieje prosty sposób na powrót do oddziału przy zachowaniu zmian?


201

Więc zrobiłem trochę pracy w repozytorium, a kiedy mam zamiar zatwierdzić, zdaję sobie sprawę, że obecnie nie jestem w żadnej gałęzi.

Zdarza się to często podczas pracy z submodułami i jestem w stanie to rozwiązać, ale proces jest żmudny i myślałem, że musi być łatwiejszy sposób na zrobienie tego.

Czy istnieje prosty sposób na powrót do oddziału przy zachowaniu zmian?

Odpowiedzi:


213

Jeśli nie popełniłeś:

git stash
git checkout some-branch
git stash pop

Jeśli zobowiązałeś się i nic nie zmieniłeś od tego czasu:

git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}

Jeśli popełniłeś, a następnie wykonałeś dodatkową pracę:

git stash
git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}
git stash pop

16
Ten nie pomaga, jeśli już się popełniłeś. Nie głosuj jednak negatywnie, ponieważ nie zostało to określone w pytaniu.
Dean Raczej

24
jeśli już dokonałeś: zwróć uwagę na skrót dokonanego zatwierdzenia (użyj git showlub git rev-parse HEAD), przejdź do gałęzi, a następnie git cherry-pickskrótu zatwierdzenia.
araqnid

7
Jeśli zostanie zatwierdzony, uzyskaj skrót ostatniego zatwierdzenia. Kasa, w której chcesz być, igit merge _hash_
Daniel

BĄDŹ NAPRAWDĘ OSTROŻNY. JEŚLI ZOBOWIĄZALIŚ SIĘ ZMIANĄ i wykonasz następujące kroki ... Zobaczysz komunikat ... „Twój oddział i pochodzenie / jednostka główna rozeszły się”.
thinkanotherone 21.12.12

1
@thinkanotherone Jeśli już zatwierdziłeś swoje zmiany, nie byłoby nic do ukrycia, a sprawdzenie innej gałęzi to nie koniec świata. Dokonane właśnie zatwierdzenie jest nadal dostępne i możesz połączyć je z tym oddziałem za pomocą git merge <hash-of-the-commit-you-just-made>.
Erik B

160

to mi pomogło

git checkout -b newbranch
git checkout master
git merge newbranch
git branch -d newbranch

25
Jeśli dokonałeś już wielu zatwierdzeń, musisz to zrobić.
Benjamin Oakes

Nie próbowałem tego, ale wygląda na to, że zadziała. Myślę jednak, że jest to mało prawdopodobny scenariusz. Wierzę, że większość ludzi zda sobie sprawę, że nie ma ich w żadnej gałęzi, zanim popełnią i użyją przyjętej odpowiedzi, aby to naprawić.
Erik B

49
Byłbyś zaskoczony.
Eric

@ErikB Nawet nie wiedziałem, że istnieje coś takiego, jak brak bycia na oddziale. Ta odpowiedź była dla mnie bardzo pomocna.
Konstantin Schubert,

2
piękna odpowiedź, właściwie napisałem ją i zadziałało, w przeciwieństwie do prawie wszystkiego, co spotkałem jako początkujący GIT - możesz zauważyć, że newbranch to arbitrary name i nie powinno być zastępowane hashem zatwierdzającym
Toni Leigh

22
git checkout master

To wynik czegoś takiego:

Warning: you are leaving 2 commits behind, not connected to
any of your branches:

1e7822f readme
0116b5b returned to clean django

If you want to keep them by creating a new branch, this may be a good time to do so with:
git branch new_branch_name 1e7822f25e376d6a1182bb86a0adf3a774920e1e

Więc zróbmy to:

git merge 1e7822f25e376d6a1182bb86a0adf3a774920e1e

Nie próbowałem tego, ale wygląda na to, że zadziałałoby dobrze. Sądzę, że gdybyś uruchomił się git gcmiędzy uruchomieniem tych dwóch poleceń, straciłbyś te zatwierdzenia, ale chyba, że ​​uruchamiasz się git gcautomatycznie, powinno to być dość wolne od ryzyka podejście. Nadal wybrałbym odpowiedź babay, ale jeśli chcesz uchronić się przed napisaniem dwóch dodatkowych poleceń, myślę, że to jest właściwy sposób.
Erik B

W pewnym momencie opuściłem oddział master, co nie jest do końca pewne. Popełniłem swoje zmiany, nie wprowadzono żadnych zmian w mistrzu. Te instrukcje przyniosły moje zmiany w gałęzi master i wszystko było w porządku.
Matti Jokipii,

+1 Byłem zdenerwowany tym, że sprawdziłem inny oddział, pozostawiając za sobą commity, widząc, że ta wiadomość dodała pewności siebie.
J-Dizzle

11

Pozostawiając tutaj inną drogę

git branch newbranch
git checkout master 
git merge newbranch 

3
@ErikB Być może dokonał wielu zmian. W takim przypadku zobacz odpowiedź babay.
Benjamin Oakes

@BenjaminOakes Może tak być, ale te polecenia git nie są nawet prawidłowe.
Erik B

@ErikB Zdecydowanie prawda. :) Odpowiedź babay jest prawidłową formą tego, co Alex próbował zrobić.
Benjamin Oakes

9

Alternatywnie, możesz skonfigurować swoje podmoduły, aby zamiast znajdować się w domyślnym stanie odłączonej głowy, sprawdź gałąź.

Edytowano, aby dodać:

Jednym ze sposobów jest wyewidencjonowanie określonej gałęzi submodułu, gdy dodasz go za pomocą flagi -b:

git submodule add -b master <remote-repo> <path-to-add-it-to>

Innym sposobem jest po prostu przejście do katalogu submodułów i po prostu sprawdzenie

git checkout master

1
Czy możesz mi powiedzieć, jak to zrobić?
Erik B,

czy istnieje sposób na zaktualizowanie istniejącego submodułu w tym domyślnym trybie gałęzi? aktualizacja gitmodulesmoże?
Hertzel Guinness

@HertzelGuinness Nie bardzo. Podmoduł jest sprawdzany w konkretnym zatwierdzeniu sha. Gałąź jest tylko wskaźnikiem do sha, a sha, którą wskazuje, może się zmienić. Nie jest to przydatne, ponieważ nie zamraża stanu pobranego podmodułu. Sprawdzanie oddziału jest tylko wygodą, jeśli wprowadzasz zmiany w submodule.
Abizern

5

Jednym ze sposobów, aby skończyć w tej sytuacji, jest zrobienie bazy z odległej gałęzi. W tym przypadku nowe zatwierdzenia są wskazywane przez, HEADale masternie wskazują na nie - wskazuje na to, gdzie było, zanim zmieniłeś podstawę drugiej gałęzi.

Możesz ustawić to jako nowe master, wykonując:

git branch -f master HEAD
git checkout master

To wymusza aktualizację masterdo wskazania HEAD(bez zakładaniamaster ), a następnie przełącza się master.


Działa idealnie zgodnie z wymaganiami. Już zainscenizowałem pliki i zatwierdziłem, ale nie mogłem przesłać z powodu powyższego błędu. Powyższe dwa wiersze kodu działały idealnie i wypchnęły mój kod zgodnie z oczekiwaniami.
invinciblemuffi

4

Niedawno znów napotkałem ten problem. Minęło trochę czasu, odkąd ostatnio pracowałem z submodułami i dowiedziałem się więcej o git, zdałem sobie sprawę, że wystarczy sprawdzić gałąź, którą chcesz zatwierdzić. Git zatrzyma działające drzewo, nawet jeśli go nie ukryjesz.

git checkout existing_branch_name

Jeśli chcesz pracować w nowym oddziale, powinno to działać dla Ciebie:

git checkout -b new_branch_name

Kasa zakończy się niepowodzeniem, jeśli masz konflikty w działającym drzewie, ale powinno to być dość nietypowe, a jeśli tak się stanie, możesz po prostu schować je, pop i rozwiązać konflikt.

W porównaniu z zaakceptowaną odpowiedzią ta odpowiedź pozwoli Ci zaoszczędzić na wykonaniu dwóch poleceń, których wykonanie i tak nie zajmuje tak długo. Dlatego nie zaakceptuję tej odpowiedzi, chyba że w cudowny sposób uzyska więcej głosów pozytywnych (lub przynajmniej bliskich) niż obecnie akceptowana odpowiedź.


2

Następująca metoda może działać:

git rebase HEAD master
git checkout master

Spowoduje to bazowanie twoich bieżących zmian HEAD na kapitale. Następnie możesz zmienić gałąź.


Alternatywnym sposobem jest najpierw sprawdzenie oddziału:

git checkout master

Następnie Git powinien wyświetlić SHA1 z twoich odłączonych zatwierdzeń, a następnie możesz je wybrać, np

git cherry-pick YOURSHA1

Możesz też scalić najnowszą:

git merge YOURSHA1

Aby zobaczyć wszystkich zatwierdzeń z różnych branż (upewnij się, że je mam), uruchom: git reflog.


0

Wiem, że powiedziałem babay w 2012 roku, że myślałem, że jest mało prawdopodobne, aby ktoś nie zdawał sobie sprawy, że nie ma go na gałęzi i nie popełnia. Tak mi się właśnie stało, więc chyba muszę się przyznać, że się myliłem, ale biorąc pod uwagę, że minęło to do 2016 r., Można się sprzeciwić, że w rzeczywistości jest to mało prawdopodobne.

W każdym razie, moim zdaniem utworzenie nowego oddziału jest przesadą. Wszystko co musisz zrobić to:

git checkout some-branch
git merge commit-sha

Jeśli nie skopiowałeś commit-sha przed sprawdzeniem drugiego oddziału, możesz go łatwo znaleźć, uruchamiając:

git reflog

to rzadki (mało prawdopodobny) problem dla jednego mężczyzny. Nie zdarzyło mi się to od 2012 roku. Ale jeśli pomnożysz szansę na ilość użytkowników git ... To będzie bardzo prawdopodobne. Może się zdarzyć komuś codziennie. :)
babay
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.