Git Stash blunder: git stash pop i zakończył się konfliktem scalania

Zrobiłem git stash pop i skończyło się konfliktem scalania. Usunąłem pliki z systemu plików i zrobiłem git checkout, Jak pokazano poniżej, ale myśli, że pliki są nadal niezalegane. Następnie próbowałem zastąpić pliki i zrobić git checkout ponownie i ten sam wynik. I event tried forcing it with -f flag. Każda pomoc będzie mile widziana!

chirag-patels-macbook-pro:haloror patelc75$ git status
app/views/layouts/_choose_patient.html.erb: needs merge
app/views/layouts/_links.html.erb: needs merge
# On branch prod-temp
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   db/schema.rb
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       unmerged:   app/views/layouts/_choose_patient.html.erb
#       unmerged:   app/views/layouts/_links.html.erb

chirag-patels-macbook-pro:haloror patelc75$ git checkout app/views/layouts/_choose_patient.html.erb
error: path 'app/views/layouts/_choose_patient.html.erb' is unmerged
chirag-patels-macbook-pro:haloror patelc75$ git checkout -f app/views/layouts/_choose_patient.html.erb
warning: path 'app/views/layouts/_choose_patient.html.erb' is unmerged
Author: Chirag Patel, 2010-05-15

4 answers

Zobacz man git merge (Jak rozwiązywać konflikty):

Po zobaczeniu konfliktu, możesz zrobić dwie rzeczy:

  • Zdecyduj się nie łączyć. Jedyne, czego potrzebujesz, to zresetowanie pliku indeksu do głównego commita, aby odwrócić 2. i sprzątanie pracujące zmiany drzewa dokonane przez 2. i 3.; git-reset --hard można do tego użyć.

  • Rozwiązywać konflikty. Git zaznaczy konflikty w roboczym drzewie. Edytuj pliki do kształtu i git dodaje je do indeksu. Użyj git commit, aby przypieczętować transakcję.

I Pod TRUE MERGE (aby zobaczyć co 2. i 3. odnosi się do):

Kiedy nie jest oczywiste, jak pogodzić zmiany, następują następujące rzeczy:

  1. Wskaźnik głowy pozostaje taki sam.

  2. Ref MERGE_HEAD jest ustawiony tak, aby wskazywał na inną gałąź.

  3. Ścieżki, które zostały połączone są aktualizowane zarówno w pliku indeksu, jak i w twoje drzewo pracy.

  4. ...

Więc: użyj git reset --hard, jeśli chcesz usunąć zmiany skrytki z drzewa roboczego, lub git reset, jeśli chcesz po prostu oczyścić indeks i pozostawić konflikty w drzewie roboczym do ręcznego scalania.

Under man git stash (OPTIONS, pop ) można przeczytać dodatkowo:

Zastosowanie stanu może zakończyć się niepowodzeniem w przypadku konfliktów; w tym przypadku nie jest on usuwany z listy skrytek. Musisz rozwiązać konflikty ręcznie i wywołanie git stash drop ręcznie później.

 216
Author: tanascius,
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-12 17:09:39

Mi się przytrafiło coś podobnego. Nie chciałem jeszcze wystawiać plików, więc dodałem je za pomocą git add, a potem zrobiłem git reset. To w zasadzie po prostu dodało, a następnie odinstalowało moje zmiany, ale wyczyściło niezalegane ścieżki.

 40
Author: Aaron,
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-05-04 17:10:31

Jeśli, tak jak ja, zwykle chcesz zastąpić zawartość katalogu roboczego zawartością przechowywanych plików, a nadal masz konflikt, to chcesz rozwiązać konflikt za pomocą git checkout --theirs -- . z katalogu głównego.

Następnie możesz git reset przenieść wszystkie zmiany z indeksu do katalogu roboczego, ponieważ najwyraźniej w przypadku konfliktu zmiany w plikach bez konfliktu pozostają w indeksie.

Możesz też uruchomić git stash drop [<stash name>] później, aby pozbyć się stash, ponieważ git stash pop nie usuwa go w przypadku konfliktów.

 11
Author: Pedro Gimeno,
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-06 23:18:05

Zauważ, że Git 2.5 (Q2 2015) przyszły Git może próbować uniemożliwić ten scenariusz.

Zobacz commit ed178ef by Jeff King (peff), 22 Kwiecień 2015.
(dodany przez Junio C Hamano -- gitster -- in commit 05c3967 , 19 maja 2015)

Uwaga: to zostało przywrócone. Patrz poniżej .

stash: wymagaj czystego indeksu, aby zastosować / pop

Problem

Jeśli jeśli zawartość Twojego indeksu jest ustawiona i uruchomisz "stash apply/pop", możemy napotkać konflikt i umieścić nowe wpisy w indeksie.
powrót do pierwotnego stanu jest w tym momencie trudny, ponieważ narzędzia takie jak" Git reset --keep " zdmuchną wszystko, co zostało zainscenizowane.

Innymi słowy:

"git stash pop/apply" zapomniałem upewnić się, że nie tylko drzewo robocze jest czyste, ale także indeks jest czysty.
To ostatnie jest ważne, ponieważ aplikacja stash może być skonfliktowana, A Indeks zostaną wykorzystane do rozwiązywania konfliktów.

Rozwiązanie

Możemy uczynić to bezpieczniejszym, odmawiając zastosowania, gdy są ustawione zmiany.

Oznacza to, że jeśli wcześniej nastąpiły scalenia z powodu zastosowania skrytki na zmodyfikowanych plikach (dodanych, ale nie zatwierdzonych), teraz nie będą to żadne scalenia, ponieważ stash apply / pop zatrzymałby się natychmiast przez:

Cannot apply stash: Your index contains uncommitted changes.

Zmuszanie do zatwierdzania zmian oznacza, że w przypadku łączenia można łatwo Przywróć stan początkowy (przed git stash apply/pop) za pomocą git reset --hard.


Zobacz commit 1937610 (15 Jun 2015) i commit ed178ef (22 Apr 2015) przez Jeff King (peff).
(dodany przez Junio C Hamano -- gitster -- in commit bfb539b, 24 Jun 2015)

Ten commit był próbą poprawy bezpieczeństwa stosowania stash, ponieważ proces aplikacji może tworzyć skonfliktowanych wpisów indeksu, po czym trudno przywrócić oryginalny stan indeksu.

Niestety, to rani niektóre popularne przepływy pracy wokół "git stash -k", takie jak:

git add -p       ;# (1) stage set of proposed changes
git stash -k     ;# (2) get rid of everything else
make test        ;# (3) make sure proposal is reasonable
git stash apply  ;# (4) restore original working tree

Jeśli "git commit" pomiędzy krokami (3) i (4), to po prostu działa. Jednakże, jeśli te kroki są częścią Pre-commit hook, nie masz takiej możliwości (musisz przywrócić stan pierwotny niezależnie od tego, czy testy przeszły, czy nie powiodło się).

 2
Author: VonC,
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-25 08:07:44