Chciałbym usunąć wszystkie zmiany w mojej kopii roboczej.
Uruchamianie git status
pokazuje zmodyfikowane pliki.
Nic, co robię, nie usuwa tych modyfikacji.
Na przykład:
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
# modified: Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
# modified: Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
# modified: Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git checkout -- Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
# modified: Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
# modified: Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
# modified: Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git checkout `git ls-files -m`
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
# modified: Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
# modified: Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
# modified: Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git reset --hard HEAD
HEAD is now at 6c857e7 boo libraries updated to 2.0.9.2 and rhino.dsl.dll updated.
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
# modified: Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
# modified: Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
# modified: Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")
git
revert
git-status
working-copy
rbellamy
źródło
źródło
git reset --hard
tutaj nie działało. Uwaga: należygit checkout -- `git ls-files -m`
anulować pliki (--
)checkout -- <file>
go, powinno działać. Wykrywanie zmian jest nieco wybredne w niektórych sytuacjach (między innymi, jeśli występuje niedopasowanie CRLF)git update-index --assume-unchaged
wymusza niezarządzany stan plików (nawet tych zmienionych!)Odpowiedzi:
Istnieje wiele problemów, które mogą powodować takie zachowanie:
Normalizacja zakończenia linii
Miałem też tego rodzaju problemy. Sprowadza się to do git automatycznie konwertującego crlf na lf. Jest to zwykle spowodowane mieszanymi zakończeniami linii w jednym pliku. Plik normalizuje się w indeksie, ale gdy git następnie go normalizuje, aby różnicować go względem pliku w drzewie roboczym, wynik jest inny.
Ale jeśli chcesz to naprawić, powinieneś wyłączyć core.autocrlf , zmienić wszystkie zakończenia linii na lf, a następnie włączyć je ponownie. Możesz też całkowicie wyłączyć, wykonując:
Zamiast core.autocrlf możesz również rozważyć użycie
.gitattribute
plików. W ten sposób możesz upewnić się, że wszyscy korzystający z repozytorium stosują te same reguły normalizacji, zapobiegając dostawaniu się mieszanych zakończeń linii do repozytorium.Zastanów się również nad ustawieniem core.safecrlf, aby ostrzegał, jeśli chcesz, aby git ostrzegał cię przed wykonaniem nieodwracalnej normalizacji.
GIT manpages powiedzieć to:
Systemy plików bez rozróżniania wielkości liter
W systemach plików bez rozróżniania wielkości liter, w repozytorium znajduje się ta sama nazwa pliku z inną obudową, git próbuje pobrać oba, ale tylko jeden kończy się w systemie plików. Gdy git próbuje porównać drugi, porówna go z niewłaściwym plikiem.
Rozwiązaniem byłoby albo przejście na system plików bez rozróżniania wielkości liter, ale w większości przypadków nie jest to wykonalne lub zmiana nazwy i zatwierdzenie jednego z plików w innym systemie plików.
źródło
git ls-tree -r --name-only HEAD | tr A-Z a-z | sort | uniq -d
. Aby wymienić oba górne i dolne przypadku takich nazw plików uruchomićgit ls-tree -r --name-only HEAD | fgrep -i -f <(git ls-tree -r --name-only HEAD | tr A-Z a-z | sort | uniq -d) | sort -i
Miałem ten problem w systemie Windows, ale nie byłem przygotowany na przyjrzenie się konsekwencjom używania.
config --global core.autocrlf false
Nie byłem również przygotowany na porzucenie innych prywatnych gałęzi i gadżetów w mojej skrytce i rozpoczęcie od nowego klonu. Po prostu muszę coś zrobić. Teraz.Dla mnie to zadziałało, ponieważ pozwoliłeś git całkowicie przepisać katalog roboczy:
(Zwróć uwagę, że uruchamianie
git reset --hard
nie było wystarczająco dobre, ani też nie było zwykłychrm
plików przed,reset
jak sugerują komentarze w pierwotnym pytaniu)źródło
core.autocrlf
nie przyniósł żadnego efektu.core.autocrlf false
. Ta odpowiedź zadziałała, gdy nic innego by się nie udało.Inne rozwiązanie, które może działać dla ludzi, ponieważ żadna z opcji tekstowych nie działała dla mnie:
.gitattributes
z jednej linii:* binary
. To mówi gitowi, aby traktował każdy plik jako plik binarny, z którym nic nie może zrobić.git checkout -- <files>
przywrócić je do wersji repozytoriumgit checkout -- .gitattributes
aby przywrócić.gitattributes
plik do stanu początkowegoźródło
.gitattributes
do oryginału przywróciłby ten sam problem, ale niestety mój problem został już rozwiązany. Żadne inne sugestie nie zadziałały w moim przypadku.git status
, okaże się, że są to różne pliki. Gdy zapytaszgit checkout
, okaże się, że mają tę samą treść. To rozwiązanie tymczasowo instruuje git, aby ignorował wszelkie możliwe sprytne kończenie linii i upewniał się, że twoja lokalna kopia jest bajt po bajcie identyczna z tąHEAD
. Gdy to zostanie rozwiązane, pozwolenie na wznowienie sprytu jest w porządku, ponieważ nie doda nowych błędów.Dla przyszłych osób mających ten problem: zmiany w trybie pliku mogą mieć te same objawy.
git config core.filemode false
naprawi to.źródło
git checkout .
git diff
i pokaże pliki ze zmianami trybu takimi jak tenold mode 100755 / new mode 100644
.Doprowadzało mnie to do szaleństwa, zwłaszcza że nie mogłem tego naprawić bez żadnego rozwiązania znalezionego online. Oto jak to rozwiązałem. Nie mogę wziąć kredytów tutaj, ponieważ jest to praca kolegi :)
Źródło problemu: Moja początkowa instalacja git była bez automatycznej konwersji linii w systemie Windows. To spowodowało, że moje początkowe zaangażowanie w GLFW było bez właściwego zakończenia linii.
Instalacja: Xubuntu 12.04 Git repo z projektem glfw
Problem: Nie można zresetować plików glfw. Zawsze pokazują się jako zmodyfikowane, niezależnie od tego, co próbowałem.
Rozwiązany:
źródło
Miałem plik .bat z tym samym problemem (nie mogłem się go pozbyć w nieśledzonych plikach). git checkout - nie działał, żadna z sugestii na tej stronie nie działała. Jedyne, co działało dla mnie, to:
A następnie, aby usunąć skrytkę:
źródło
--keep-index
jest ważne.Mam ten sam problem dwa razy! Za każdym razem, gdy ukrywałem niektóre zmiany, które wprowadziłem, a następnie próbowałem je wycofać. Nie można usunąć zmian, ponieważ mam wiele plików, które zostały zmienione - ale NIE są! Są DOKŁADNIE takie same.
Myślę, że wypróbowałem wszystkie powyższe rozwiązania bez powodzenia. Po wypróbowaniu
Mam teraz prawie wszystkie pliki w moim repozytorium zmodyfikowane.
Podczas różnicowania pliku jest napisane, że usunąłem wszystkie linie, a następnie dodałem je ponownie.
Trochę niepokojące. W przyszłości uniknę ukrywania się.
Jedynym rozwiązaniem jest sklonowanie nowego repozytorium i rozpoczęcie od nowa. (Zrobił to ostatni raz)
źródło
Spróbuj zrobić
To powinno usunąć wszystkie zmiany w bieżącym działającym repozytorium lokalnym
źródło
git checkout -f <another recent branch>
wrócić do mojego oddziału zgit checkout -f <branch I'm working on>
Byłem w stanie to naprawić tylko tymczasowo usuwając plik .gitattributes mojego repozytorium (który zdefiniował
* text=auto
i*.c text
).Pobiegłem
git status
po usunięciu i zmiany zniknęły. Nie wrócili nawet po przywróceniu .gitattributes.źródło
Dobrze jest mieć spójne zakończenia linii. Na przykład nie spowoduje to niepotrzebnych połączeń, choć banalne. Widziałem, jak program Visual Studio tworzy pliki z mieszanymi zakończeniami linii.
Również niektóre programy, takie jak bash (na Linuksie), wymagają, aby pliki .sh były zakończone w LF.
Aby się upewnić, że tak się stanie, możesz użyć gitattributes. Działa na poziomie repozytorium bez względu na wartość autcrlf.
Na przykład możesz mieć .gitattributes takie jak to: * text = auto
Możesz także sprecyzować typ / rozszerzenie pliku, jeśli miało to znaczenie w twoim przypadku.
Następnie autocrlf może konwertować lokalnie zakończenia linii dla programów Windows.
W mieszanym projekcie C # / C ++ / Java / Ruby / R, Windows / Linux działa to dobrze. Jak dotąd żadnych problemów.
źródło
Miałem te same objawy, ale zostały spowodowane przez inną rzecz.
Nie byłem w stanie:
nawet na
git rm --cached app.js
nim podpisuje się jako usunięty, aw nie śledzonych plikach widziałem app.js. Ale kiedy spróbowałemrm -rf app.js
i wykonałemgit status
ponownie, nadal pokazuje mi plik w „nieśledzonym”.Po kilku próbach z kolegą okazało się, że jest to spowodowane przez Grunta!
Po
Grunt
włączeniu i ponieważ app.js został wygenerowany z kilku innych plików js, dowiedzieliśmy się, że po każdej operacji z plikami js (także ta aplikacja.js) grunt ponownie odtwarza app.js.źródło
Ten problem może również wystąpić, gdy współtwórca repozytorium działa na komputerze z systemem Linux lub zmieniane są okna z Cygwin i uprawnienia do plików. Git wie tylko o 755 i 644.
Przykład tego problemu i sposób jego sprawdzenia:
Aby tego uniknąć, upewnij się, że poprawnie skonfigurowałeś git
źródło
Jest tu wiele rozwiązań i być może powinienem był wypróbować niektóre z nich, zanim wymyślę własne. W każdym razie tutaj jest jeszcze jeden ...
Naszym problemem było to, że nie mieliśmy wymuszania linii końcowych, a repozytorium zawierało mieszankę DOS / Unix. Jeszcze gorsze było to, że w tej pozycji było to repozytorium open source, które rozwinęliśmy. Podmioty decydujące o pierwotnym posiadaniu repozytorium systemu operacyjnego podjęły decyzję o zmianie wszystkich linii końcowych na uniksowe i dokonano zatwierdzenia, które obejmowało a,
.gitattributes
aby wymusić zakończenie linii.Niestety zdawało się to powodować problemy podobne do opisanych tutaj, w których po scaleniu kodu sprzed DOS-2-Unix pliki były na zawsze oznaczone jako zmienione i nie można ich było przywrócić.
Podczas moich badań natknąłem się na - https://help.github.com/articles/dealing-with-line-endings/ - Jeśli znów napotkam ten problem, zacznę od wypróbowania tego.
Oto co zrobiłem:
Początkowo dokonałem scalenia, zanim zdałem sobie sprawę, że mam ten problem i musiałem przerwać -
git reset --hard HEAD
( wpadłem w konflikt scalania. Jak mogę przerwać scalanie? )Otworzyłem te pliki w VIM i zmieniłem na Unix (
:set ff=unix
).dos2unix
Oczywiście można użyć takiego narzędziazobowiązany
scalono
master
w (master ma zmiany DOS-2-Unix)git checkout old-code-branch; git merge master
Rozwiązane konflikty i pliki były ponownie DOS, więc musiało to być
:set ff=unix
w VIM. (Uwaga: Zainstalowałem https://github.com/itchyny/lightline.vim, co pozwoliło mi zobaczyć, jaki format pliku znajduje się na linii statusu VIM)źródło
Problemem, na który natknąłem się, jest to, że Windows nie dba o wielkie litery, ale git ma. Więc git zapisał małą i wielką wersję pliku, ale mógł tylko pobrać jedną.
źródło
Zatwierdziłem wszystkie zmiany, a następnie zrobiłem i cofnąłem zatwierdzenie. To zadziałało dla mnie
git add.
git commit -m „Losowe zatwierdzenie”
git reset - twarda GŁOWA ~ 1
źródło
Zwykle w GIT, aby usunąć wszystkie modyfikacje i nowe pliki, następujące 2 polecenia powinny działać bardzo ładnie (bądź ostrożny , spowoduje to usunięcie wszystkich twoich nowych plików + folderów, które mogłeś utworzyć i przywróci wszystkie zmodyfikowane pliki do stanu bieżącego zatwierdzenie ):
Może czasem lepszym rozwiązaniem jest po prostu wykonanie polecenia „git stash push” z opcjonalnym komunikatem:
Spowoduje to również wyczyszczenie wszystkich nowych i zmodyfikowanych plików, ale wszystkie zostaną ukryte na wypadek, gdybyś chciał je przywrócić. Skrytka w GIT przenosi się z gałęzi do gałęzi, więc możesz przywrócić je w innej gałęzi, jeśli chcesz.
Na marginesie, jeśli już przygotowałeś niektóre nowo dodane pliki i chcesz się ich pozbyć, powinno to załatwić sprawę:
Jeśli to wszystko nie działa , przeczytaj poniżej, co działało dla mnie jakiś czas temu:
Kilka razy wcześniej napotkałem ten problem. Obecnie rozwijam się na maszynie Windows 10 dostarczonej przez mojego pracodawcę. Dzisiaj to szczególne zachowanie git zostało spowodowane przez utworzenie nowej gałęzi z mojej gałęzi „rozwijania”. Z jakiegoś powodu, po tym, jak wróciłem do gałęzi „rozwijania”, niektóre pozornie przypadkowe pliki pozostały i były wyświetlane jako „zmodyfikowane” w „statusie git”.
Ponadto w tym momencie nie mogłem sprawdzić innej gałęzi, więc utknąłem na mojej gałęzi „rozwijania”.
Oto co zrobiłem:
Zauważyłem, że nowa gałąź, którą utworzyłem dzisiaj z „rozwijania”, pokazywała się w pierwszym komunikacie „zatwierdzenia”, na końcu na końcu „HEAD -> rozwijanie, pochodzenie / rozwijanie, pochodzenie / HEAD, gałąź-i-utworzone - wcześniej-dziś ”.
Ponieważ tak naprawdę go nie potrzebowałem, usunąłem go:
Zmienione pliki wciąż się wyświetlały, więc zrobiłem:
To rozwiązało mój problem:
Oczywiście
$ git stash list
pokaże ukryte zmiany, a ponieważ miałem ich niewiele i nie potrzebowałem żadnych$ git stash clear
skrytek, usunąłem WSZYSTKIE SKŁADKI.UWAGA : nie próbowałem robić tego, co ktoś mi tutaj zasugerował:
Mogło to również zadziałać, na pewno wypróbuję to następnym razem, gdy napotkam ten problem.
źródło
Jeśli sklonujesz repozytorium i natychmiast zobaczysz oczekujące zmiany, to repozytorium jest w niespójnym stanie. Proszę NIE komentować
* text=auto
z.gitattributes
pliku. Stało się tak właśnie dlatego, że właściciel repozytorium chce, aby wszystkie pliki były przechowywane spójnie z zakończeniami linii LF.Jak stwierdził HankCa, postępowanie zgodnie z instrukcjami na https://help.github.com/articles/dealing-with-line-endings/ jest sposobem na rozwiązanie problemu. Łatwy przycisk:
Następnie scal (lub ściągnij) oddział z właścicielem repozytorium.
źródło
Nic więcej na tej stronie nie działało. To w końcu zadziałało dla mnie. Nie pokazuję żadnych nieśledzonych ani zatwierdzonych plików.
źródło
Dla mnie problemem było to, że Visual Studio zostało otwarte podczas wykonywania polecenia
git checkout <file>
Po zamknięciu programu Visual Studio polecenie zadziałało i mogłem w końcu zastosować moją pracę ze stosu. Sprawdź więc wszystkie aplikacje, które mogą wprowadzać zmiany w kodzie, na przykład SourceTree, SmartGit, NotePad, NotePad ++ i inne edytory.
źródło
W naszej firmie mieliśmy podobną sytuację. Żadna z proponowanych metod nam nie pomogła. W wyniku badań problem został ujawniony. Chodziło o to, że w Git były dwa pliki, których nazwy różniły się tylko rejestrem symboli. Systemy uniksowe widziały je jako dwa różne pliki, ale Windows oszalał. Aby rozwiązać problem, usunęliśmy jeden z plików na serwerze. Następnie w lokalnych repozytoriach w systemie Windows pomogło kilka kolejnych poleceń (w różnych sekwencjach):
źródło
Rozwiązałem to, edytując .git / config, dodając:
Potem poszedłem do .git / refs / heads / name_branch i umieściłem identyfikator ostatniego zatwierdzenia
enter code here
źródło
Rozwiązałem to w ten sposób:
To działało dla mnie.
źródło
Jedno zaproponowane rozwiązanie tutaj nie zadziałało, dowiedziałem się, że plik był tak naprawdę linkiem do niektórych znaków specjalnych:
źródło