Jak odrzucić zmiany w mojej kopii roboczej, których nie ma w indeksie?
git
version-control
Tylko czytać
źródło
źródło
git-clean
usuwa tylko nieśledzone pliki z działającego drzewa git-scm.com/docs/git-cleangit-clean -df
może być niebezpieczne. Spowoduje to usunięcie lokalnych nieśledzonych plików (np. Objętych .gitignore). Przeczytaj uważnie wszystkie poniższe informacje i rozważ wypłatę git. zamiastgit status
daje sugestię, jak to zrobić!git checkout -- .
git status
daje sugestię:git restore
.git restore
jest nowym poleceniem właśnie w tym celu. Zobacz moją aktualizację 2019 .Odpowiedzi:
Innym szybszym sposobem jest:
Nie musisz uwzględniać,
--include-untracked
jeśli nie chcesz być do tego dokładny.Następnie możesz upuścić tę skrytkę za pomocą
git stash drop
polecenia, jeśli chcesz.źródło
--include-untracked
.git reset
Polecenie odrzucić zmiany w indeksie też.git stash
, ani żadna odmianagit checkout
nie odrzuci usuniętych etapów. Według danych wyjściowychgit status
, prawdziwa poprawna odpowiedź tutaj jest trochę smakugit reset HEAD
git checkout -- .
wykonuje zadanie za pomocą tylko jednego polecenia.Dla wszystkich plików niestacjonarnych w bieżącym katalogu roboczym użyj:
Do konkretnego pliku użyj:
--
tutaj, aby usunąć niejednoznaczność argumentów .źródło
git status
error: The following untracked working tree files would be overwritten by checkout: ...
.git checkout -- .
oznacza to samogit checkout .
, z wyjątkiem tego, że wyrażasz się jasno o tym, że nie podajesz nazwy oddziału. Obaj mówią, że kasa w wersji HEAD w gałęzi, w której aktualnie pracuję, to „”. lub „./”. Jeśli zrobisz togit checkout branch-name directory-or-file-name
ogólnie, otrzymasz HEAD w wersjidirectory-or-file-name
na oddziałbranch-name
.Wygląda na to, że kompletne rozwiązanie to:
git clean
usuwa wszystkie nieśledzone pliki ( ostrzeżenie : chociaż nie usuwa zignorowanych plików wymienionych bezpośrednio w .gitignore, może usuwać zignorowane pliki znajdujące się w folderach ) igit checkout
usuwa wszystkie niestabilne zmiany.źródło
git reset --hard
Sprawdza to bieżący indeks bieżącego katalogu, odrzucając wszystkie zmiany plików z bieżącego katalogu w dół.
lub ten, który sprawdza wszystkie pliki z indeksu, zastępując pliki drzewa roboczego.
źródło
git checkout .
igit checkout -- .
?git stash save --keep-index
.Czyści drzewo robocze, rekurencyjnie usuwając pliki, które nie są pod kontrolą wersji, zaczynając od bieżącego katalogu.
-d
: Usuń nieśledzone katalogi oprócz nieśledzonych plików-f
: Force (może nie być konieczne w zależności odclean.requireForce
ustawienia)Uruchom,
git help clean
aby zobaczyć instrukcjęźródło
Moim ulubionym jest
To pozwala selektywnie przywracać fragmenty.
Zobacz też:
źródło
-p
dodaje piękny dodatkową warstwę bezpieczeństwa. Połącz to z,git clean -d
aby faktycznie odpowiedzieć na OP.Ponieważ żadna odpowiedź nie sugeruje dokładnej kombinacji opcji, której używam, oto ona:
To jest tekst pomocy online dla używanych
git clean
opcji:-d
Usuń nieśledzone katalogi oprócz nieśledzonych plików. Jeśli nieśledzony katalog jest zarządzany przez inne repozytorium Git, domyślnie nie jest usuwany. Użyj
-f
opcji dwa razy, jeśli naprawdę chcesz usunąć taki katalog.-f
Jeśli zmienna konfiguracja Git
clean.requireForce
nie jest ustawionyfalse
, Git czyste odmówi usuwać pliki lub katalogi, chyba że podano-f
,-n
albo-i
. Git odmówi usunięcia katalogów w.git
podkatalogu lub pliku, chyba że-f
podano sekundę .-x
Nie używaj reguł ignorowania z
.gitignore
(dla katalogu) i$GIT_DIR/info/exclude
, ale nadal używaj reguł ignorowania podanych z-e
opcjami. Umożliwia to usunięcie wszystkich nieśledzonych plików, w tym produktów kompilacji. Można tego użyć (ewentualnie w połączeniu zgit reset
) do stworzenia nieskazitelnego katalogu roboczego do przetestowania czystej wersji.Ponadto
git checkout .
należy to zrobić w katalogu głównym repozytorium.źródło
git reset --hard
zamiast tego? (który jest faktycznie równoważnygit reset --hard HEAD
i powinien działać w zależności od tego, który jest bieżący katalog ...)git clean -dfx
, oto wskazówka, której używam, aby być bezpiecznym przed uruchomieniem: po prostu uruchomgit clean -d -x -n
wcześniej, aby wyświetlić listę plików do usunięcia, a następnie potwierdź operację, uruchamiającgit clean -d -x -f
(wstawiam argument-n
, lub,-f
w końcu, aby móc szybko zmienić go w terminalu).gitignore
, stracisz je. Zastanów się, zanim utworzysz kopię zapasową swojego projektu.Jeśli chcesz jedynie usunąć zmiany w istniejących plikach , użyj
checkout
( udokumentowane tutaj ).--
) mówi Gitowi, że to, co następuje, powinno być traktowane jako drugi argument (ścieżka), że pominąłeś specyfikację gałęzi..
) wskazuje wszystkie ścieżki.Jeśli chcesz usunąć pliki dodane od czasu ostatniego zatwierdzenia, użyj
clean
( udokumentowane tutaj ):-i
opcja inicjuje interakcjęclean
, aby uniknąć pomyłkowego usunięcia.Jeśli chcesz przenieść zmiany do miejsca przechowywania w celu późniejszego dostępu , użyj
stash
( udokumentowane tutaj ):źródło
Naprawdę uważam ten artykuł za pomocny w wyjaśnieniu, kiedy użyć polecenia: http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/
Istnieje kilka różnych przypadków:
Jeśli nie zainscenizowałeś pliku, użyj
git checkout
. Kasa „aktualizuje pliki w drzewie roboczym, aby pasowały do wersji w indeksie”. Jeśli pliki nie były przemieszczane (czyli dodane do indeksu) ... to polecenie zasadniczo przywróci pliki do ostatniego zatwierdzenia.git checkout -- foo.txt
Jeśli zainscenizowałeś plik, użyj git reset. Resetuj zmienia indeks w celu dopasowania do zatwierdzenia.
git reset -- foo.txt
Podejrzewam, że używanie
git stash
jest popularnym wyborem, ponieważ jest nieco mniej niebezpieczne. Zawsze możesz do niego wrócić, jeśli przypadkowo wysadzisz go za dużo podczas korzystania z git reset. Reset jest domyślnie rekurencyjny.Więcej informacji znajdziesz w powyższym artykule.
źródło
Najłatwiej to zrobić za pomocą tego polecenia:
To polecenie służy do odrzucenia zmian w katalogu roboczym -
https://git-scm.com/docs/git-checkout
W poleceniu git, ukrywanie nieśledzonych plików jest osiągane przez użycie:
http://git-scm.com/docs/git-stash
źródło
.
na końcu. Dla mnie przyszłości: okres jest niezbędny !git clean -fd
do czyszczenia plików spoza indeksu.Jeśli nie jesteś zainteresowany utrzymywaniem nieetapowych zmian (szczególnie jeśli zmiany etapowe są nowymi plikami), znalazłem to przydatne:
źródło
git checkout -f
man git-checkout
:-f, --force
Podczas przełączania gałęzi postępuj, nawet jeśli indeks lub drzewo robocze różni się od HEAD. Służy do odrzucania lokalnych zmian.
Podczas sprawdzania ścieżek z indeksu nie zawiedź przy nie połączonych wpisach; zamiast tego nie scalone wpisy są ignorowane.
źródło
Podczas wpisywania statusu git wyświetlany jest komunikat (użyj „git checkout - ...”, aby odrzucić zmiany w katalogu roboczym) .
na przykład
git checkout -- .
źródło
Możesz użyć skrytki git - jeśli coś pójdzie nie tak, nadal możesz przywrócić skrytkę. Podobnie jak w przypadku innych odpowiedzi tutaj, ale ta usuwa również wszystkie pliki niestacjonarne, a także wszystkie niestabilne - usuwa:
jeśli sprawdzisz, czy wszystko jest w porządku, wyrzuć skrytkę:
Odpowiedź od Bilala Maqsooda
git clean
również działała dla mnie, ale dzięki skrytce mam większą kontrolę - jeśli zrobię coś przypadkowo, nadal mogę odzyskać swoje zmianyAKTUALIZACJA
Myślę, że jest jeszcze jedna zmiana (nie wiem, dlaczego to wcześniej działało dla mnie):
git add . -A
zamiastgit add .
bez
-A
usuniętych plików nie zostaną ustawioneźródło
Aktualizacja 2019:
Od lipca 2019 roku , nastąpiła nowa komenda, która robi dokładnie to:
git restore
.W
git status
teraz Git zaleca używanie tego polecenia zamiast zwykłegogit checkout
.Chociaż tego polecenia można również użyć do przywrócenia drzewa roboczego do określonego zatwierdzenia lub do przywrócenia zawartości indeksu, domyślnie drzewo robocze jest przywracane do stanu w indeksie (o co pyta się tutaj).
Aby przywrócić pliki pasujące do ścieżki (pozbyć się ich nieustawionych zmian), wykonaj następujące czynności:
Na przykład, aby przywrócić wszystkie niestabilne zmiany w bieżącym katalogu, możesz uruchomić:
Jeśli uruchomisz to z katalogu głównego projektu, przywróci on wszystkie niestacjonarne zmiany w całym repozytorium.
Zauważ, że tak jak w przypadku
git checkout -- .
(jak zauważył Mariusz Nowak), spowoduje to jedynie odrzucenie zmian w plikach śledzonych przez Git i nie odrzuci żadnych nowych plików nieśledzonych. Jeśli chcesz odrzucić wszelkie nieustawione zmiany, w tym nowe nieśledzone pliki, możesz uruchomić dodatkowe:Bądź jednak bardzo ostrożny z tym późniejszym poleceniem, ponieważ możesz odrzucić pliki, których nie zamierzałeś się pozbyć.
Uwaga
git restore
: ponieważ jest to nowe polecenie, jego strona podręcznika ostrzega:Możliwe więc, że ta odpowiedź może stać się nieaktualna, jeśli zachowanie zmieni się w przyszłości. Warto więc szybko uruchomić aplikację
man git-restore
przed jej użyciem.źródło
git restore .
działało idealnie. Dzięki.git restore <filename>
i działało idealnie.git restore .
przywraca wszystkie pliki w bieżącym katalogu, a nie w całym repozytorium.Zamiast odrzucać zmiany, resetuję pilota do źródła. Uwaga - ta metoda polega na całkowitym przywróceniu folderu do repozytorium.
Robię to, aby upewnić się, że nie siedzą tam, kiedy resetuję (później - wyklucza gitignores w Origin / branchname)
UWAGA: Jeśli chcesz, aby pliki nie były jeszcze śledzone, ale nie w GITIGNORE, możesz pominąć ten krok, ponieważ spowoduje to wyczyszczenie tych nieśledzonych plików, których nie znaleziono w zdalnym repozytorium (dzięki @XtrmJosh).
Potem ja
Następnie resetuję do źródła
To sprawi, że wróci do punktu wyjścia. Podobnie jak ponowne klonowanie gałęzi, jednocześnie zachowując wszystkie moje pliki gitignored lokalnie i na miejscu.
Zaktualizowany według komentarza użytkownika poniżej: Odmiana umożliwiająca zresetowanie do dowolnej gałęzi, w której znajduje się użytkownik.
źródło
git reset --hard @{u}
resetowanie gałęzi do dowolnego miejsca, w którym znajduje się bieżąca gałąź do zdalnego śledzeniaWypróbowałem wszystkie powyższe rozwiązania, ale nadal nie mogłem pozbyć się nowych, nieustawionych plików.
Użyj,
git clean -f
aby usunąć te nowe pliki - jednak ostrożnie! Zwróć uwagę na opcję wymuszenia.źródło
po prostu powiedz
Spowoduje to usunięcie wszystkich lokalnych zmian. Możesz także użyć później, mówiąc
lub git stash pop
źródło
Po prostu użyj:
Gotowy. Łatwy.
Jeśli naprawdę zależy ci na stosie skrytek, możesz to zrobić
git stash drop
. Ale w tym momencie lepiej użyć (od Mariusza Nowaka):Niemniej jednak najbardziej mi się podoba,
git stash -u
ponieważ „odrzuca” wszystkie śledzone i nieśledzone zmiany w jednym poleceniu . Jednakgit checkout -- .
odrzuca tylko śledzone zmiany igit clean -df
odrzuca tylko nieśledzone zmiany ... a wpisanie obu poleceń to zdecydowanie za dużo pracy :)źródło
git stash -u
wkrótce (Git 2.14.x / 2.15, III kwartał 2017) nieco się zmieni: stackoverflow.com/a/46027357/6309git stash -k
moim zdaniem.Aby wykonać trwałe odrzucenie:
git reset --hard
Aby zapisać zmiany na później:
git stash
źródło
Działa to nawet w katalogach, które są; poza normalnymi uprawnieniami git.
Zdarzyło mi się ostatnio
źródło
git help clean
„-d Usuń nieśledzone katalogi oprócz nieśledzonych plików”.masz bardzo proste polecenie git
git checkout .
źródło
źródło
W mojej opinii,
powinien załatwić sprawę. Zgodnie z dokumentacją Git dotyczącą git clean
Opis
Opcje
źródło
Bez względu na stan, w jakim znajduje się Twoje repo, zawsze możesz zresetować do dowolnego poprzedniego zatwierdzenia:
Spowoduje to odrzucenie wszystkich zmian, które zostały wprowadzone po tym zatwierdzeniu.
źródło
Innym sposobem na pozbycie się nowych plików, który jest bardziej konkretny niż git clean -df (pozwoli ci pozbyć się niektórych plików, niekoniecznie wszystkich), jest dodanie nowych plików do indeksu, a następnie ukrycie, a następnie upuszczenie chować na potem.
Ta technika jest przydatna, gdy z jakiegoś powodu nie można łatwo usunąć wszystkich nieśledzonych plików za pomocą zwykłego mechanizmu (np. Rm).
źródło
To, co następuje, to tak naprawdę tylko rozwiązanie, jeśli pracujesz z rozwidleniem repozytorium, w którym regularnie synchronizujesz (np. Żądanie ściągnięcia) z innym repozytorium. Krótka odpowiedź: usuń widelec i przerób, ale przeczytaj ostrzeżenia na github .
Miałem podobny problem, być może nie identyczny, i przykro mi powiedzieć, że moje rozwiązanie nie jest idealne, ale ostatecznie jest skuteczne.
Często miałem takie komunikaty o stanie Git (zawierające co najmniej 2/4 pliki):
Baczne oko zauważy, że te pliki mają dopplegangers, które są pojedynczą literą, jeśli są wyłączone. W jakiś sposób i nie mam pojęcia, co doprowadziło mnie na początku tej ścieżki (ponieważ sam nie pracowałem z tymi plikami z repozytorium w górę), zmieniłem te pliki. Wypróbuj wiele rozwiązań wymienionych na tej stronie (i innych stronach) nie pomogło.
Byłem w stanie rozwiązać problem, usuwając moje rozwidlone repozytorium i wszystkie lokalne repozytoria oraz przebudowując. Samo to nie wystarczyło; Upstream musiał zmienić nazwę tych plików na nowe nazwy plików. Tak długo, jak nie masz żadnych niezaangażowanych prac, żadnych stron wiki i żadnych problemów, które odbiegają od repozytorium wyższego szczebla, powinieneś być w porządku. Co więcej, upstream może nie być z ciebie bardzo zadowolony. Jeśli chodzi o mój problem, to niewątpliwie jest to błąd użytkownika, ponieważ nie jestem tak biegły w git, ale fakt, że nie jest łatwo naprawić punkty do problemu z git.
źródło
Jeśli chcesz przenieść skrytkę na inną osobę:
[edytuj] zgodnie z komentarzem, można nazwać skrytki. Cóż, użyj tego, jeśli chcesz podzielić się swoją skrytką;)
źródło
git stash save "Feature X work in progress"
.Możesz stworzyć własny alias, który opisuje, jak to zrobić w opisowy sposób.
Używam następnego aliasu, aby odrzucić zmiany.
Odrzuć zmiany w pliku (liście) w pracującym drzewie
Następnie możesz użyć go jako następnego, aby odrzucić wszystkie zmiany:
Lub tylko plik:
W przeciwnym razie, jeśli chcesz odrzucić wszystkie zmiany, a także nieśledzone pliki, używam kombinacji kasy i czyszczenia:
Wyczyść i odrzuć zmiany i nieśledzone pliki w działającym drzewie
Tak więc użycie jest proste:
Teraz jest dostępny w następnym repozytorium Github, które zawiera wiele aliasów:
źródło
Miałem dziwną sytuację, w której plik jest zawsze nieokreślony, co pomaga mi rozwiązać.
źródło