Jak zignorować błąd „git pull” dotyczący moich lokalnych zmian, które zostałyby zastąpione przez scalanie?


567

Jak zignorować następujący komunikat o błędzie podczas pobierania Git?

Lokalne zmiany w poniższych plikach zostaną zastąpione przez scalenie

Co jeśli chcę je zastąpić?

Próbowałem takich rzeczy git pull -f, ale nic nie działa.

Dla jasności chcę tylko zastąpić określone zmiany, a nie wszystko.


Powiązane, ale bez duplikatu: stackoverflow.com/questions/52704/…
Daniel Hilgarth

7
@BrianKnoblauch całkowicie się zgadzam! Poza tym nie jest to „scalanie”, jeśli to „nadpisywanie”, prawda? Tęsknię za SVN codziennie ...
user1944491

2
git config core.fileMode falseoszczędzam swoje czasy
Nolwennig


Co jeśli nie chcę ich zastąpić?
Philip Rego,

Odpowiedzi:


438

Jeśli chcesz usunąć wszystkie lokalne zmiany - w tym pliki, które nie są śledzone przez git - z kopii roboczej, po prostu ukryj je:

git stash push --include-untracked

Jeśli już ich nie potrzebujesz, możesz upuścić tę skrytkę:

git stash drop

Jeśli nie chcesz ukrywać zmian, które już wprowadziłeś - np. Za pomocą git add- dodaj opcję --keep-index. Należy jednak pamiętać, że nadal będzie to zapobiegać scalaniu, jeśli te zmiany etapowe kolidują z tymi z góry.


Jeśli chcesz zastąpić tylko określone części lokalnych zmian, istnieją dwie możliwości:

  1. Zaakceptuj wszystko, czego nie chcesz zastąpić, i użyj powyższej metody do końca.

  2. Użyj git checkout path/to/file/to/revertdla zmian, które chcesz zastąpić. Upewnij się, że plik nie jest przenoszony przez git reset HEAD path/to/file/to/revert.


Możliwość # 2 nie działa. Po wykonaniu polecenia nic się nie dzieje. Przy ciągnięciu nadal pojawia się ten sam błąd.
mae

1
@ user1132363: Działa dla mnie. Najpierw przetestuj za pomocą jednego pliku. Upewnij się również, że plik, który chcesz zastąpić, nie jest przemieszczany.
Daniel Hilgarth

3
Sztuką było użyć git checkout HEAD^ path/to/file/to/revert. Korzystanie z HEAD ^ robiło różnicę.
mae

2
@ user1132363: Sprawdza poprzednią wersję, a nie tę, która jest aktualnie zalogowana. Nie sądzę, że jest to właściwe podejście.
Daniel Hilgarth

1
Musiałem pominąć „ save --keep-index”.
Peter Mortensen

318

W porządku, z pomocą dwóch pozostałych odpowiedzi, wpadłem na bezpośrednie rozwiązanie:

git checkout HEAD^ file/to/overwrite
git pull

7
To zadziałało dla mnie. Czy możesz rozwinąć tę odpowiedź, tj. co to właściwie robi?
AC Patrice,

3
To upuszczenie lokalnych zmian i powrót do odniesienia HEAD, który jest prawdopodobnie ostatnia popełnić w branży mistrz
K3A

32
dlaczego HEAD ^ zamiast HEAD?
Yura

19
HEAD ^ jest skrótem od HEAD ^ 1, co w zasadzie oznacza zatwierdzenie przed HEAD. Możesz także zrobić HEAD ^ 2 dla zatwierdzenia przed tym. Aby uzyskać więcej informacji, zobacz git-scm.com/book/en/v2/... i stackoverflow.com/questions/1955985/... .
davidneedham

4
proszę wyjaśnij, co to robi w odpowiedzi
endolith

242

Działa to w celu zastąpienia wszystkich lokalnych zmian i nie wymaga tożsamości:

git reset --hard
git pull

4
SO musi popracować nad swoim rankingiem, kłopotliwym, aby znaleźć działającą, wysoko ocenianą odpowiedź na dalszym etapie.
Benedykt K.

3
@BenedictK. Uważam, że system rankingowy odpowiednio odzwierciedla „to, co większość osób uważa za najbardziej pomocne”. Są one uszeregowane według głosów. Więcej osób woli inne rozwiązania. To dobre rozwiązanie, ale więcej osób uważa, że ​​inne odpowiedzi są bardziej pomocne.
Kittsil

Działa dobrze dla mnie
Ender

super łatwe =) thx ^^
lestat_kim

czołgi, działa dobrze dla mnie
Igor

76

Oto rozwiązanie, które odrzuca zmiany etapowe:

git reset file/to/overwrite
git checkout file/to/overwrite

11
Irytujące jest to, że jeśli zauważona różnica wynika z faktu, że plik został zmieniony przy wprowadzaniu nowego wiersza, nie rozwiąże to problemu.
DanielSank,

1
Rozwiązałem mój problem.
Loïc N.,

to najlepsza odpowiedź, imo, ponieważ nie zakłóca żadnych etapowych elementów, ale rozwiązuje problem z plikiem zapobiegającym ściągnięciu
theRiley

65

Możesz zatwierdzić zmiany przed scaleniem lub ukryć je:

  1. git stash save
  2. git merge origin/master
  3. git stash pop

10
Chodzi o to, że nie powinieneś tego robić. Po prostu weź aktualny materiał HEAD i ..... połącz go! To jest naprawdę proste, Git, wszystkie inne VCS to robią ... ale nie. Linus musiał sprawić, że korzystanie z niego będzie denerwujące.
Jon

@Jon To rozwiązanie jest dla Ubuntu, nie znalazłem nic lepszego niż to.
Suneel Kumar,

Niestety --autostashopcja jest dostępna tylko z --rebaseopcją (
Eugen Konkov

wprowadzi tak wiele problemów, że nie warto. Ładowanie zajmuje co najmniej 5 minut. Wprowadza również błędy „Odłącz plik”. downvote
Philip Rego,

51

Jeśli chcesz odrzucić zmiany lokalne w jednym pliku, możesz wykonać następujące czynności:

git checkout -- <file>

Następnie możesz zastąpić plik [s] najnowszą wersją, wykonując:

git pull

@pabloasc To zniszczy twoje lokalne zmiany w tym pliku.
Suneel Kumar

6
Tak, robi: „A jeśli chcę je zastąpić?”
David

1
Oryginalne pytanie nie jest w stanie tego udzielić, ta odpowiedź może dać komuś koszmar, który może na ślepo skopiować polecenie wklej.
Suneel Kumar,

Jeśli już wystawiłeś zatwierdzenie, najpierw musisz cofnąć zatwierdzenie przez, git reset HEAD~a następnie zrobićgit checkout
dopexxx,

git checkout -- <file>kończy się niepowodzeniemerror: pathspec '<file>' did not match any file(s) known to git.
A__

18

Jeśli Twoje repozytorium zawiera kilka plików, które zostały usunięte z master:

  1. git checkout master
  2. git fetch origin
  3. git reset --hard origin/master
  4. git checkout -b newbranch

12

Czasami żadna z nich nie działa. Irytujące jest to, że ze względu na LF myślę, że zadziała usuwanie plików, a następnie ciągnięcie. Nie polecam tego rozwiązania, ale jeśli plik nie istnieje, git nie bezużytecznie poinformuje cię, że twoje zmiany (które mogą nawet nie być zmianami) zostaną zastąpione i pozwolą ci kontynuować.

Używaj na własne ryzyko.


Gdy utkniesz z powodu zakończeń linii, ta metoda jest ratowaniem życia
Dan Pisarski

To nie działa dla mnie. Pliki nie istnieją lokalnie i nadal pojawia się błąd.
PRMan

11

git stash save --keep-index nie działało dla mnie.

poniższe polecenie działało zgodnie z oczekiwaniami.

git reset --hard
git pull

Zastępuje wszystkie lokalne zmiany, jeśli ich nie potrzebujesz.


9

Tyle odpowiedzi tutaj, że nienawidzę dodawać jeszcze jednej, ale wszystkie powyższe są bardziej nieprzyjemne niż powinny. Muszę to robić cały czas, ponieważ Git wydaje się być zdezorientowany i mówi, że zmodyfikowałem pliki, które się nie zmieniły (nie można przywrócić, ponieważ się nie zmieniły, ale nie mogę wyciągnąć, ponieważ podobno się zmieniły) Najprostsze i najszybszy jak dotąd znalazłem to:

git stash
git stash drop
git pull

działało jak urok
Blaze

Niesamowity! proste i działające rozwiązanie.
naïveRSA

genialne, wielkie dzięki
Hamza

8

W ostatnim Git, można dodać -r/ --rebasena pullpolecenia rebase aktualną gałąź na wierzchu górnej gałęzi po pobraniu. Ostrzeżenie powinno zniknąć, ale istnieje ryzyko konfliktów, które należy rozwiązać.


Alternatywnie możesz wymusić różne oddziały siłą, a następnie wrócić do nich masterponownie, np .:

git checkout origin/master -f
git checkout master -f

Następnie wyciągnij go jak zwykle:

git pull origin master

Zastosowanie tej metody pozwala zaoszczędzić czas od ukrywania ( git stash) i potencjalnych problemów z uprawnieniami, resetowania plików ( git reset HEAD --hard), usuwania plików ( git clean -fd) itp. Również powyższe jest łatwiejsze do zapamiętania.


8

Ten problem jest spowodowany tym, że dokonałeś zmian lokalnie w pliku / plikach i ten sam plik / pliki istnieje wraz ze zmianami w repozytorium Git, więc przed ściągnięciem / wypchnięciem będziesz potrzebował ukryć lokalne zmiany:

Aby zastąpić lokalne zmiany jednego pliku:

git reset file/to/overwrite
git checkout file/to/overwrite

Aby zastąpić wszystkie zmiany lokalne (zmiany we wszystkich plikach):

git stash
git pull
git stash pop

Problem może również wynikać z tego, że jesteś w gałęzi, która nie jest połączona z gałęzią główną.


5

git reset --hard && git clean -df

Uwaga : Spowoduje to zresetowanie i usunięcie wszystkich nieśledzonych plików.


27
Nie używa siekiery do usuwania muchy z czoła przyjaciela.
HonoredMule,

3
NIE używaj tego bez świadomości, że niektóre pliki zostaną USUNIĘTE.
andromeda,


4

Najlepszym sposobem rozwiązania tego problemu jest:

git checkout -- <path/file_name>

Następnie możesz zastąpić plik:

git pull origin master

Wspomniałem o problemie, ponieważ zaktualizowałem indeks, aby założyć, że pliki nie uległy zmianie. Nadal nie pozwoliłoby mi to zrobić. Użyłem git checkout -- path/*tylko raz, co pozwoliło mi na wykonanie ściągnięcia później.
Stephen O'Flynn,

4

Pomogło mi to odrzucić zmiany na zdalnym serwerze na żywo i pobrać z GitHub kontroli źródła:

git reset --hard
git pull origin master

4

Oto moja strategia rozwiązania problemu.

Opis problemu

Musimy wprowadzić zmiany w ponad 10 plikach. Próbowaliśmy PULL (git pull origin master), ale Git krzyknął:

błąd: lokalne zmiany w następujących plikach zostałyby zastąpione przez scalenie: proszę zatwierdzić zmiany lub ukryć je przed scaleniem.

Próbowaliśmy commitwtedy wykonać pull, ale one również nie działały.

Rozwiązanie

Właściwie byliśmy w brudnej fazie, ponieważ pliki znajdowały się w „Strefie przejściowej”, zwanej też „Strefą indeksów”, a niektóre znajdowały się w „Głównej strefie”, czyli „lokalnym katalogu Git”. I chcieliśmy pobrać zmiany z serwera.

Sprawdź ten link, aby uzyskać informacje na temat różnych etapów Git w przejrzysty sposób: Etapy GIT

Wykonaliśmy następujące kroki

  • git stash (dzięki temu nasz katalog roboczy był czysty. Twoje zmiany są przechowywane na stosie przez Git).
  • git pull origin master (Wyciągnij zmiany z serwera)
  • git stash apply (Zastosował wszystkie zmiany ze stosu)
  • git commit -m 'message' (Zatwierdził zmiany)
  • git push origin master (Przekazał zmiany na serwer)
  • git stash drop (Upuść stos)

Rozumiemy, kiedy i dlaczego potrzebujesz ukrywania

Jeśli jesteś w stanie brudnym , oznacza to, że dokonujesz zmian w swoich plikach, a następnie z jakiegoś powodu jesteś zmuszony pociągnąć lub przejść do innego oddziału w celu wykonania bardzo pilnej pracy, więc w tym momencie nie możesz wyciągnąć lub przełączaj, dopóki nie zatwierdzisz zmiany. stashPolecenia jest tutaj jako pomocnej dłoni.

Z książki ProGIT , wydanie drugie:

Często, gdy pracujesz nad częścią swojego projektu, rzeczy są w nieuporządkowanym stanie i chcesz zmienić gałęzie, aby trochę popracować nad czymś innym. Problem polega na tym, że nie chcesz wykonywać częściowo wykonanej pracy, abyś mógł wrócić do tego punktu później. Odpowiedzią na ten problem jest polecenie git stash. Ukrywanie zajmuje brudny stan katalogu roboczego - to znaczy zmodyfikowane pliki śledzenia i zmiany etapowe - i zapisuje je na stosie niedokończonych zmian, które można ponownie zastosować w dowolnym momencie.


3

Jeśli chcesz zastąpić określone zmiany, musisz powiedzieć, które z nich chcesz zapomnieć.

Możesz spróbować selektywnie ukryć zmiany, których chcesz porzucić, git stash --patcha następnie upuścić tę skrytkę git stash drop. Następnie możesz pobrać zmiany zdalne i scalić je jak zwykle.


3

TL; DR;

git pull --rebase --autostash
  -r, --rebase[=false|true|merges|preserve|interactive]
       When true, rebase the current branch on top of the upstream branch after
       fetching. If there is a remote-tracking branch corresponding to the upstream

  --autostash, --no-autostash
       Before starting rebase, stash local modifications away if
       needed, and apply the stash entry when done

Nie wiem, dlaczego nie ma jeszcze odpowiedzi, ale rozwiązanie, jak widać, jest proste. Wszystkie odpowiedzi tutaj sugerują to samo: aby usunąć / zapisać zmiany lokalne i zastosować wcześniej, a następnie (jeśli tak save) zastosuj zmiany lokalne na górze.

Co git pull --rebase --autostashrobi krok po kroku:

1. your local changes saved by `--autostash`
2. your local commits saved by `--rebase`
3. commits from upstream applied to your branch
4. your local commits are restored on top of upstream
5. your local changes are restored to working directory

Moja sprawa (prawdopodobnie twoja):

Mam zmiany lokalne (zmiany w katalogu roboczym):

wprowadź opis zdjęcia tutaj

Gdy próbuję pobrać zmiany zdalne, pojawia się błąd:

wprowadź opis zdjęcia tutaj

Te zmiany nie łączą się ze zmianami lokalnymi:

wprowadź opis zdjęcia tutaj

Kiedy więc pull --rebase --autostashlokalne zmiany zostały zapisane i zastosowane automatycznie bez żadnego problemu

wprowadź opis zdjęcia tutaj

Teraz moje lokalne zmiany są trochę niższe: wprowadź opis zdjęcia tutaj


2

Miałem taki przypadek szczególny: miałem plik z --assume-niezmieniony. Trudno było go zlokalizować, ponieważ git statuspolecenie nie wyświetlało żadnych zmian


Mam ten sam problem. Czy znalazłeś sposób na obejście tego? Przypuszczam, że mógłbym usunąć, a następnie ponownie dodać zakładam-niezmienione ... po prostu wyewidencjonowałem te pliki ręcznie, aby uzyskać niezmienione wersje ... po prostu zastanawiam się, czy istnieje sposób, aby po prostu nadpisać kasie / rebase / merge im.
David,

1
Nie, musiałem porzucić całą rzecz „zakładać niezmienioną”.

2

Jeśli chcesz zachować zmiany produkcyjne na serwerze, po prostu połącz się w nowy element konfiguracji. Metoda przetwarzania jest następująca:

git stash
git pull
git stash pop

Może nie wykonujesz wszystkich operacji. Możesz wiedzieć, co możesz zrobić dalej.


Następnie możesz użyć Git diff - w + nazwa pliku, aby automatycznie potwierdzić scalenie kodu
YanQing

1

Ignorowałem plik w moim repozytorium, a kiedy to zrobiłem git pull upstream master, otrzymałem następujący błąd:

błąd: lokalne zmiany w następujących plikach zostałyby zastąpione przez scalanie: myfile.js Proszę zatwierdzić zmiany lub ukryć je przed scaleniem. Przerwanie

Aby to rozwiązać, wykonałem następujące czynności

git update-index --no-assume-unchanged myfile.js

Zrobiłem to git statusi dostałem tę wiadomość

On master master Twój oddział stoi za „origin / master” o 4 zatwierdzenia i może być szybko przekazywany. (użyj „git pull”, aby zaktualizować swój lokalny oddział)

Zmiany, które nie zostały wprowadzone dla zatwierdzenia: (użyj „git add ...”, aby zaktualizować, co zostanie zatwierdzone) (użyj „git checkout - ...”, aby odrzucić zmiany w katalogu roboczym)

zmodyfikowano: myfile.js

nie dodano żadnych zmian do zatwierdzenia (użyj „git add” i / lub „git commit -a”)

Wtedy nie git checkout myfile.jsnastępuje git pull upstream master. Tym razem operacja ściągnięcia git zakończyła się powodzeniem.


1

Zetknąłem się z tym, wyciągając z mistrza.

Sposób, w jaki sobie z tym poradziłem, używając Visual Studio;

  1. Najpierw wykonałem polecenie Cofnij zatwierdzenie w moim rozwiązaniu.
  2. Potem zrobiłem proces ściągania Git.

Mam nadzieję że to pomoże!



1

Jestem nowy w Git i nie jestem pewien, czy moje rozwiązanie jest dobrym pomysłem.

Przetestowałem WSZYSTKIE odpowiedzi i żadna z nich nie działała dla mnie!

Ale znalazłem inne rozwiązanie:

1. Backup both of local and repository versions of the file.
2. Delete the file from repository.
3. git add .
4. git commit
5. git push

Mam nadzieję że to pomoże.


1

Wystąpił błąd „Lokalne zmiany w następujących plikach zostałyby zastąpione przez scalanie”, ponieważ masz pewne zmiany w lokalnym repozytorium, które NIE zostały jeszcze zatwierdzone, więc przed wyciągnięciem ze zdalnego repozytorium po prostu zatwierdź zmiany w lokalnym repozytorium.

Powiedzmy, że twoje zdalne repozytorium ma jakąś gałąź xyz i chcesz, aby gałąź zdalnej repozytorium xyz została następnie scalona w (skopiowaną do) lokalną gałąź repozytorium xyz,

{
git checkout xyz                  //check out to the respective branch in local repo
git commit -m "commiting message" //commit changes if any, in local repo branch xyz
git pull                          //it pulls remote xyz branch into local xyz branch
}

0

Jeśli ten błąd jest spowodowany zakończeniami linii,

git add
git checkout mybranch

będzie działać. Nie jestem do końca pewien, dlaczego to działa.


0

W przypadku Pycharm możesz zrobić Git -> Przywróć, a następnie pociągnąć.


0

Ten komunikat może się również zdarzyć, jeśli git-lfszostanie użyty, a wskaźnik pliku zostanie zastąpiony przez prawdziwy plik.

wtedy używasz:

git stash
git lfs migrate import
git pull

pełne wyjście z mojej skrzynki

λ git stash
Saved working directory and index state WIP on master: 5d4ad47 Merge branch 'feature/...' into 'master'
Encountered 1 file(s) that should have been pointers, but weren't:
        public/apple-touch-icon.png

λ git pull
Updating 5a4ad44..b25f79d
error: Your local changes to the following files would be overwritten by merge:
        public/apple-touch-icon.png
Please commit your changes or stash them before you merge.
Aborting

λ git lfs migrate import
migrate: Fetching remote refs: ..., done
migrate: Sorting commits: ..., done
migrate: Rewriting commits: 100% (0/0), done
migrate: Updating refs: ..., done
migrate: checkout: ..., done


λ git pull
Updating 5d4ad47..a25c79a
Fast-forward
 public/apple-touch-icon.png | Bin 2092 -> 130 bytes
 public/favicon.ico          | Bin 6518 -> 1150 bytes
 2 files changed, 0 insertions(+), 0 deletions(-)

patrz https://github.com/git-lfs/git-lfs/issues/2839


0

Próbowałem i to z powodzeniem, przed wyciągnięciem, pozwól zatwierdzić cały plik, który nie został zatwierdzony, wtedy nie otrzymasz tych wiadomości od AS.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.