Pracowałem trochę w moim repozytorium i zauważyłem, że plik zawiera zmiany lokalne. Nie chciałem ich już, więc usunąłem plik, myśląc, że mogę po prostu pobrać świeżą kopię. Chciałem zrobić odpowiednik Git
svn up .
Korzystanie git pull
nie wydawało się działać. Niektóre losowe wyszukiwanie doprowadziło mnie do strony, na której ktoś polecił zrobić
git checkout HEAD^ src/
( src
to katalog zawierający usunięty plik).
Teraz dowiaduję się, że mam odłączoną głowę. Nie mam pojęcia co to jest. Jak mogę cofnąć?
git checkout master
odeśle cię z powrotem do głównej gałęzi. Jeśli chcesz usunąć wszelkie zmiany kopii roboczej, prawdopodobnie chciałeś to zrobićgit reset --hard
.git checkout -- src/
create temp branch - checkout temp branch - checkout master - delete temp branch
working copy changes
? Czy masz na myśli zmiany, które wprowadziłeś do plików po sprawdzeniu innego zatwierdzenia (tj. Zmiany, które wprowadziłeś, gdy byłeś w stanie odłączonym)?Odpowiedzi:
Odłączona głowa oznacza, że nie jesteś już w gałęzi, sprawdziłeś pojedyncze zatwierdzenie w historii (w tym przypadku zatwierdzenie poprzedzające HEAD, tj. HEAD ^).
Jeśli chcesz usunąć zmiany związane z odłączonym HEAD
Musisz tylko sprawdzić kasę, w której byłeś, np
Następnym razem, gdy zmienisz plik i chcesz przywrócić go do stanu z indeksu, nie usuwaj go najpierw, po prostu zrób
Spowoduje to przywrócenie pliku foo do stanu, w którym znajduje się w indeksie.
Jeśli chcesz zachować zmiany związane z odłączonym HEAD
git branch tmp
- spowoduje to zapisanie zmian w nowej gałęzi o nazwietmp
.git checkout master
master
, uruchomgit merge tmp
zmaster
oddziału.master
Po uruchomieniu powinieneś być na gałęzigit checkout master
.źródło
Previous HEAD position was 7426948...
Jeśli zmieniłeś pliki, których nie chcesz utracić, możesz je przesłać. Zatwierdziłem je w trybie odłączonym, a następnie możesz przejść do gałęzi tymczasowej, aby później zintegrować się z modułem głównym.
Wypakowany z:
Co zrobić z zatwierdzeniem dokonanym w odłączonej głowie
źródło
git stash
? Ponieważ to pierwsza rzecz, jaka przychodzi mi do głowy. utworzenie nowego oddziału będzie przesadą.git rebase my-temporary-work
a następnie usunąć gałąź,git branch -d my-temporary-work
aby wyglądało to tak, jakbyś zobowiązał się do właściwej gałęzi.git stash
wydaje się być idealnym narzędziem do tego przypadku. Czy możesz napisać odpowiedź z sugerowanymi krokami, aby to osiągnąć?Rozwiązanie bez tworzenia gałęzi tymczasowej.
Jak wyjść („naprawić”) odłączony stan HEAD, gdy już coś zmieniłeś w tym trybie i, opcjonalnie, chcesz zapisać zmiany:
Zatwierdź zmiany, które chcesz zachować. Jeśli chcesz przejąć którąkolwiek ze zmian wprowadzonych w odłączonym stanie HEAD, zatwierdź ją. Lubić:
Odrzuć zmiany, których nie chcesz zachować. Twardy reset spowoduje odrzucenie wszelkich niezatwierdzonych zmian dokonanych w stanie odłączonego HEAD:
(Bez tego krok 3 nie powiódłby się, narzekając na zmodyfikowane nieprzypisane pliki w odłączonym HEAD.)
Sprawdź swój oddział. Wyjdź z odłączonego stanu HEAD, sprawdzając gałąź, nad którą pracowałeś wcześniej, na przykład:
Przejmij swoje zobowiązania. Możesz teraz przejąć zatwierdzenia dokonane w stanie odłączonym HEAD przez wybieranie, jak pokazano w mojej odpowiedzi na inne pytanie .
źródło
git reset --hard
Został dokładnie miałem potrzeby, bo chcę upstream być źródłem i lokalne zmiany powinny zostać usunięte.Odłączona głowa oznacza:
Jeśli nie masz żadnych zmian: możesz przełączyć na master, stosując następującą komendę
Jeśli masz zmiany, które chcesz zachować:
W przypadku odłączonego HEAD, zatwierdzenia działają normalnie, tyle że żadna nazwana gałąź nie jest aktualizowana. Aby zaktualizować gałąź główną z zatwierdzonymi zmianami, utwórz gałąź tymczasową tam, gdzie jesteś (w ten sposób gałąź tymczasowa będzie miała wszystkie zatwierdzone zmiany, które wprowadziłeś w odłączonym HEAD), a następnie przełącz się na gałąź główną i połącz gałąź tymczasową z mistrz.
źródło
Oto, co właśnie zrobiłem po tym, jak zdałem sobie sprawę, że jestem zdystansowany i już dokonałem pewnych zmian.
Popełniłem zmiany.
Pamiętałem skrót (1fe56ad) zatwierdzenia. Potem sprawdziłem gałąź, w której powinienem być.
W końcu zastosowałem zmiany zatwierdzenia do oddziału.
Myślę, że jest to trochę łatwiejsze niż utworzenie tymczasowej gałęzi.
źródło
git cherry-pick <hash>
.Jeśli wprowadziłeś jakieś zmiany, a następnie zdałeś sobie sprawę, że jesteś na odłączonej głowie, istnieje proste rozwiązanie tego problemu: skrytka -> kasa główna -> skrytka pop:
Będziesz miał swoje niezaangażowane zmiany i normalną „dołączoną” głowicę, jakby nic się nie wydarzyło.
źródło
Kiedy wypisujesz konkretne zatwierdzenie
git
, kończysz w stanie odłączonej głowy ... to znaczy, twoja kopia robocza nie odzwierciedla już stanu nazwanego odwołania (np. „Master”). Jest to przydatne do badania przeszłego stanu repozytorium, ale nie tego, czego chcesz, jeśli faktycznie próbujesz przywrócić zmiany.Jeśli dokonałeś zmian w określonym pliku i po prostu chcesz je odrzucić, możesz użyć następującego
checkout
polecenia:Spowoduje to odrzucenie wszelkich niezatwierdzonych zmian i przywrócenie pliku do dowolnego stanu, jaki ma w głowie bieżącego oddziału. Jeśli chcesz odrzucić zmiany, które już zatwierdziłeś, możesz użyć
reset
polecenia. Na przykład spowoduje to zresetowanie repozytorium do stanu poprzedniego zatwierdzenia, odrzucając wszelkie późniejsze zmiany:Jeśli jednak udostępniasz repozytorium innym osobom, a
git reset
może być zakłócające (ponieważ usuwa część historii repozytorium). Jeśli już podzieliłeś się zmianami z innymi ludźmi, zwykle chceszgit revert
zamiast tego spojrzeć na to , co generuje „anticommit” - to znaczy, tworzy nowe zatwierdzenie, które „cofa” dane zmiany.Księga Git ma więcej szczegółów.
źródło
git checkout path/to/foo
może być w konflikciegit checkout some-branch
, więc lepiej byłoby użyćgit checkout -- path/to/foo
do uniknięcia tych konfliktów.HEAD jest wskaźnikiem, w wyniku czego wskazuje - bezpośrednio lub pośrednio - na konkretne zatwierdzenie:
Dołączona GŁOWA oznacza, że jest dołączona do jakiejś gałęzi (tzn. Wskazuje na gałąź).
Indywidualny środek głowy, że to jest nie związane z dowolnym oddziale, czyli zwraca się bezpośrednio do niektórych popełnić.
Innymi słowy:
Aby lepiej zrozumieć sytuacje z podłączoną / odłączoną GŁOWĄ, pokażmy kroki prowadzące do kwadrupletu zdjęć powyżej.
Zaczynamy od tego samego stanu repozytorium (zdjęcia we wszystkich kwadrantach są takie same):
Teraz chcemy wykonać
git checkout
- z różnych celów w poszczególnych zdjęć (polecenia na nich są przyciemnione, aby podkreślić, że jesteśmy tylko zamiar zastosować te polecenia):Taka sytuacja występuje po wykonaniu następujących poleceń:
Jak widać, punkty głowa do celu z
git checkout
polecenia - do gałęzi (3 pierwsze wizerunki quadruplet) lub (bezpośrednio) do popełnienia (ostatni obraz quadruplet).Zmienia się także zawartość katalogu roboczego, aby była zgodna z odpowiednim zatwierdzeniem (migawką), tj. Z zatwierdzeniem wskazanym (bezpośrednio lub pośrednio) przez HEAD.
Jesteśmy teraz w takiej samej sytuacji jak na początku tej odpowiedzi:
źródło
Ponieważ „odłączony stan głowy” ma cię w gałęzi tymczasowej, po prostu użyj tego,
git checkout -
co spowoduje przejście do ostatniej gałęzi, w której byłeś.źródło
git reflog
i mogą zostać przejęte do nowego oddziału lubgit cherry-pick
do istniejącego oddziału. Zobacz to pytanie .Aby wyjaśnić odpowiedź @Filippe Gerber, oto ona:
Przed
cherry-pick
, Agit checkout master
jest w tym przypadku konieczne. Co więcej, jest ona potrzebna tylko przycommit
indetached head
.źródło
Uzupełnienie
Jeśli gałąź, do której chcesz wrócić, była ostatnią dokonaną przez ciebie kasą, możesz po prostu użyć
checkout @{-1}
. Spowoduje to powrót do poprzedniej kasy.Ponadto możesz aliasować to polecenie, na przykład,
git global --config alias.prev
aby wystarczyło wpisać,git prev
aby przełączyć się z powrotem do poprzedniej kasy.źródło
Bycie w „odłączonej głowie” oznacza, że HEAD odnosi się do konkretnego nienazwanego zatwierdzenia (w przeciwieństwie do nazwanego oddziału) (por. Https://git-scm.com/docs/git-checkout sekcja Odłączona głowa )
Aby rozwiązać problem, wystarczy wybrać gałąź wybraną wcześniej przez
git checkout @{-1}
źródło
Gdy jesteś w sytuacji odłączonej głowy i utworzyłeś nowe pliki, najpierw upewnij się, że te nowe pliki zostały dodane do indeksu, na przykład:
Ale jeśli zmieniłeś lub usunąłeś tylko istniejące pliki, możesz dodać (-a) i zatwierdzić wiadomość (-m) w tym samym czasie poprzez:
Następnie możesz po prostu utworzyć nowy oddział z bieżącym stanem za pomocą:
Będziesz miał nowy oddział, a wszystkie dostosowania będą tam w tym nowym oddziale. Następnie możesz dalej naciskać na zdalne sterowanie i / lub kasować / wyciągać / scalać, jak chcesz.
źródło
Git powiedział mi, jak to zrobić.
jeśli wpiszesz:
Zapisz status
Następnie:
źródło
Chciałem zachować moje zmiany, więc naprawiam to ...
to działa dla mnie
źródło
Zwykle
HEAD
wskazuje na gałąź. Gdy nie wskazuje gałęzi, a zamiast tego wskazuje na skrót zatwierdzenia69e51
, oznacza to, że masz odłączony HEAD. Musisz wskazać dwa oddział, aby rozwiązać problem. Możesz zrobić dwie rzeczy, aby to naprawić.hash
źródło
Odłączona głowa oznacza, że nie sprawdziłeś poprawnie swojego oddziału lub właśnie sprawdziłeś pojedynczy zatwierdzenie.
Jeśli napotkasz taki problem, najpierw ukryj zmiany lokalne, aby ich nie utracić.
Następnie ... sprawdź żądany oddział za pomocą polecenia:
Powiedzmy, że chcesz mieć oddział MyOriginalBranch:
git checkout -b someName origin / MyOriginalBranch
źródło
prawdopodobnie zrobiłeś
git reset --hard origin/your-branch
.Spróbuj po prostu
git checkout your-branch
źródło
pracował dla mnie. Chodziło tylko o jawne podanie nazwy zdalnego i oddziału.
źródło
W moim przypadku uruchamiam
git status
i zobaczyłem, że mam kilka nieśledzonych plików w moim katalogu roboczym.Po prostu musiałem je wyczyścić (ponieważ ich nie potrzebowałem), aby uruchomić bazę, którą chciałem wykonać.
źródło
To działa dla mnie, przypisuje nową gałąź dla odłączonej głowy:
git kasa nowa_nazwa_gałęzi_nazwa_nazwy_grupy
źródło
Odłączony HEAD oznacza, że obecnie nie jesteś w żadnej gałęzi. Jeśli chcesz ZACHOWAĆ bieżące zmiany i po prostu utworzyć nowy oddział, wykonaj następujące czynności:
Następnie potencjalnie chcesz połączyć ten nowy oddział z innymi oddziałami. Zawsze pomocne jest polecenie git „pies” :
źródło