Wystrzeliłem skrytkę i doszło do konfliktu scalenia. W przeciwieństwie do pytania wymienionego jako duplikat, miałem już kilka niezatwierdzonych zmian w katalogu, które chciałem zachować. Nie tylko chcę, aby konflikt scalania zniknął, ale także przywrócić mój katalog do stanu sprzed pop.
Próbowałem git merge --abort
, ale git twierdził, że nie trwa scalanie. Czy istnieje prosty sposób na przerwanie pop bez niszczenia zmian, które pierwotnie miałem w katalogu?
git stash pop
nieczystego, pracującego reż. W takim przypadku możesz po prostu,git reset --hard
a twoja skrytka jest nadal nienaruszona. (To mniej więcej sugeruje powiązany link @ BradKoch)Odpowiedzi:
Ok, myślę, że opracowałem „git stash unapply”. Jest to bardziej złożone niż
git apply --reverse
dlatego, że potrzebujesz odwrotnego scalania na wypadek, gdyby połączenie zostało wykonane przezgit stash apply
.Odwrotne scalanie wymaga, aby wszystkie bieżące zmiany zostały wprowadzone do indeksu:
git add -u
Następnie odwróć to,
merge-recursive
co zostało zrobione przezgit stash apply
:git merge-recursive stash@{0}: -- $(git write-tree) stash@{0}^1
Teraz pozostaną Ci tylko zmiany bez skrytki. Będą w indeksie. Możesz użyć,
git reset
aby cofnąć zmiany, jeśli chcesz.Biorąc pod uwagę, że twój oryginał
git stash apply
zawiódł, zakładam, że sytuacja odwrotna również może się nie powieść, ponieważ niektóre rzeczy, które chce cofnąć, nie zostały wykonane.Oto przykład pokazujący, w jaki sposób kopia robocza (via
git status
) znów jest czysta:źródło
git stash apply
nigdy nie upuszcza skrytki, a gdy scalenie się nie powiedzie,git stash pop
zachowuje również skrytkęMój przypadek użycia: właśnie próbowałem wyskoczyć na niewłaściwą gałąź i dostałem konflikty. Wszystko, czego potrzebuję, to cofnąć pop, ale zachować go na liście skrytek, aby mógł wyskoczyć na właściwej gałęzi. Ja to zrobiłem:
Łatwo.
źródło
stash pop
wejścia do niego. To brzmi jak przepis na katastrofę.Edycja: Z
git help stash
dokumentacji w sekcji pop:Stosowanie stanu może zakończyć się niepowodzeniem w przypadku konfliktów; w takim przypadku nie jest usuwany z listy skrytek. Musisz rozwiązać konflikty ręcznie i później ręcznie wywołać zrzut git.
Jeśli używana jest opcja --index, wówczas próbuje przywrócić nie tylko zmiany działającego drzewa, ale także zmiany indeksu. Może się to jednak nie powieść, gdy wystąpią konflikty (które są przechowywane w indeksie, w związku z czym nie można już stosować zmian w takim stanie, w jakim były pierwotnie).
Spróbuj wydrukować całe swoje repozytorium do nowego katalogu (więc masz jego kopię) i uruchom:
git stash show
i zapisz gdzieś to wyjście, jeśli ci na tym zależy.następnie:
git stash drop
aby usunąć sprzeczną skrytkę, a następnie:git reset HEAD
To powinno pozostawić twoje repo w stanie, w jakim było wcześniej (mam nadzieję, że nadal nie byłem w stanie naprawić twojego problemu)
===
Próbuję zareagować na twój problem, ale wszystko, co dostaję, gdy używamy
git stash pop
to:W czystym reż:
Nie widzę, żeby git próbował scalić moje zmiany, po prostu się nie udaje. Czy masz jakieś kroki repro, które możemy wykonać, aby Ci pomóc?
źródło
Zawsze używałem
git reset --merge
Nie pamiętam, żeby kiedykolwiek zawiodła.
źródło
git reset
. Czy wiesz, czy jest funkcjonalnie identycznygit reset --merge
?Jeśli nie musisz się martwić o jakiekolwiek inne zmiany, które wprowadziłeś i chcesz po prostu wrócić do ostatniego zatwierdzenia, możesz:
źródło
OK, myślę, że udało mi się znaleźć przepływ pracy, który doprowadzi cię z powrotem do miejsca, w którym musisz być (tak jakbyś nie zrobił popu).
ZAPRASZAMY WCZEŚNIEJ! Nie wiem, czy to zadziała, więc skopiuj całe repozytorium na wypadek, gdyby nie zadziałało.
1) Napraw problemy z łączeniem i napraw cały konflikt, wybierając wszystkie zmiany, które pochodzą z łatki (w żółwiku pokazuje się to jako jeden. REMOETE (ich)).
2) Zatwierdź te zmiany (zostaną one już dodane za pomocą polecenia scaletool). Przekaż mu komunikat zatwierdzenia „scalenia” lub coś, co pamiętasz.
3) Teraz nadal będziesz mieć lokalne nieskalowane zmiany, które zacząłeś pierwotnie, z nowym zatwierdzeniem z łatki (możemy się tego później pozbyć). Teraz zatwierdź swoje nieetapowe zmiany
4) Odwróć łatkę. Można to zrobić za pomocą następującego polecenia:
5) Zatwierdź następujące zmiany:
6) Pozbądź się patch / unpatch commits
z tego usuń dwie linie z „scaleniem” i „odwróconą łatką”.
7) Odzyskaj niezmienione zmiany z powrotem i cofnij zatwierdzenie „zmiany lokalne”
Przeanalizowałem go z prostym przykładem i pozwala wrócić do miejsca, w którym chcesz być - bezpośrednio przed wyskakowaniem skrytki, z lokalnymi zmianami i skrytką nadal dostępną.
źródło
git stash show -p | git apply -R
to nie działa, jeśligit stash apply
faktycznie się scaliło. Zobacz moją odpowiedź ...Rozwiązałem to w nieco inny sposób. Oto co się stało.
Najpierw wpadłem na niewłaściwą gałąź i dostałem konflikty. Skrytka pozostała nienaruszona, ale indeks był w trakcie rozwiązywania konfliktów, blokując wiele poleceń.
Prosty
git reset HEAD
przerwał rozwiązywanie konfliktu i pozostawił niezaangażowane (i NIEZALEŻNE ) zmiany.Kilka
git co <filename>
przywróciło indeks do stanu początkowego. W końcu zmieniłem gałąźgit co <branch-name>
i uruchomiłem nowągit stash pop
, która rozwiązała się bez konfliktów.źródło
Jakieś pomysły:
Służy
git mergetool
do dzielenia plików scalania na oryginalne i nowe części. Mam nadzieję, że jednym z nich jest plik ze zmianami nieprzechowującymi.Zastosuj różnicę skrytki w odwrotnej kolejności, aby cofnąć tylko te zmiany. Prawdopodobnie będziesz musiał ręcznie rozdzielić pliki z konfliktami scalania (co, mam nadzieję, zadziała powyższa sztuczka).
Nie testowałem żadnego z nich, więc nie wiem na pewno, czy będą działać.
źródło
Mógłbym odtworzyć czysty
git stash pop
katalog „brudny” z niezatwierdzonymi zmianami, ale jeszcze nie pop, który generuje konflikt scalania.Jeśli podczas konfliktu scalenia skrytka, którą próbujesz zastosować, nie zniknęła, możesz spróbować zbadać
git show stash@{0}
(opcjonalnie z--ours
lub--theirs
) i porównać zgit statis
igit diff HEAD
. Powinieneś być w stanie zobaczyć, które zmiany pochodzą z zastosowania skrytki.źródło
Jeśli DavidG ma rację, że nie wyskoczył z ukrycia z powodu konfliktu scalenia, wystarczy wyczyścić katalog roboczy. Szybko
git commit
wszystko, na czym Ci zależy. (Możesz zrobićreset
lubsquash
zatwierdzić później, jeśli nie skończyłeś.) Następnie ze wszystkim, co zależy Ci na bezpieczeństwie,git reset
wszystko inne, cogit stash pop
zrzuciło do twojego katalogu roboczego.źródło
Jeśli przed
git stash pop
, jak w pytaniu, nie było zmian etapowych , wówczas powinny działać następujące dwa polecenia.Pierwszy odwraca wszelkie scalenia ze skrytki, udane lub nie. Drugi usuwa wszelkie nieśledzone pliki wprowadzone przez skrytkę.
Od
man git stash
:The working directory must match the index.
co wskazuje @DavidG,stash pop
zakończy się niepowodzeniem, jeśli wystąpią jakiekolwiek konflikty aktualnie zmodyfikowanych plików. W związku z tym nie powinniśmy martwić się rozwiązywaniem konfliktów scalania poza powrotem do nichHEAD
. Wszelkie pozostałe zmodyfikowane pliki nie są następnie powiązane ze skrytką i zostały zmodyfikowane przedstash pop
Jeśli wystąpiły zmiany etapowe, nie jestem pewien, czy możemy polegać na tych samych poleceniach i możesz spróbować techniki @Ben Jackson. Sugestie docenione ..
Oto konfiguracja testowania dla wszystkich różnych przypadków https://gist.github.com/here/4f3af6dafdb4ca15e804
źródło
Służy
git reflog
do wyświetlania wszystkich zmian dokonanych w historii git. Skopiuj identyfikator akcji i wpiszgit reset ACTION_ID
źródło
Publikuję tutaj w nadziei, że moja odpowiedź będzie dla innych pomocna. Miałem podobny problem, kiedy próbowałem zrobić skrytkę na innej gałęzi niż ta, z której się ukryłem. W moim przypadku nie miałem żadnych plików, które nie zostały zatwierdzone ani nie były w indeksie, ale nadal dostałem się do sprawy dotyczącej konfliktów scalania (taka sama jak @pid). Jak inni zauważyli wcześniej, nieudany pop git stash rzeczywiście zachował moją skrytkę, a następnie szybki reset gita HEAD plus powrót do mojej oryginalnej gałęzi i zrobienie skrytki stamtąd rozwiązało mój problem.
źródło