Wymuś git stash, aby zastąpił dodane pliki

223

Mam kilka plików, które nie zostały wyśledzone w git. Wprowadziłem kilka zmian i chciałem je zatwierdzić, ale zdałem sobie sprawę, że zapomniałem najpierw sprawdzić niezmodyfikowane pliki. Więc ukryłem pliki, a następnie dodałem niezmodyfikowane wersje.

Następnie, kiedy stosuję ukrytą skrzynkę w repozytorium, dostaję konflikty z powodu dodanych plików.

Jak mogę zastosować skrytkę i zmusić wersje w skrytce do użycia zamiast oryginałów w repozytorium?

Dzięki

Stefan
źródło
7
Brzydkie rozwiązanie, dopóki ktoś nie wymyśli lepszego: usuń nowe pliki git rmprzed użyciem git stash apply.
tom
Czy to nie straci historii? Powodem dodania niezmodyfikowanych wersji było zachowanie historii.
Stefan
1
Nie, nie straci historii. Jeśli usuniesz plik, dodaj go z niewielką modyfikacją, a następnie zatwierdź, gitpotraktuje go jak drobną modyfikację.
tom

Odpowiedzi:

364

Użyj git checkoutzamiast git stash apply:

$ git checkout stash -- .
$ git commit

Spowoduje to przywrócenie wszystkich plików w bieżącym katalogu do ich ukrytej wersji.


Jeśli istnieją zmiany w innych plikach w katalogu roboczym, które powinny być przechowywane, oto mniej wymagająca alternatywa:

$ git merge --squash --strategy-option=theirs stash

Jeśli w indeksie wystąpią zmiany lub scalenie dotknie plików zmianami lokalnymi, git odmówi scalenia. Poszczególne pliki można pobrać ze skrytki za pomocą

$ git checkout stash -- <paths...>

lub interaktywnie z

$ git checkout -p stash
Tomek
źródło
Żadne z nich nie działało w moim przypadku użycia. Ustalenia i moje rozwiązanie są tutaj stackoverflow.com/a/26685296/496046 - to także powinno rozwiązać twoją sytuację, @AlexanderBird
tremby
2
git checkout stash -- .To polecenie dosłownie nic nie zrobiło, gdy je uruchomiłem.
Rotsiser Mho,
3
@RotsiserMho Git nie jest zbyt dobry w dostarczaniu wiadomości potwierdzających. Jesteś pewien, że nic nie zrobił? Działa dobrze dla mnie.
Sinjai,
5
Musiałem uruchomić git checkout stash -- .w najwyższym folderze nadrzędnym, który zawierał moje zmiany, w przeciwnym razie zastosowałby zmiany tylko do folderu, z którego uruchomiłem polecenie.
Leo
1
@Leo: Zgadza się, ponieważ .określa bieżący katalog (możesz go zastąpić inną ścieżką zamiast zmieniać katalog). Zaktualizowałem swoją odpowiedź, aby była bardziej przejrzysta.
tom
13

git stash show -p | git apply

a następnie, git stash dropjeśli chcesz upuścić ukryte przedmioty.

Hasan TBT
źródło
2
Uwaga: powinieneś być w katalogu głównym repozytorium, aby to działało poprawnie, w przeciwnym razie dostaniesz to .
Ruslan
@PengheGeng Jak widać odpowiedziałem około rok przed NetEmmanuel
Hasan TBT
@ Ruslan dostaję to, gdy jestem w katalogu głównym mojego repozytorium Le
Leo
6

Aby wymusić git stash popuruchomienie tego polecenia

git stash show -p | git apply && git stash drop
NetEmmanuel
źródło
1

TL; DR:

git checkout HEAD path/to/file
git stash apply

Długa wersja:

Ten błąd występuje z powodu niezamierzonych zmian, które chcesz zastąpić. Cofnij te zmiany za pomocą git checkout HEAD. Możesz cofnąć zmiany w określonym pliku za pomocą git checkout HEAD path/to/file. Po usunięciu przyczyny konfliktu możesz złożyć wniosek jak zwykle.

Użytkownik12547645
źródło