status git pokazuje modyfikacje, git checkout - <plik> nie usuwa ich

222

Chciałbym usunąć wszystkie zmiany w mojej kopii roboczej.
Uruchamianie git statuspokazuje 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")
rbellamy
źródło
6
Nie jestem pewien, dlaczego git reset --hardtutaj nie działało. Uwaga: należy git checkout -- `git ls-files -m`anulować pliki ( --)
VonC
2
Jeśli usuniesz pliki i użyjesz checkout -- <file>go, powinno działać. Wykrywanie zmian jest nieco wybredne w niektórych sytuacjach (między innymi, jeśli występuje niedopasowanie CRLF)
eckes
Możliwy duplikat Nie wydaje się odrzucać zmian w Git
BuZZ-dEE
1
@ BuZZ-dEE - jest to duplikat, starszy i dlatego miałby pierwszeństwo. Ale chociaż pytanie, do którego prowadzi link, jest zasadniczo takie samo, odpowiedź, którą zaakceptowałem poniżej, jest o wiele bardziej pouczająca niż którakolwiek z odpowiedzi, i rozwiązał mój problem.
rbellamy,
nie rozwiązanie, ale szwajcarski nóż do nudnej skrzynki: git update-index --assume-unchagedwymusza niezarządzany stan plików (nawet tych zmienionych!)
pdem 30.10.19

Odpowiedzi:

126

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:

git config --global core.autocrlf false

Zamiast core.autocrlf możesz również rozważyć użycie .gitattributeplikó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:

Konwersja CRLF ma niewielką szansę na uszkodzenie danych. autocrlf = true przekonwertuje CRLF na LF podczas zatwierdzania i LF na CRLF podczas realizacji transakcji. Plik zawierający mieszaninę LF i CRLF przed zatwierdzeniem nie może zostać odtworzony przez git. W przypadku plików tekstowych jest to słuszne: poprawia zakończenia linii tak, że w repozytorium mamy tylko zakończenia linii LF. Ale w przypadku plików binarnych przypadkowo sklasyfikowanych jako tekst konwersja może uszkodzić dane.

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.

Ikke
źródło
8
Ok ... więc to zrobiło ... teraz status git nie pokazuje żadnych zmian. Przeczytałem o ustawieniach autocrlf i wydaje mi się, że nie mogę tego poprawnie zrobić.
rbellamy
1
Dobry chwyt! +1. Jeszcze jeden argument dla mnie, ustawiając wartość false ( stackoverflow.com/questions/1249932/… ).
VCC
Co to znaczy: „Plik zawierający mieszaninę LF i CRLF przed zatwierdzeniem nie może zostać odtworzony przez git”. Czy to dlatego, że git zawsze normalizuje zakończenia linii na podstawie ustawienia core.autocrlf?
rbellamy
1
Bardziej rozsądnym rozwiązaniem problemu rozróżniania wielkości liter jest brak wielu folderów w repozytorium, których nazwy różnią się tylko wielkością liter .
Ohad Schneider
3
Aby znaleźć nazwy plików, które różnią się tylko wielkością liter, możesz uruchomić 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
Diomidis Spinellis
220

Miałem ten problem w systemie Windows, ale nie byłem przygotowany na przyjrzenie się konsekwencjom używania. config --global core.autocrlf falseNie 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:

git rm --cached -r .
git reset --hard

(Zwróć uwagę, że uruchamianie git reset --hardnie było wystarczająco dobre, ani też nie było zwykłych rmplików przed, resetjak sugerują komentarze w pierwotnym pytaniu)

Rian Sanderson
źródło
8
Kolejny sukces tutaj po zmianie core.autocrlfnie przyniósł żadnego efektu.
Daniel Buckmaster
8
Miałem ten problem w systemie Windows nawet z core.autocrlf false. Ta odpowiedź zadziałała, gdy nic innego by się nie udało.
kenchilada,
9
Próbowałem wiele sugestii z tego i innych pytań. To jedyna poprawka, która zadziałała dla mnie. Nie miałem pliku atrybutów i już zacząłem od core.autocrlf w false.
BrotherOdin,
4
To nie działało dla mnie. Więc zrobiłem to w bardziej brzydki sposób, tworząc nowy oddział, aby zatwierdzić te zmiany, ponieważ i tak są one dla mnie bezużyteczne. [java] git checkout -b a-branch-to-commit-bad-crlf-files [/ java] [java] git commit -am „popełnianie złych plików crlf” [/ java]
Mohd Farid
3
Czasami takie problemy sprawiają, że naprawdę tęsknię za SVN.
Mike Godin
104

Inne rozwiązanie, które może działać dla ludzi, ponieważ żadna z opcji tekstowych nie działała dla mnie:

  1. Wymień zawartość .gitattributesz jednej linii: * binary. To mówi gitowi, aby traktował każdy plik jako plik binarny, z którym nic nie może zrobić.
  2. Sprawdź, czy wiadomość dotycząca szkodliwych plików zniknęła; jeśli nie, możesz git checkout -- <files>przywrócić je do wersji repozytorium
  3. git checkout -- .gitattributesaby przywrócić .gitattributesplik do stanu początkowego
  4. Sprawdź, czy pliki nadal nie są oznaczone jako zmienione.
zebediah49
źródło
1
Przez ostatnie kilka godzin nie mogłem przywrócić, wyciągnąć ani ukryć plików. To była dla mnie poprawka! Dzięki! (Git 1.8.3.1)
NuSkooler
3
Próbowałem wielu rzeczy, zanim w końcu udało mi się to osiągnąć. Dziękuję Ci!
ghenghy
1
Jak to działa? Myślę, że powrót .gitattributesdo 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.
jdk1.0
1
@ jdk1.0 rozumiem / zgaduję, że w grę wchodzą dwie różne metody porównywania. Błąd występuje, gdy gdzieś kończy się inna linia, a git czasami ją ignoruje. Gdy zapytasz git status, okaże się, że są to różne pliki. Gdy zapytasz git 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.
zebediah49
3
Spędziłem z tym kilka godzin, a to rozwiązanie w końcu zadziałało dla mnie!
Maryam
71

Dla przyszłych osób mających ten problem: zmiany w trybie pliku mogą mieć te same objawy. git config core.filemode falsenaprawi to.

Marty Neal
źródło
3
Po zrobieniu tego, być może będziesz musiał zrobićgit checkout .
Marty Neal
2
Pracowałem dla mnie bez konieczności ponownego
zakupu
3
Do wykorzystania w przyszłości: aby dowiedzieć się, czy jest to poprawka, której potrzebujesz (a nie inne poprawki w innych odpowiedziach), użyj git diffi pokaże pliki ze zmianami trybu takimi jak ten old mode 100755 / new mode 100644.
pgr
To naprawiło mnie po absolutnie niczym innym. Naprawdę nie sądzę, że ludzie powinni tworzyć kody do gitów i „proste przewodniki” w Internecie. Git tak naprawdę nie jest czymś, co można po prostu odebrać i użyć, myślę, że musisz go poświęcić i przeprowadzić formalne szkolenie i ćwiczyć przed użyciem.
Dzięki, uratowałeś mi wiele łez!
Łukasz
33

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.

Uwaga: jest to tylko rozwiązanie lokalne. Kolejny facet klonujący repo nadal będzie miał problem z tym problemem. Stałe rozwiązanie można znaleźć tutaj: https://help.github.com/articles/dealing-with-line-endings/#re-normalizing-a-repository .

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:

edit .gitattributes

Comment out the line:    # text=auto

Save the file

restore .gitattributes:   git checkout .gitattributes
Richard Lalancette
źródło
Warto wspomnieć o treści komentowanego wiersza.
rbellamy
Niestety większość projektów nie ma tego opcjonalnego pliku
.gitattribute
Dziękuję Ci. Po prostu nie rozumiem, dlaczego jest to konieczne
diogovk
Czemu? Zasadniczo jest to tymczasowe rozwiązanie zakończenia linii. Użyj stałego rozwiązania, klikając link w uwadze.
Richard Lalancette,
11

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:

git stash save --keep-index

A następnie, aby usunąć skrytkę:

git stash drop
muczę muczę
źródło
To zadziałało dla mnie. Pamiętaj, że to --keep-indexjest ważne.
user991710
Dlaczego indeks --keep jest ważny?
Choylton B. Higginbottom
8

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

git rm --cached -r .
git reset --hard

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)

Fam Wired
źródło
6

Spróbuj zrobić

git checkout -f

To powinno usunąć wszystkie zmiany w bieżącym działającym repozytorium lokalnym

nsg
źródło
Miły! To zadziałało dla mnie. Chociaż w jednym upartym przypadku musiałem najpierw git checkout -f <another recent branch>wrócić do mojego oddziału zgit checkout -f <branch I'm working on>
Reversed Engineer
4

Byłem w stanie to naprawić tylko tymczasowo usuwając plik .gitattributes mojego repozytorium (który zdefiniował * text=autoi *.c text).

Pobiegłem git statuspo usunięciu i zmiany zniknęły. Nie wrócili nawet po przywróceniu .gitattributes.

Artfunkel
źródło
Działa to nawet w przypadku bardziej skomplikowanych atrybutów git, np. Filtrów
Samizdis,
2

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.

dpiskyulev
źródło
2

Miałem te same objawy, ale zostały spowodowane przez inną rzecz.

Nie byłem w stanie:

git checkout app.js //did nothing
git rm app.js //did nothing
rm -rf app.js //did nothing

nawet na git rm --cached app.jsnim podpisuje się jako usunięty, aw nie śledzonych plikach widziałem app.js. Ale kiedy spróbowałem rm -rf app.jsi wykonałem git statusponownie, nadal pokazuje mi plik w „nieśledzonym”.

Po kilku próbach z kolegą okazało się, że jest to spowodowane przez Grunta!

Po Gruntwłą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.

Nedvajz
źródło
2

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:

git diff styleguide/filename

diff --git a/filename b/filename
old mode 100644
new mode 100755

Aby tego uniknąć, upewnij się, że poprawnie skonfigurowałeś git

git config --global core.filemode false
bg17aw
źródło
2

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, .gitattributesaby 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:

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

  2. Otworzyłem te pliki w VIM i zmieniłem na Unix ( :set ff=unix). dos2unixOczywiście można użyć takiego narzędzia

  3. zobowiązany

  4. scalono masterw (master ma zmiany DOS-2-Unix)

    git checkout old-code-branch; git merge master

  5. Rozwiązane konflikty i pliki były ponownie DOS, więc musiało to być :set ff=unixw VIM. (Uwaga: Zainstalowałem https://github.com/itchyny/lightline.vim, co pozwoliło mi zobaczyć, jaki format pliku znajduje się na linii statusu VIM)

  6. zobowiązany. Wszystko posortowane!
HankCa
źródło
2

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

Xaav
źródło
2

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

gcs06
źródło
2

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

$ git clean --force -d
$ git checkout -- .

Może czasem lepszym rozwiązaniem jest po prostu wykonanie polecenia „git stash push” z opcjonalnym komunikatem:

$ git stash push -m "not sure if i will need this later"

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

$ git reset --hard

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:

$ git log

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:

$ git branch -d The-branch-i-created-earlier-today

Zmienione pliki wciąż się wyświetlały, więc zrobiłem:

$ git stash

To rozwiązało mój problem:

$ git status
On branch develop
Your branch is up to date with 'origin/develop'.

nothing to commit, working tree clean

Oczywiście $ git stash listpokaże ukryte zmiany, a ponieważ miałem ich niewiele i nie potrzebowałem żadnych $ git stash clearskrytek, usunąłem WSZYSTKIE SKŁADKI.

UWAGA : nie próbowałem robić tego, co ktoś mi tutaj zasugerował:

$ git rm --cached -r .
$ git reset --hard

Mogło to również zadziałać, na pewno wypróbuję to następnym razem, gdy napotkam ten problem.

Derek Gogol
źródło
1

Jeśli sklonujesz repozytorium i natychmiast zobaczysz oczekujące zmiany, to repozytorium jest w niespójnym stanie. Proszę NIE komentować * text=autoz .gitattributespliku. 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:

git clone git@host:repo-name
git checkout -b normalize-line-endings
git add .
git commit -m "Normalize line endings"
git push
git push -u origin normalize-line-endings

Następnie scal (lub ściągnij) oddział z właścicielem repozytorium.

w25r
źródło
1

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.

git add -A
git reset --hard
Philip Rego
źródło
1

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.

Jesper Lundin
źródło
0

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

git reset --hard
git pull origin
git merge
Strona B
źródło
0

Rozwiązałem to, edytując .git / config, dodając:

[branch "name_branch"]
    remote = origin
    merge = refs/heads/name_branch

Potem poszedłem do .git / refs / heads / name_branch i umieściłem identyfikator ostatniego zatwierdzeniaenter code here

Victor Villacorta
źródło
0

Rozwiązałem to w ten sposób:

  1. Skopiuj zawartość poprawnego kodu, który chcesz
  2. Usuń z dysku plik powodujący problem (ten, którego nie można przywrócić). teraz powinieneś znaleźć obie wersje tego samego pliku oznaczone jako usunięte.
  3. Zatwierdź usunięcie plików.
  4. Utwórz plik ponownie o tej samej nazwie i wklej poprawny kod skopiowany w kroku 1
  5. zatwierdzić utworzenie nowego pliku.

To działało dla mnie.

Michael Yousrie
źródło
0

Jedno zaproponowane rozwiązanie tutaj nie zadziałało, dowiedziałem się, że plik był tak naprawdę linkiem do niektórych znaków specjalnych:

% ls -l StoreLogo.png
lrwxrwxrwx 1 janus janus 8 Feb 21 10:37 StoreLogo.png -> ''$'\211''PNG'$'\r\n\032\n'

% git status    
Changes not staged for commit:
    modified:   StoreLogo.png

% git rm --cached -r StoreLogo.png
rm 'src/GWallet.Frontend.XF.UWP/Assets/StoreLogo.png'

% git reset StoreLogo.png         
Unstaged changes after reset:
M   src/GWallet.Frontend.XF.UWP/Assets/StoreLogo.png

% git status                      
Changes not staged for commit:
    modified:   StoreLogo.png
Janus Troelsen
źródło