Naprawić Git?

Pracowałem w repozytorium i zauważyłem, że plik ma lokalne zmiany. Nie chciałem ich więcej, więc usunąłem plik, myśląc, że mogę po prostu zamówić świeżą kopię. Chciałem zrobić odpowiednik Git

svn up .

Używanie git pull nie zadziałało. Niektóre losowe wyszukiwanie doprowadziło mnie do strony, gdzie ktoś polecił robić

git checkout HEAD^ src/

(src jest katalogiem zawierającym usunięty plik).

Teraz dowiaduję się, że mam oderwaną głowę. Nie mam pojęcia, co to jest. Jak mogę cofnąć?

 1024
git
Author: Peter Mortensen, 2012-04-19

13 answers

Odłączony head oznacza, że nie jesteś już na gałęzi, sprawdziłeś pojedynczy commit w historii (w tym przypadku commit poprzedni dla HEAD, tzn. HEAD^).

Jeśli chcesz usunąć twoje zmiany związane z odłączoną głową

Musisz tylko sprawdzić oddział, na którym byłeś, np.

git checkout master

Następnym razem, gdy zmienisz plik i chcesz przywrócić go do stanu w indeksie, nie usuwaj najpierw pliku, tylko do

git checkout -- path/to/foo

Spowoduje przywrócenie pliku foo do stanu w indeksie.

Jeśli chcesz zachować twoje zmiany związane z odłączoną głową

  1. Uruchom git log -n 1; wyświetli najnowszy commit na odłączonej głowicy. Skopiuj i wklej hash zatwierdzania.
  2. Run git checkout master
  3. Run git branch tmp <commit-hash>. Spowoduje to zapisanie zmian w nowej gałęzi o nazwie tmp.
  4. jeśli chcesz włączyć wprowadzone zmiany do master, Uruchom git merge tmp z oddziału master. Powinieneś być na gałęzi master Po uruchomieniu git checkout master.
 1483
Author: ralphtheninja,
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
2018-04-24 07:06:46

Jeśli zmieniłeś pliki, których nie chcesz stracić, możesz je popchnąć. Zaangażowałem je w trybie odłączonym, a następnie możesz przenieść się do tymczasowej gałęzi, aby później zintegrować się z master.

git commit -m "....."
git branch my-temporary-work
git checkout master
git merge my-temporary-work

Pobrano z:

Co zrobić z commitem wykonanym w oderwanej głowie

 382
Author: Toni Gamez,
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
2017-05-23 10:31:36

Rozwiązanie bez tworzenia tymczasowej gałęzi.

Jak wyjść ("fix") ze stanu głowicy gdy już coś zmieniłeś w tym trybie i opcjonalnie chcesz zapisać zmiany:

  1. Zatwierdź zmiany, które chcesz zachować. Jeśli chcesz przejąć którąkolwiek ze zmian, które wprowadziłeś w stanie głowy odłączonej, zatwierdź je. Like:

    git commit -a -m "your commit message"
    
  2. Odrzuć zmiany, których nie chcesz zachować. twardy reset odrzuci wszelkie uncommitted changes that you made in unstarted HEAD state:

    git reset --hard
    

    (bez tego Krok 3 by się nie powiódł, narzekając na zmodyfikowane pliki w odłączonej głowicy.)

  3. Sprawdź swój oddział. Wyjdź ze stanu głowy, sprawdzając gałąź, nad którą pracowałeś wcześniej, na przykład:

    git checkout master
    
  4. Przejmij swoje zobowiązania. możesz teraz przejąć commity, które wykonałeś w stanie odseparowanym przez cherry-picking, jak pokazano w my odpowiedź na inne pytanie .

    git reflog
    git cherry-pick <hash1> <hash2> <hash3> …
    
 117
Author: tanius,
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
2018-09-18 22:32:23

Odłączona Głowa oznacza:

  1. nie jesteś już na gałęzi,
  2. sprawdziłeś pojedynczy commit w historii

Jeśli nie masz żadnych zmian: Możesz przełączyć się na master, używając następującego polecenia

  git checkout master

Jeśli masz zmiany, które chcesz zachować:

W przypadku odłączonej głowicy, commity działają jak normalne, z tym, że żadna z nazwanych gałęzi nie zostanie zaktualizowana. Aby zaktualizować gałąź master o wprowadzone zmiany, Utwórz tymczasową gałąź tam, gdzie jesteś (w ten sposób gałąź tymczasowa będzie miała wszystkie wprowadzone zmiany w odłączonej głowicy), a następnie przełącz się na gałąź master i połącz gałąź tymczasową z master.

git branch  temp
git checkout master
git merge temp
 97
Author: Razan Paul,
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
2018-08-20 15:14:33

Oto, co zrobiłem po tym, jak zdałem sobie sprawę, że jestem na oderwanej głowie i już wprowadziłem pewne zmiany.

Popełniłem zmiany.
$ git commit -m "..."
[detached HEAD 1fe56ad] ...

Przypomniałem sobie hash (1fe56ad) commita. Potem sprawdziłem gałąź, na której powinienem być.

$ git checkout master
Switched to branch 'master'

W końcu zastosowałem zmiany commita do gałęzi.

$ git cherry-pick 1fe56ad
[master 0b05f1e] ...
Myślę, że jest to nieco łatwiejsze niż tworzenie tymczasowej gałęzi.
 50
Author: Philippe Gerber,
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
2014-08-02 23:33:49

Kiedy sprawdzasz konkretny commit w git, kończysz w stanieodłączonej głowy ...oznacza to, że twoja kopia robocza nie odzwierciedla już stanu nazwanego odniesienia (takiego jak "master"). Jest to przydatne do sprawdzania przeszłego stanu repozytorium, ale nie tego, czego chcesz, jeśli próbujesz przywrócić zmiany.

Jeśli wprowadziłeś zmiany w danym pliku i chcesz je po prostu odrzucić, możesz użyć polecenia checkout w następujący sposób:

git checkout myfile

To będzie odrzuć wszelkie niezatwierdzone zmiany i przywróć plik do stanu, który ma w nagłówku bieżącej gałęzi. Jeśli chcesz odrzucić wprowadzone zmiany, możesz użyć polecenia reset. Na przykład, spowoduje to zresetowanie repozytorium do stanu poprzedniego commita, odrzucając wszelkie kolejne zmiany:

git reset --hard HEAD^

Jeśli jednak udostępniasz repozytorium innym osobom, git reset może być uciążliwe (ponieważ usuwa część historii repozytorium). Jeśli udostępniłeś już zmiany innym ludziom, zazwyczaj chcesz przyjrzeć się git revert, która generuje "anticommit" - to znaczy tworzy nowy commit, który "wycofuje" zmiany, o których mowa.

Git Book zawiera więcej szczegółów.

 39
Author: larsks,
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
2012-04-19 13:32:18

Jeśli wprowadziłeś jakieś zmiany, a potem zdałeś sobie sprawę, że jesteś na odłączonej głowie, jest na to proste rozwiązanie: stash -> checkOut master - > stash pop:

git stash
git checkout master   # Fix the detached head state
git stash pop         # ... or for extra safety use 'stash apply' then later 
                      # after fixing everything do 'stash drop'

Będziesz miał swoje niewymagane zmiany i normalną" przymocowaną " głowę, jakby nic się nie stało.

 38
Author: mojuba,
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
2016-05-17 22:31:55

Ponieważ "odłączony stan głowy" ma Cię na tymczasowej gałęzi, po prostu użyj git checkout -, która umieszcza Cię na ostatniej gałęzi, na której byłeś.

 16
Author: Mike,
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
2016-10-06 21:35:51

Dodatek

Jeśli gałąź, do której chcesz wrócić, była ostatnią kasą, którą dokonałeś, możesz po prostu użyć checkout @{-1}. Spowoduje to powrót do poprzedniej kasy.

Ponadto, możesz nadać temu poleceniu pseudonim, na przykład, git global --config alias.prev tak, że wystarczy wpisać git prev, aby przejść z powrotem do poprzedniej kasy.

 5
Author: David Brower,
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
2016-06-22 23:12:42

Aby doprecyzować odpowiedź @ Philippe Gerber, oto ona:

git cherry-pick

Przed cherry-pick, a git checkout master jest konieczne w tym przypadku. Ponadto jest on potrzebny tylko z commit w detached head.

 4
Author: Timo,
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
2017-12-06 13:39:17
git pull origin master
Zadziałało dla mnie. Chodziło tylko o wyraźne nadanie nazwy remote i branch.
 0
Author: Amjedonline,
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
2014-05-14 14:14:25

W moim przypadku uruchomiłem git status i zobaczyłem, że mam kilka Nie śledzonych plików w moim katalogu roboczym.

Po prostu musiałem je wyczyścić (ponieważ nie potrzebowałem ich), aby uruchomić rebase, który chciałem wykonać.

 0
Author: falsarella,
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
2015-06-19 17:51:36

Może być konieczne wyczyszczenie gałęzi najpierw do Checkout master. - f wymusza akcję.

git clean -f

Wtedy będziesz mógł sprawdzić swoją gałąź masztu, jak wspomniano powyżej

git checkout master
 0
Author: Sweet Chilly Philly,
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
2017-09-07 00:34:35