Jak odrzucić niestabilne zmiany w Git?

4816

Jak odrzucić zmiany w mojej kopii roboczej, których nie ma w indeksie?

Tylko czytać
źródło
9
git-cleanusuwa tylko nieśledzone pliki z działającego drzewa git-scm.com/docs/git-clean
Yega
24
Wyjaśnienie powyższego komentarza Asenara git-clean -dfmoż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. zamiast
jacanterbury,
15
„git clean -df” Uwaga! Próbowałem tego i zgubiłem kluczowe foldery, których nie można przywrócić ... Ojej!
Gabe Karkanis
46
uderzenie git statusdaje sugestię, jak to zrobić! git checkout -- .
Paulo
4
@Paulo: od lipca 2019 roku, git statusdaje sugestię: git restore. git restorejest nowym poleceniem właśnie w tym celu. Zobacz moją aktualizację 2019 .
prosoitos,

Odpowiedzi:

2684

Innym szybszym sposobem jest:

git stash save --keep-index --include-untracked

Nie musisz uwzględniać, --include-untrackedjeśli nie chcesz być do tego dokładny.

Następnie możesz upuścić tę skrytkę za pomocą git stash droppolecenia, jeśli chcesz.

Greg Hewgill
źródło
122
I żeby być dokładnym, też byś tego chciał --include-untracked.
TJ Crowder
9
@KarimSamir: Pytanie dotyczy w szczególności zmian, których nie ma w indeksie . git resetPolecenie odrzucić zmiany w indeksie też.
Greg Hewgill,
146
kasa -. jest znacznie szybszy
Frank
38
Ani git stash, ani żadna odmiana git checkoutnie odrzuci usuniętych etapów. Według danych wyjściowych git status, prawdziwa poprawna odpowiedź tutaj jest trochę smakugit reset HEAD
Chris Warth
127
To zanieczyszcza stos skrytki. git checkout -- .wykonuje zadanie za pomocą tylko jednego polecenia.
Felipe Tonello,
5336

Dla wszystkich plików niestacjonarnych w bieżącym katalogu roboczym użyj:

git checkout -- .

Do konkretnego pliku użyj:

git checkout -- path/to/file/to/revert

--tutaj, aby usunąć niejednoznaczność argumentów .

Tobi
źródło
117
To wydaje się być kanonicznym sposobem git. tzn. dokładnie to, co mówi git, jeśli git status
piszesz
27
Nie działa, jeśli istnieją nieśledzone pliki. Git mówi error: The following untracked working tree files would be overwritten by checkout: ....
Michael Iles,
92
pytanie początkującego, co oznacza „git checkout -.” znaczy semantycznie?
kaid
120
@Ninjack git checkout -- .oznacza to samo git 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 to git checkout branch-name directory-or-file-nameogólnie, otrzymasz HEAD w wersji directory-or-file-namena oddział branch-name.
akgill
23
IMO ten wariant jest niedoskonały, ponieważ nie radzi sobie z sytuacją, gdy zmienione repozytorium nie znajduje się w wersji HEAD w momencie czyszczenia zmian i NIE chcesz aktualizować go do HEAD, a chcesz po prostu wyczyścić zmiany.
alexykot
1898

Wygląda na to, że kompletne rozwiązanie to:

git clean -df
git checkout -- .

git cleanusuwa 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 ) i git checkoutusuwa wszystkie niestabilne zmiany.

Mariusz Nowak
źródło
116
Pozostałe dwie odpowiedzi tak naprawdę nie działają.
John Hunt
18
@dval jest to spowodowane tym, że pierwsze polecenie usunęło nieindeksowane pliki, a drugie usunęło niestabilne zmiany (plików indeksowanych). Więc jeśli nie miałeś żadnych zmian git reset --hard
etapowych,
3
użyj -dff, jeśli nieśledzony katalog jest klonem git.
accuya
87
Uważaj, uruchamiając git clean -df. Jeśli nie rozumiesz, co to znaczy, możesz usuwać pliki, które chcesz zachować, takie jak robots.txt, przesłane pliki itp.
ctlockey
40
Jak powiedział @ctlockey, pierwsze polecenie usuwa również katalogi, jeśli składają się tylko z plików ignorowanych ... Straciłem całą masę plików konfiguracyjnych w moim projekcie :( Zachowaj ostrożność.
Maxime Lorant
326

Sprawdza to bieżący indeks bieżącego katalogu, odrzucając wszystkie zmiany plików z bieżącego katalogu w dół.

git checkout .

lub ten, który sprawdza wszystkie pliki z indeksu, zastępując pliki drzewa roboczego.

git checkout-index -a -f
CB Bailey
źródło
28
Cześć, jaka jest różnica między git checkout .i git checkout -- .?
Evan Hu
5
@Evan: W tej sprawie nie ma różnicy.
Robert Siemer
10
@Robert Siemer i ogólnie?
RJFalconer
2
@Evan: złe miejsce, aby zadać to pytanie. - Nie ma to związku z pytaniem PO i nie ma związku z odpowiedzią tutaj.
Robert Siemer
14
+1 To jest PRAWA ODPOWIEDŹ, ponieważ poprawnie obsługuje przypadek, w którym niektóre pliki mają zarówno zmiany etapowe, jak i niestacjonarne. Zauważ, że to rozwiązanie ODRZUCA zmiany niestacjonarne; jeśli chcesz je zachować, powinieneś użyć odpowiedzi @ greg-hewgill git stash save --keep-index.
Rhubbarb
248
git clean -df

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 od clean.requireForceustawienia)

Uruchom, git help cleanaby zobaczyć instrukcję

Elvis Ciotti
źródło
dlaczego ta odpowiedź nie ma wszystkich głosów? odpowiedział w 2011 roku i nadal jest poprawny.
Eugene Braginets
106

Moim ulubionym jest

git checkout -p

To pozwala selektywnie przywracać fragmenty.

Zobacz też:

git add -p
Ben
źródło
9
Uwielbiam możliwość zobaczenia rzeczywistej zmiany, zanim zostanie odrzucona.
Penghe Geng
Tego używam. git checkout -p, a następnie „a”, aby zaakceptować wszystko.
Mattis
2
Nigdy o tym nie myślałem. Że -pdodaje piękny dodatkową warstwę bezpieczeństwa. Połącz to z, git clean -daby faktycznie odpowiedzieć na OP.
Stephan Henningsen
96

Ponieważ żadna odpowiedź nie sugeruje dokładnej kombinacji opcji, której używam, oto ona:

git clean -dfx
git checkout .

To jest tekst pomocy online dla używanych git cleanopcji:

-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 -fopcji dwa razy, jeśli naprawdę chcesz usunąć taki katalog.

-f

Jeśli zmienna konfiguracja Git clean.requireForcenie jest ustawiony false, Git czyste odmówi usuwać pliki lub katalogi, chyba że podano -f, -nalbo -i. Git odmówi usunięcia katalogów w .gitpodkatalogu lub pliku, chyba że -fpodano sekundę .

-x

Nie używaj reguł ignorowania z .gitignore(dla katalogu) i $GIT_DIR/info/exclude, ale nadal używaj reguł ignorowania podanych z -eopcjami. Umożliwia to usunięcie wszystkich nieśledzonych plików, w tym produktów kompilacji. Można tego użyć (ewentualnie w połączeniu z git reset) do stworzenia nieskazitelnego katalogu roboczego do przetestowania czystej wersji.

Ponadto git checkout .należy to zrobić w katalogu głównym repozytorium.

Martin G.
źródło
+1 za to rozwiązanie. Jeśli chodzi o twoją uwagę, że „git Checkout. Należy zrobić w katalogu głównym repo”, może wspomniałbyś, że możemy to zrobić git reset --hardzamiast tego? (który jest faktycznie równoważny git reset --hard HEADi powinien działać w zależności od tego, który jest bieżący katalog ...)
ErikMD
2
Również w odniesieniu do pierwszego polecenia git clean -dfx, oto wskazówka, której używam, aby być bezpiecznym przed uruchomieniem: po prostu uruchom git clean -d -x -nwcześniej, aby wyświetlić listę plików do usunięcia, a następnie potwierdź operację, uruchamiając git clean -d -x -f(wstawiam argument -n, lub, -fw końcu, aby móc szybko zmienić go w terminalu)
ErikMD
5
Szybka informacja, że ​​jest to nieodwracalne, a jeśli masz pliki .gitignore, stracisz je. Zastanów się, zanim utworzysz kopię zapasową swojego projektu.
Rob
69

Jeśli chcesz jedynie usunąć zmiany w istniejących plikach , użyj checkout( udokumentowane tutaj ).

git checkout -- .
  • Nie określono gałęzi, więc sprawdza bieżącą gałąź.
  • Podwójny łącznik ( --) mówi Gitowi, że to, co następuje, powinno być traktowane jako drugi argument (ścieżka), że pominąłeś specyfikację gałęzi.
  • Kropka ( .) wskazuje wszystkie ścieżki.

Jeśli chcesz usunąć pliki dodane od czasu ostatniego zatwierdzenia, użyj clean( udokumentowane tutaj ):

git clean -i 
  • Ta -iopcja inicjuje interakcję clean, aby uniknąć pomyłkowego usunięcia.
  • Dostępnych jest kilka innych opcji umożliwiających szybsze wykonanie; zobacz dokumentację.

Jeśli chcesz przenieść zmiany do miejsca przechowywania w celu późniejszego dostępu , użyj stash( udokumentowane tutaj ):

git stash
  • Wszystkie zmiany zostaną przeniesione do Skrytki Gita, aby umożliwić późniejszy dostęp.
  • Dostępnych jest kilka opcji pozwalających na bardziej szczegółowe składowanie; zobacz dokumentację.
2540625
źródło
To dokładnie skonwertuje twoje zmiany i odrzuci nowo dodane pliki z poprzedniego zatwierdzenia.
Yohan Chung,
przegłosował to dla wyjaśnienia :)
Archie G. Quiñones
62

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:

  1. 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

  2. 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 stashjest 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.

blak3r
źródło
60

Najłatwiej to zrobić za pomocą tego polecenia:

To polecenie służy do odrzucenia zmian w katalogu roboczym -

git checkout -- .

https://git-scm.com/docs/git-checkout

W poleceniu git, ukrywanie nieśledzonych plików jest osiągane przez użycie:

git stash -u

http://git-scm.com/docs/git-stash

AHM Forhadul Islam
źródło
19
Dwa razy tu przyszedłem, przeczytałem tę odpowiedź i zapomniałem .na końcu. Dla mnie przyszłości: okres jest niezbędny !
bejado
2
Musiałem pozbyć się wszystkich lokalnych zmian w podkatalogu, nie usuwając wszystkich innych zmian. Ta odpowiedź bardzo pomogła, dziękuję
Ally,
2
Opisz, co robią te dwa polecenia. Naprawdę nieprzydatne jest brak wyjaśnienia.
Chris Kennedy
2
świetny. kasa robi za pomocą jednego polecenia, co najpopularniejszy robi na dwa. można również użyć git clean -fddo czyszczenia plików spoza indeksu.
oligofren,
49

Jeśli nie jesteś zainteresowany utrzymywaniem nieetapowych zmian (szczególnie jeśli zmiany etapowe są nowymi plikami), znalazłem to przydatne:

git diff | git apply --reverse
Joshua Kunzmann
źródło
44

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.

Bijan
źródło
2
Odrzuciłoby to zmiany w indeksie !! (I OP musi je zostawić bez
zmian
44

Podczas wpisywania statusu git wyświetlany jest komunikat (użyj „git checkout - ...”, aby odrzucić zmiany w katalogu roboczym) .

na przykład git checkout -- .

Erdem ÖZDEMİR
źródło
1
Przegłosowano, ponieważ nie pomaga szybko odrzucić wszystkich plików. Trzy kropki oznaczają, że musisz wyświetlić listę wszystkich plików. Jest to szczególnie złe, jeśli musisz odrzucić mnóstwo plików jednocześnie, np. podczas dużego scalenia po wystawieniu wszystkich modyfikacji, które chcesz zachować
usr-local-ΕΨΗΕΛΩΝ
2
Oczywiście poprawnym poleceniem jest „git checkout -.” pojedyncza kropka. W komentarzu trzy kropki były gramatyczne, aby wskazać, że istnieje wiele innych opcji, które można było zastosować.
Josef.B
39

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:

git add .
git stash

jeśli sprawdzisz, czy wszystko jest w porządku, wyrzuć skrytkę:

git stash drop

Odpowiedź od Bilala Maqsooda git cleanrównież działała dla mnie, ale dzięki skrytce mam większą kontrolę - jeśli zrobię coś przypadkowo, nadal mogę odzyskać swoje zmiany

AKTUALIZACJA

Myślę, że jest jeszcze jedna zmiana (nie wiem, dlaczego to wcześniej działało dla mnie):

git add . -A zamiast git add .

bez -Ausuniętych plików nie zostaną ustawione

Asped
źródło
38

Aktualizacja 2019:

Od lipca 2019 roku , nastąpiła nowa komenda, która robi dokładnie to: git restore.

W git statusteraz Git zaleca używanie tego polecenia zamiast zwykłego git 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:

git restore <pathspec>

Na przykład, aby przywrócić wszystkie niestabilne zmiany w bieżącym katalogu, możesz uruchomić:

git restore .

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:

git clean -df

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:

To polecenie jest eksperymentalne. Zachowanie może się zmienić.

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-restoreprzed jej użyciem.

prosoitos
źródło
2
Chciałem przywrócić moje niestopniowe zmiany tylko bez wpływu na nowo dodane pliki, więc git restore .działało idealnie. Dzięki.
Saurabh Misra
3
Zrobiłem to git restore <filename>i działało idealnie.
Merlin
1
Działa dobrze dla mnie.
Prometeusz
1
Według strony man git restore .przywraca wszystkie pliki w bieżącym katalogu, a nie w całym repozytorium.
jarno
1
Masz rację. Dzięki! Właśnie to przetestowałem i rzeczywiście tak jest. Jest to jednak rekurencyjne. Dlatego uruchamiany z katalogu głównego projektu dotyczy całego repozytorium. Zmienię swoją odpowiedź.
prosoitos
35

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).

git add --all

Potem ja

git fetch --all

Następnie resetuję do źródła

git reset --hard origin/branchname

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.

git reset --hard @{u}
Nacięcie
źródło
To moja preferowana opcja, ale dlaczego najpierw dodajesz wszystkie zmiany? O ile mi wiadomo, to po prostu modyfikuje listę katalogów w plikach Git, przy użyciu git reset --hard, i tak zostanie to utracone, podczas gdy katalogi będą nadal usuwane.
XtrmJosh
Nie używam Maca ani Linuksa, github Windows PowerShell czasami zostawia pliki po resecie. Myślę, że to dlatego, że git reset ustawia wszystkie pliki w repozytorium do oryginalnego stanu. Jeśli nie zostaną dodane, nie zostaną dotknięte. Klient stacjonarny odbierze „hej, ten plik jest tutaj i musi zostać zatwierdzony”
Nick
Sense made. Nie używam systemu Windows, więc nie widziałem tego problemu (przynajmniej nie korzystałem z systemu Windows przez kilka ostatnich miesięcy, nie pamiętam dużo wcześniej - to jedna wielka, godna pożałowania, rozmycie). Być może warto zwrócić uwagę na uzasadnienie w głównej odpowiedzi :)
XtrmJosh
Natknąłem się również na ten problem na komputerze Mac. Jeśli plik nie jest śledzony w Repo, czasami git reset go nie dotyka. Nie mogę naprawdę wyodrębnić „DLACZEGO”, ale kiedy tak się stanie, jeśli zresetuję i nadal będę mieć 1 nieprzydzielony plik lub dwa, dodam --all i zresetuję
Nick,
2
Miłą odmianą tego, co lubię, jest git reset --hard @{u}resetowanie gałęzi do dowolnego miejsca, w którym znajduje się bieżąca gałąź do zdalnego śledzenia
user2221343,
31

Wypróbowałem wszystkie powyższe rozwiązania, ale nadal nie mogłem pozbyć się nowych, nieustawionych plików.

Użyj, git clean -faby usunąć te nowe pliki - jednak ostrożnie! Zwróć uwagę na opcję wymuszenia.

artur
źródło
21

po prostu powiedz

git stash

Spowoduje to usunięcie wszystkich lokalnych zmian. Możesz także użyć później, mówiąc

git stash apply 

lub git stash pop

piyushmandovra
źródło
21

Po prostu użyj:

git stash -u

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):

git checkout -- .
git clean -df

Niemniej jednak najbardziej mi się podoba, git stash -uponieważ „odrzuca” wszystkie śledzone i nieśledzone zmiany w jednym poleceniu . Jednak git checkout -- .odrzuca tylko śledzone zmiany i git clean -dfodrzuca tylko nieśledzone zmiany ... a wpisanie obu poleceń to zdecydowanie za dużo pracy :)

Ben Wilde
źródło
Uwaga: git stash -uwkrótce (Git 2.14.x / 2.15, III kwartał 2017) nieco się zmieni: stackoverflow.com/a/46027357/6309
VonC
Jeśli dostanę pytanie o poprawność OP, pliki indeksowane powinny zostać zachowane. Tylko zmiany sceniczne powinny zostać usunięte. Tak powinno być git stash -kmoim zdaniem.
przyciągnąć
21

Aby wykonać trwałe odrzucenie: git reset --hard

Aby zapisać zmiany na później: git stash

SANGEETHA PH
źródło
16

Działa to nawet w katalogach, które są; poza normalnymi uprawnieniami git.

sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx

Zdarzyło mi się ostatnio

GlassGhost
źródło
Uważaj jednak, aby zignorowana treść git nie zachowa swoich pierwotnych uprawnień! Może to powodować zagrożenie bezpieczeństwa.
twicejr
@twicejr Mylisz się, przeczytaj git help clean„-d Usuń nieśledzone katalogi oprócz nieśledzonych plików”.
GlassGhost,
Dlaczego ustawiłeś wszystkie swoje pliki jako światowe do odczytu / zapisu? Nie dobra praktyka.
Ghoti
@Ghoti my bad, 664 ma rację? możesz również edytować odpowiedź.
GlassGhost
Ustawienie wszystkich uprawnień na 664 powoduje wiele założeń dotyczących tego, jakiego rodzaju uprawnień potrzebuje projekt. Myślę, że użycie tej części polecenia spowoduje problemy u niektórych osób.
ianrandmckenzie
15

masz bardzo proste polecenie git git checkout .

khem raj regmi
źródło
14
cd path_to_project_folder  # take you to your project folder/working directory 
git checkout .             # removes all unstaged changes in working directory
vivekporwal04
źródło
12

W mojej opinii,

git clean -df

powinien załatwić sprawę. Zgodnie z dokumentacją Git dotyczącą git clean

git-clean - Usuń nieśledzone pliki z działającego drzewa

Opis

Czyści drzewo robocze, rekurencyjnie usuwając pliki, które nie są pod kontrolą wersji, zaczynając od bieżącego katalogu.

Zwykle usuwane są tylko pliki nieznane Gitowi, ale jeśli podano opcję -x, ignorowane pliki są również usuwane. Może to być na przykład przydatne do usunięcia wszystkich produktów kompilacji.

Jeśli podano opcjonalne ... argumenty, dotyczy to tylko tych ścieżek.

Opcje

-d Usuwa 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 opcji -f dwa razy, jeśli naprawdę chcesz usunąć taki katalog.

-f --force Jeśli zmienna konfiguracyjna Git clean.requireForce nie jest ustawiona na false, git clean odmówi uruchomienia, chyba że podano -f, -n lub -i.

Lahiru
źródło
11

Bez względu na stan, w jakim znajduje się Twoje repo, zawsze możesz zresetować do dowolnego poprzedniego zatwierdzenia:

git reset --hard <commit hash>

Spowoduje to odrzucenie wszystkich zmian, które zostały wprowadzone po tym zatwierdzeniu.

msangel
źródło
2
Spowoduje to również odrzucenie wszystkiego w indeksie (nie tylko rzeczy nie w indeksie), co jest poza tym, o co prosi OP.
Linus Arver,
10

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).

tjb
źródło
9

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):

$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2var.dats
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2Var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2Var.dats

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.

barker
źródło
7

Jeśli chcesz przenieść skrytkę na inną osobę:

# add files
git add .  
# diff all the changes to a file
git diff --staged > ~/mijn-fix.diff
# remove local changes 
git reset && git checkout .
# (later you can re-apply the diff:)
git apply ~/mijn-fix.diff

[edytuj] zgodnie z komentarzem, można nazwać skrytki. Cóż, użyj tego, jeśli chcesz podzielić się swoją skrytką;)

twicejr
źródło
5
Rzeczywiście skrytka Git może mieć tytuł. Na przykład git stash save "Feature X work in progress".
Colin D Bennett,
7

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

discard = checkout --

Następnie możesz użyć go jako następnego, aby odrzucić wszystkie zmiany:

discard .

Lub tylko plik:

discard filename

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

cleanout = !git clean -df && git checkout -- .

Tak więc użycie jest proste:

cleanout

Teraz jest dostępny w następnym repozytorium Github, które zawiera wiele aliasów:

Pau
źródło
7

Miałem dziwną sytuację, w której plik jest zawsze nieokreślony, co pomaga mi rozwiązać.

git rm .gitattributes
git add -A
git reset --hard

SDV
źródło