Jak zmusić git pull do zastąpienia plików lokalnych?

Jak wymusić nadpisanie plików lokalnych na git pull?

Scenariusz jest następujący:

  • Członek zespołu modyfikuje szablony witryny internetowej, nad którą pracujemy
  • Dodają kilka obrazów do katalogu obrazów (ale zapominają dodać je pod kontrolą źródła)
  • Później wysyłają zdjęcia pocztą do mnie
  • Dodaję obrazy pod kontrolą źródła i wypycham je do GitHub wraz z innymi zmianami
  • Nie mogą pobierać aktualizacji z GitHuba, ponieważ Git nie chce nadpisywać ich plików.

Oto pojawia się błąd:

błąd: Nieśledzony plik drzewa roboczego „public/images/icon.gif” zostałby nadpisany przez połączenie

Jak zmusić Gita do ich zastąpienia? Osoba ta jest projektantem - zwykle rozwiązuję wszystkie konflikty ręcznie, więc serwer ma najnowszą wersję, którą wystarczy zaktualizować na swoim komputerze.


person Jakub Troszok    schedule 14.07.2009    source źródło
comment
każdy, kto to czyta, kto myśli, że może stracić pliki, byłem w tej sytuacji i odkryłem, że bufor Sublime Text mnie uratował - jeśli nad czymś pracuję, przypadkowo usuń wszystko, próbując rozwiązać podobny problem do tego lub używając odpowiedź na to pytanie i mam otwarte pliki w Sublime (na co jest duża szansa), wtedy pliki nadal tam będą Sublime, albo po prostu tam, albo w historii cofania   -  person Toni Leigh    schedule 20.01.2016
comment
zasadniczo, wykonuj ściąganie z developmentu dopiero po pierwszym sprawdzeniu -b. wykonaj swoją pracę, a następnie wejdź ponownie.   -  person ldgorman    schedule 22.08.2018
comment
Krótka odpowiedź: usuń i utwórz ponownie gałąź. 1. Usuń gałąź: git branch <branch> -D 2. Zresetuj do zatwierdzenia przed konfliktem: git reset <commit> --hard 3. Utwórz ponownie gałąź: git branch <branch> 4. Ustaw śledzenie na serwerze: git --set-upstream-to=origin/<branch> <branch> 5. Pull: git pull`   -  person Nino Filiu    schedule 24.09.2018
comment
Aby zmienić wszystkie zakończenia CRLF na LF, (rozpocznij od czyszczenia) git config core.autocrlf false; git ls-files -z | xargs -0 rm; git checkout .   -  person Chloe    schedule 17.01.2019
comment
Zamiast tego możesz szukać tego pytania: zamiast tego stackoverflow.com/q/1628088/1148030 Zresetuj lokalną gałąź repozytorium, aby była po prostu jak zdalne repozytorium HEAD Na przykład, jeśli pilot został wciśnięty na siłę i chcesz go wyciągnąć i odrzucić poprzednią inkarnację gałęzi, którą posiadasz. (Niektóre inne pytania wskazują na to pytanie jako ich duplikat, ale myślę, że powinny wskazywać na to inne pytanie.)   -  person Peter Lamberg    schedule 31.03.2020
comment
Ręcznie usuń wszystkie pliki i foldery z lokalnego repozytorium. Następnie uruchom git checkout <branch> && git add -A . && git reset --hard origin/<branch> && git pull. Zobacz stackoverflow.com/a/65239330.   -  person Henke    schedule 08.01.2021
comment
Na to pytanie na pewno jest odpowiedź, bo zrobiłem to przez przypadek. Teraz wiele tygodni pracy minęło :(   -  person Ben Alan    schedule 10.01.2021


Odpowiedzi (49)


⚠ Ważne: jeśli masz jakieś zmiany lokalne, zostaną one utracone. Z opcją --hard lub bez niej wszelkie lokalne zatwierdzenia, które nie zostały przekazane, zostaną utracone.[*]

Jeśli masz jakieś pliki, które nie są śledzone przez Git (np. przesłane treści użytkowników), nie będzie to miało wpływu na te pliki.


Najpierw uruchom pobieranie, aby zaktualizować wszystkie origin/<branch> referencje do najnowszych:

git fetch --all

Utwórz kopię zapasową bieżącego oddziału:

git branch backup-master

Następnie masz dwie opcje:

git reset --hard origin/master

LUB Jeśli jesteś w innym oddziale:

git reset --hard origin/<branch_name>

Wyjaśnienie:

git fetch pobiera najnowszą wersję ze zdalnego komputera, bez konieczności łączenia lub zmiany bazy.

Następnie git reset resetuje gałąź główną do tego, co właśnie pobrałeś. Opcja --hard zmienia wszystkie pliki w drzewie roboczym tak, aby pasowały do ​​plików w origin/master


Utrzymuj bieżące zobowiązania lokalne

[*]: Warto zauważyć, że możliwe jest utrzymanie bieżących zatwierdzeń lokalnych poprzez utworzenie gałęzi z master przed zresetowaniem:

git checkout master
git branch new-branch-to-save-current-commits
git fetch --all
git reset --hard origin/master

Następnie wszystkie stare zatwierdzenia zostaną zachowane w new-branch-to-save-current-commits.

Niezatwierdzone zmiany

Jednak niezatwierdzone zmiany (nawet przestawione) zostaną utracone. Pamiętaj, aby przechowywać i zatwierdzać wszystko, czego potrzebujesz. W tym celu możesz uruchomić następujące czynności:

git stash

A następnie, aby ponownie zastosować te niezatwierdzone zmiany:

git stash pop
person RNA    schedule 17.01.2012
comment
Uważaj! Jeśli masz lokalne, niewysunięte zatwierdzenia, usunie się je z twojej gałęzi! To rozwiązanie sprawia, że ​​nieśledzone pliki nie znajdują się w repozytorium w nienaruszonym stanie, ale zastępują wszystko inne. - person Matthijs P; 17.05.2012
comment
To popularne pytanie, dlatego chciałbym wyjaśnić tutaj w górnym komentarzu. Właśnie wykonałem polecenia zgodnie z opisem w tej odpowiedzi i nie usunąłem WSZYSTKICH plików lokalnych. Nadpisane zostały tylko zdalnie śledzone pliki, a każdy plik lokalny, który tu był, pozostał nietknięty. - person Red; 22.11.2012
comment
Straciłem wszystkie lokalne zatwierdzenia, których nie było w drzewie origin/master po zmianie bazy. Tutaj bardzo możliwe jest strzelenie sobie w stopę. - person Cuadue; 23.11.2013
comment
Możesz to również zrobić dla gałęzi śledzącej, jeśli masz tę samą gałąź w pochodzenia i lokalnie, po prostu zmień git reset --hard Origin/master na git reset --hard Origin/(branch) - person Joshua Kolden; 14.12.2013
comment
w przypadku pobierania z repozytorium, którego nazwa oddziału zdalnego różni się od nazwy głównej, użyj git reset --hard origin/branch-name - person Abbas Gadhia; 17.12.2013
comment
To powinna być zaakceptowana odpowiedź. Działa dobrze dla mnie. Zakładam jednak, że nie ma lokalnych zatwierdzeń, co w moim przypadku jest dobre, ponieważ lokalny posiada tylko klucz wdrożenia. - person Ardee Aram; 07.04.2014
comment
Czy to nie wyrzuci również moich lokalnych zatwierdzeń? Chcę zachować moje zatwierdzenia i nadpisywać tylko nieśledzone/niezatwierdzone zmiany. - person mcv; 02.05.2014
comment
Po prostu używam git fetch, aby pobrać gałąź nadrzędną, a następnie resetuję, gdy muszę naprawić kilka plików. Możesz uzyskać gałąź nadrzędną za pomocą git Branch -vv - person Natus Drew; 18.08.2014
comment
@mcv Aby zachować lokalne zatwierdzenia, chcesz git reset --hard HEAD, za którymi możesz następnie podążać git merge origin/master. - person joeytwiddle; 19.08.2014
comment
Biorąc pod uwagę liczbę głosów pozytywnych na to pytanie i odpowiedź, myślę, że git powinien zawierać polecenie takie jak git pull -f - person Sophivorus; 26.08.2014
comment
Zatwierdzenia, które nie zostały wypchnięte przed twardym resetem, można odzyskać za pomocą git reflog, które wyświetla listę wszystkich zatwierdzeń, także tych bez podstawy. Dopóki nie wyczyścisz swojej lokalnej kopii za pomocą git gc, wszystko przepadnie - person Koen.; 11.02.2015
comment
Czy spowoduje to usunięcie plików, które mam w formacie .gitignore? - person user3817250; 01.04.2015
comment
@FelipeSchenone Właściwie jest git pull -f, ale nie robi tego, czego wszyscy chcemy. - person sudo; 01.05.2015
comment
Prawdę mówiąc, niezatwierdzone zmiany zostaną utracone, ale stare zatwierdzenia wiszą i czekają na wyrzucenie elementów bezużytecznych. Nadal możesz je zobaczyć w git reflog i przesunąć HEAD z powrotem za pomocą git reset --hard HEAD@{1}. - person Florian Fida; 29.05.2015
comment
Chcę tutaj zaznaczyć, że usunie to również wszelkie zmiany wprowadzone w jakimkolwiek innym oddziale, który nie jest śledzony zdalnie. Zgubiłem swój, mam nadzieję, że inni będą ostrożni. - person Devesh Khandelwal; 27.06.2015
comment
Wykonaj kopię zapasową folderu z plikami lokalnymi, w tym folderem .git. Teraz nie możesz niczego „stracić”, jeśli ta poprawka nie zadziała; możesz zrobić kolejną kopię i spróbować czegoś innego. Nie operuj w pojedynczym folderze i ufaj gitowi, jak gdyby był w 100% niezawodnym narzędziem do tworzenia kopii zapasowych. Jedna literówka, zwłaszcza w gałęziach, może być koszmarem. Sugeruję wykonanie kopii zapasowej starej szkoły w folderach tar.gz, a następnie uruchomienie gita z najnowszej kopii. - person JosephK; 13.08.2015
comment
@Red Tak, jeśli chcesz usunąć wszystko, co nie jest śledzone, a nawet zignorowane, użyj git clean -dxf po twardym zresetowaniu. - person IceGlow; 31.12.2015
comment
Zrobiłem to i moje lokalne zmiany NIE zostały odrzucone - co jest niefortunne, ponieważ miałem nadzieję, że tak się stanie! Czy ktoś wie, jak to zrobić, ale także zmusić gita do odrzucenia wszelkich zmian ustawień regionalnych, które nie istnieją w zdalnej gałęzi? Zasadniczo chcę DOKŁADNEJ korespondencji 1 do 1 ze zdalnym oddziałem. - person Gershy; 04.01.2016
comment
Mało znany fakt - możesz właściwie wykonać kopię zapasową całego repozytorium git za pomocą starego, dobrego tar -czf myrepodir.tar.gz myrepodir/.. Jeśli w Twoim repozytorium wszystko się popsuje z powodu dziwaczności gita, usuń je i przywróć z pliku tar.gz, aby RZECZYWIŚCIE wrócić do stanu, w którym byłeś, zanim podjąłeś się tego niefortunnego eksperymentu. Tylko upewnij się, że masz . po myrepodir/, w przeciwnym razie Twoje .git i inne ukryte pliki nie zostaną zapisane! - person Buttle Butkus; 06.02.2016
comment
czy ta technika może działać w przypadku pojedynczych plików? na przykład -- index.php helpers.js ect. zamiast --all? - person Steve C; 09.09.2016
comment
nie zadziałało dla mnie. wypróbowałem to rozwiązanie, wypróbowałem git clean -dfx. próbowałem git pull -f. nadal pojawia się ten sam komunikat o błędzie. - person InsOp; 04.10.2016
comment
Pamiętaj, że możesz skrócić nazwę oddziału o @{u}, co jest znacznie krótsze. - person Antimony; 06.06.2017
comment
@GershomMaes git clean -dfx po twardym resecie, jak wspomniano powyżej przez Lodowy Blask? - person Franklin Yu; 23.03.2018
comment
czy nie jest łatwiej po prostu rm -rf /folder i ponownie wykonać git clone, jeśli chcesz odrzucić wszystkie lokalne zmiany? - person JonB; 04.10.2018
comment
Używając git clean -dffx, pamiętaj, aby uruchomić go z katalogu najwyższego poziomu projektu git. Dobrym pomysłem jest najpierw uruchomienie git clean -ndffx, aby wyświetlić listę plików przed ich usunięciem, ponieważ opcja -x usuwa pliki, które są .gitignored i nie są wyświetlane przez git status - person Josiah Yoder; 22.04.2019
comment
@JonB: czy nie jest łatwiej po prostu rm -rf /folder i ponownie wykonać git clone...? Przyprowadziło mnie tutaj (nawet niezbyt) duże repozytorium + niska przepustowość. Bardzo chciałbym ponownie sklonować, ale za pierwszym razem było to wystarczająco bolesne, więc należę do osób szukających szybszego rozwiązania. - person Sz.; 11.07.2019
comment
pracował dla mnie, gdy gałąź źródłowa zawierała aktualizacje, takie jak zmiana nazw plików z ogólnego na ogólne. W systemie Windows nie ma znaczenia, jaki jest przypadek, więc to podejście mnie odblokowało. - person Someone Somewhere; 08.08.2019
comment
Mecurial ma hg update, ale nie ma odpowiednika w git... - person Jack; 11.03.2020
comment
Byłoby bardziej spójnie, gdybyś mógł zrobić git pull --force i po prostu nadpisałby twój lokalny oddział. Ponieważ możesz zrobić odwrotnie, nadpisując pilota przez git push --force - person Jonny; 12.03.2020
comment
Straciłem wszystkie lokalne zatwierdzenia za pomocą sugerowanych poleceń. - person Sylvain Rodrigue; 17.08.2020
comment
Zauważ, że gałąź główna nazywa się teraz domyślnie gałęzią główną, więc zwróć uwagę na kopiujących, ponieważ te polecenia mogą już nie działać. - person Matt; 27.10.2020
comment
Przepraszam. Zbyt skomplikowane. Zamiast tego po prostu usuń i sklonuj ponownie ... - person Niclas; 05.12.2020
comment
Jeśli uruchomisz git checkout -b Backup-master, powinieneś wrócić do swojej gałęzi (w przykładzie master) przed uruchomieniem git reset. W przeciwnym razie możesz zamiast tego użyć git Branch Backup-Master, aby utworzyć gałąź kopii zapasowej, ale pozostań w master. - person Karim Sonbol; 11.12.2020
comment
Po wykonaniu tej czynności mam fatalny komunikat: Nie można znaleźć zdalnego wzorca referencyjnego, gdy robię git pull Origin Master - person G M; 14.04.2021

Spróbuj tego:

git reset --hard HEAD
git pull

Powinno robić to, co chcesz.

person Travis Reeder    schedule 09.05.2010
comment
Zrobiłem to i niektóre pliki lokalne, których nie było już w repozytorium, pozostały na dysku. - person Piotr Owsiak; 08.04.2011
comment
Nie sądzę, że jest to prawidłowe. powyższe spowoduje połączenie, a nie nadpisanie, o co proszono w pytaniu: Jak zmusić gita do ich zastąpienia? Nie mam odpowiedzi, obecnie jej szukam.. w tej chwili przełączam się do gałęzi z kodem, który chcę zachować git checkout BranchWithCodeToKeep, następnie wykonaj git Branch -D BranchToOverwrite i wreszcie git checkout -b BranchToOverwrite. będziesz mieć teraz dokładny kod z BranchWithCodeToKeep w gałęzi BranchToOverwrite bez konieczności wykonywania scalania. - person felbus; 13.07.2011
comment
zamiast łączyć za pomocą „git pull”, spróbuj git fetch --all, a następnie „git reset --hard Origin/master” - person Lloyd Moore; 21.02.2012
comment
Sugestia Lloyda Moore'a jest poprawna, ale uważaj, ponieważ może usunąć lokalne, niewysłane zatwierdzenia z twojej gałęzi. - person Matthijs P; 17.05.2012
comment
tak, rozwiązanie @lloydmoore zadziałało dla mnie. Przydałoby się być odpowiedzią, a nie tylko komentarzem. - person Max Williams; 19.11.2012
comment
Spowoduje to zresetowanie bieżących zmian z powrotem do ostatniego pobranego zatwierdzenia gałęzi. Następnie git pull łączy zmiany z najnowszej gałęzi. Zrobiło to dokładnie to, czego chciałem.. Dzięki! - person Codeversed; 05.12.2014
comment
Czy to zepsuje pilota? - person user1767754; 30.09.2015
comment
Dobra odpowiedź, ale dodaj więcej szczegółów, to znaczy, że niektórzy ludzie mogą nic nie wiedzieć o resetowaniu i stracić swoje pliki... - person Mohammad Kermani; 17.01.2017
comment
@Travis R, czy mógłbyś wyjaśnić cel git rest --hard HEAD? - person Imanez; 06.03.2017
comment
W niektórych przypadkach git reset --hard HEAD tak naprawdę nie resetuje wszystkiego - person Finesse; 06.03.2018
comment
Najczęściej o tym myślę, gdy myślę o wymuszeniu ciągnięcia. Głównie po wypróbowaniu niektórych ustawień - person Mianala Loharano; 04.07.2018
comment
czy możesz wyjaśnić, co robi twój kod? (to tylko 2 linie) - person Charlie Parker; 31.03.2021

OSTRZEŻENIE: git clean usuwa wszystkie nieśledzone pliki/katalogi i nie można tego cofnąć.


Czasami samo clean -f nie pomaga. Jeśli nie śledzisz KATALOGÓW, potrzebna jest również opcja -d:

# WARNING: this can't be undone!

git reset --hard HEAD
git clean -f -d
git pull

OSTRZEŻENIE: git clean usuwa wszystkie nieśledzone pliki/katalogi i nie można tego cofnąć.

Rozważ najpierw użycie flagi -n (--dry-run). To pokaże Ci, co zostanie usunięte, bez faktycznego usuwania czegokolwiek:

git clean -n -f -d

Przykładowe wyjście:

Would remove untracked-file-1.txt
Would remove untracked-file-2.txt
Would remove untracked/folder
...
person David Avsajanishvili    schedule 19.03.2011
comment
Możesz podać git clean argument ścieżki, aby był bardziej szczegółowy i uniknąć usuwania nieśledzonych plików, które nie powodują konfliktów. - person joachim; 18.10.2011
comment
Myślę, że opis scenariusza jasno pokazuje, że tak naprawdę nie chce wyrzucać treści. Raczej chce powstrzymać Gita przed nadpisywaniem plików. @Lauri, to nie powinno ci się przytrafić. Niestety wydaje się, że ludzie błędnie odczytali istotę opisu scenariusza - zobacz moją sugestię. - person Hedgehog; 12.02.2012
comment
W KOŃCU. git clean -f -d jest przydatny, gdy make clean nie wyczyści wszystkiego. - person earthmeLon; 23.06.2012
comment
Jeśli chcesz zsynchronizować cały katalog ze zdalnym repozytorium, jest to właściwy sposób. - person Johannes Ewald; 11.02.2013
comment
@crizCraig, chyba że zostaną dodane w .gitignore - person Bleeding Fingers; 13.06.2013
comment
@BleedingFingers Następnie dodaj -x. Ale istniejące pliki objęte .gitignore nie powinny stanowić problemu: zakładając, że inni współautorzy tego repozytorium używają tego samego pliku .gitignore, pull nie otrzyma żadnych zatwierdzeń, które dodadzą konfliktujące pliki. - person ; 07.06.2015
comment
@earthmeLon, do tego możesz potrzebować git clean -dfx. -x ignoruje .gitignore. Zazwyczaj produkty do kompilacji będą znajdować się w formacie .gitignore. - person Paul Draper; 12.08.2015
comment
Dobrym rozwiązaniem może być najpierw uruchomienie git clean -nfd, co pokaże tylko, co zostanie usunięte, zanim zostanie to faktycznie wykonane, czyli zanim napotkasz problemy. :-) - person Velda; 16.08.2018

Podobnie jak Jeż, myślę, że odpowiedzi są okropne. Ale chociaż odpowiedź Hedgehoga może być lepsza, nie sądzę, że jest tak elegancka, jak mogłaby być. Sposób, w jaki udało mi się to zrobić, polega na użyciu fetch i merge ze zdefiniowaną strategią. Co powinno sprawić, że lokalne zmiany zostaną zachowane, o ile nie są jednym z plików, którymi próbujesz wymusić zastąpienie.

Najpierw wykonaj zatwierdzenie zmian

 git add *
 git commit -a -m "local file server commit message"

Następnie pobierz zmiany i zastąp je, jeśli wystąpi konflikt

 git fetch origin master
 git merge -s recursive -X theirs origin/master

-X to nazwa opcji, a theirs to wartość tej opcji. Decydujesz się na użycie their zmian (druga opcja to ours zmian), jeśli wystąpi konflikt.

person Richard Kersey    schedule 11.04.2012
comment
To najlepsza odpowiedź, jaką do tej pory widziałem. Nie próbowałem tego, ale w przeciwieństwie do innych odpowiedzi, nie ma to na celu zniszczenia wszystkich nieśledzonych plików, co jest bardzo niebezpieczne z oczywistych powodów. - person huyz; 07.05.2012
comment
To samo - zadziałało to w moim przypadku, gdy wykonywałem bardzo duże scalanie (żądanie ściągnięcia GitHub), gdzie chciałem po prostu zaakceptować to wszystko oprócz tego, co miałem. Dobra odpowiedź! W moim przypadku dwa ostatnie polecenia to: 1) get fetch other-repo; 2) git merge -s recursive -X theirs other-repo/master - person quux00; 27.07.2012
comment
Spowoduje to zastąpienie wszelkich konfliktów z plikami repozytoriów, a nie plikami lokalnymi, prawda? - person Nathan F.; 05.12.2014
comment
Najlepsza odpowiedź. Najwyższa zaakceptowana odpowiedź pozostawiła mnie w moim przypadku na odłączonej głowie. Wróciłem do lokalnej gałęzi głównej i uruchomiłem git merge -X theirs origin/master - person petergus; 11.03.2016
comment
Próbowałem tego - następnie dodaj/zatwierdź moje nowe zmienione pliki, ale nadal mówiłem, że moja gałąź była za zdalną, gdy próbowałem wypchnąć. Ogromna strata czasu, ponieważ git pull nie pyta o Zastąp lokalnie? t/n/wszystko. - person JosephK; 26.07.2016
comment
Poczekaj… czy git add * i git commit -a <more-options-here> nie mają tego samego efektu? Dlaczego miałbyś potrzebować obu? - person Marcel Stör; 25.04.2017
comment
@MarcelStör nie potrzebujesz obu, ale oni też nie robią tego samego. git commit -a ma to wpływ tylko na pliki, które są już śledzone; git add * doda pliki, które nie są śledzone. Jeśli więc zrobisz git commit -a, nowe pliki nie zostaną przechwycone, być może będziesz musiał później wykonać git add, ale jeśli to zrobisz git add *, nie będziesz potrzebować -a przy zatwierdzeniu. - person briantist; 04.04.2018
comment
Problem z tą (doskonałą) odpowiedzią polega na tym, że dodaje wszystkie pliki lokalne, co czasami może nie być tym, czego chcesz. Możesz po prostu dodać określone pliki, które zostały pominięte. Ale najlepsze w tym jest to, że zmusza go do zrobienia tego, co powinien był zrobić – dodania ich lokalnie. Prawdopodobnie nie będziesz potrzebować strategii -X, ponieważ są to ten sam obraz. Właściwie sugerowałbym pominięcie tego na początku, aby dowiedzieć się, czy są jakieś anomalie, i dodanie ich, jeśli takowe wystąpią, po sprawdzeniu, że „ich” jest zawsze właściwym wyborem. Ale wtedy popadam w paranoję. - person Bob Kerns; 28.06.2018
comment
Chciałem tylko, żeby ten cholerny git nadpisał wszystko i zamknął się w tej sprawie. w końcu używam go tylko między komputerem służbowym a niektórymi systemami Raspberry Pi. Życzę opcji wymuszenia nadpisania, przynajmniej dla lidera projektu - person clockw0rk; 05.06.2019
comment
po wypróbowaniu tego polecenia nadal wyskakuje ten sam błąd, że nieśledzone działające pliki drzewa zostałyby nadpisane przez połączenie, a długa, ale niekompletna lista plików, której nie mogę po prostu zmusić do nadpisania. - person Patrick Parker; 02.10.2020
comment
hmmm... może najpierw spróbuj git add . - person Richard Kersey; 05.10.2020

Zamiast robić:

git fetch --all
git reset --hard origin/master

Radziłbym wykonać następujące czynności:

git fetch origin master
git reset --hard origin/master

Nie musisz pobierać wszystkich pilotów i gałęzi, jeśli masz zamiar zresetować do gałęzi Origin/Master, prawda?

person Johanneke    schedule 26.04.2013
comment
Twoja odpowiedź jest właśnie tym, czego potrzebowałeś dla swojego przedstawiciela. Muszę zapytać, czy to usuwa również wszystkie nieśledzone pliki? - person Nicolas De Jay; 07.01.2014
comment
Tak, większość moich przedstawicieli pochodzi stąd :) Spowoduje to również usunięcie wszystkich nieśledzonych plików. Coś, o czym zapomniałem i co boleśnie przypomniało mi się zaledwie 2 dni temu… - person Johanneke; 09.01.2014
comment
Zobacz komentarze do tej innej odpowiedzi: stackoverflow.com/a/8888015/2151700 - person Johanneke; 09.01.2014
comment
Nie spowodowało to usunięcia moich nieśledzonych plików; czego właściwie się spodziewałem. Czy jest powód, dla którego może to dotyczyć niektórych osób, a nie innych? - person arichards; 19.04.2016
comment
Git reset nie wpływa na nieśledzone pliki. Jeśli chcesz, aby one również zostały usunięte, wykonaj najpierw git add ., a następnie git reset --hard - person Johanneke; 15.08.2017
comment
Właśnie tego potrzebowałem: czegoś, co nadpisuje nieśledzone pliki istniejące na pilocie i pozostawia wszystko inne nienaruszone. - person Ledazinha; 21.12.2017
comment
zadziałało całkiem nieźle - person Wilson; 18.06.2021
comment
master nie jest już politycznie poprawny, git woli teraz main. - person Rick Graves; 26.06.2021

Wygląda na to, że najlepszym sposobem jest najpierw:

git clean

Aby usunąć wszystkie nieśledzone pliki i kontynuować zwykłe git pull...

person Jakub Troszok    schedule 14.07.2009
comment
Próbowałem użyć git clean, aby rozwiązać ten sam problem, ale to nie rozwiązało go. git status mówi, że Twoja gałąź i „Origin/master” rozeszły się, # i mają odpowiednio 2 i 9 różnych zatwierdzeń. i git pull mówi coś podobnego do tego, co masz powyżej. - person slacy; 24.09.2009
comment
czy nie musiałby przejść do gałęzi master, a następnie wykonać git clean, aby zadziałało? Następnie może wrócić do dowolnej gałęzi rozwoju, w której pracował. - person suitedupgeek; 26.01.2010
comment
@slacy: Następnie musisz połączyć dwie gałęzie. - person Xiong Chiamiov; 05.02.2010
comment
git clean jest raczej tępym narzędziem i może wyrzucić wiele rzeczy, które warto zachować. Lepiej usunąć lub zmienić nazwę plików, na które narzeka git, dopóki ściąganie się nie powiedzie. - person Neil Mayhew; 02.07.2010
comment
Nie sądzę, żeby to ogólnie działało. Czy nie ma sposobu, aby w zasadzie zdalnie klonować git poprzez wymuszone ściągnięcie git? - person mathtick; 29.11.2010
comment
@mathick: git fetch origin && git reset --hard origin/master - person Arrowmaster; 23.02.2011
comment
Z jakiegoś powodu musiałem dodać -x do tego git clean, aby to zadziałało (z jakiegoś powodu -d nie usuwał katalogu .ideas), ale to z pewnością rozwiązało mój problem. - person Owen Blacker; 19.12.2011
comment
uniknąć nagłego zatrzymania krążenia: użyj najpierw git clean -n - person doub1ejack; 30.07.2013
comment
Czy git clean jest tutaj najlepszą odpowiedzią? Wygląda na to, że usuwanie plików niekoniecznie jest tym, czego chce OP. Poprosili o „nadpisanie plików lokalnych”, a nie ich usunięcie. - person JohnAllen; 04.03.2014
comment
git clean samo w sobie nie wydaje się pomagać, rozwiązanie @Arrowmaster jest bliższe, ale lepsze rozwiązanie Lloyda Moore'a znajduje się w następnej odpowiedzi. - person Neil Monroe; 11.06.2015
comment
Nigdy nie rób niczego „git” (ani nawet nie twórz folderu .git) z wyjątkiem kopii swojego aktualnego folderu roboczego i unikaj wszelkiego stresu kardiologicznego. Przede wszystkim nie dawaj Gitowi i jego niejasnej składni/metodom możliwości zniszczenia Cię. - person JosephK; 26.07.2016

Uwaga, wykonanie tej czynności spowoduje trwale usuń swoje pliki, jeśli masz jakieś wpisy w katalogu/* w pliku gitignore.

Niektóre odpowiedzi wydają się okropne. Straszne w sensie tego, co przydarzyło się @Lauri, postępując zgodnie z sugestią Davida Avsajanishvili.

Raczej (git > v1.7.6):

git stash --include-untracked
git pull

Później możesz wyczyścić historię skrytki.

Ręcznie, jeden po drugim:

$ git stash list
stash@{0}: WIP on <branch>: ...
stash@{1}: WIP on <branch>: ...

$ git stash drop stash@{0}
$ git stash drop stash@{1}

Brutalnie, wszystko na raz:

$ git stash clear

Oczywiście, jeśli chcesz wrócić do tego, co ukryłeś:

$ git stash list
...
$ git stash apply stash@{5}
person Hedgehog    schedule 11.02.2012
comment
Czy nie zakładasz, że zatwierdzenie nigdy nie zostało wykonane? W moim przypadku dokonałem kilku zatwierdzeń w moim oddziale lokalnym, ale chciałem zresetować wszystko z powrotem do oddziału zdalnego - person Lee Francis; 20.03.2012
comment
Nie, nie sądzę. Ukrywanie po prostu usuwa niezatwierdzone pliki. Powyższe przenosi również (przechowuje) pliki, których git nie śledzi. Zapobiega to ściąganiu plików dodanych do pilota, które nie zostały jeszcze ściągnięte na Twój komputer, ale które utworzyłeś (!). Wszystko bez niszczenia niezaangażowanej pracy. Mam nadzieję, że to ma sens? - person Hedgehog; 21.03.2012
comment
Jeśli nie masz wersji 1.7.6, możesz naśladować --include-untracked, po prostu tymczasowo git add-ując całe repozytorium, a następnie natychmiast je przechowując. - person nategood; 02.05.2012
comment
Zgadzam się z Jeżykiem. Jeśli zastosujesz się do popularnych tutaj odpowiedzi, najprawdopodobniej odkryjesz, że nieumyślnie zabiłeś wiele rzeczy, których tak naprawdę nie chciałeś stracić. - person Guardius; 01.02.2013
comment
Miałem inne nieśledzone pliki - oprócz tego, który chciał zastąpić/wyciągnąć, więc to rozwiązanie sprawdziło się najlepiej. git stash apply przywrócił wszystkie moje nieśledzone pliki z wyjątkiem (słusznie) tych, które już powstały w wyniku połączenia: już istnieją, nie ma kasy. Działało idealnie. - person BigBlueHat; 25.04.2013
comment
Może to być najłatwiejszy sposób na niezamierzone przesłanie repozytorium, tak jak to przydarzyło się @Lauri, ale gorzej, ponieważ myślisz, że chronisz pliki przed usunięciem. Jeśli masz jedną .gitignore regułę zawierającą symbol wieloznaczny, pocałuj ją na pożegnanie. Wyjaśnienie. - person Walf; 30.11.2016
comment
To najczystsza odpowiedź i powinna zostać zaakceptowana. Aby zaoszczędzić trochę czasu na pisaniu, możesz użyć krótkiego formularza: git stash -u. - person ccpizza; 23.03.2017
comment
Link do niszczenia folderów gitignored przez git stash --include-untracked jest martwy — znajdźmy zamiennik. W międzyczasie komentarz @Waif na temat w jaki sposób ta odpowiedź może zniszczyć foldery gitignore powinien zostać przegłosowany, a najlepiej przekonwertowany na nową odpowiedź. Problem z GitLabem podlinkowałeś, zawiera szczegóły. Często używam git stash i byłem bardzo zaskoczony, gdy usłyszałem, że może niszczyć pliki. - person RichVel; 15.04.2019

To polecenie może okazać się przydatne do wyrzucenia lokalnych zmian:

git checkout <your-branch> -f

A następnie wykonaj czyszczenie (usuwa nieśledzone pliki z drzewa roboczego):

git clean -f

Jeśli chcesz usunąć nieśledzone katalogi oprócz nieśledzonych plików:

git clean -fd
person Vishal    schedule 05.08.2010
comment
Myślę, że opis scenariusza jasno pokazuje, że tak naprawdę nie chce wyrzucać treści. Raczej chce powstrzymać Gita przed nadpisywaniem plików. Zobacz moją sugestię. - person Hedgehog; 12.02.2012
comment
Chociaż ta odpowiedź może nie pasować dokładnie do opisu, i tak oszczędziła mi frustracji związanej z kręceniem się przez gita przy powrocie karetki (zdarzenie z autocrlf false). Kiedy git reset --hard HEAD nie pozostawia żadnych zmodyfikowanych plików, te flagi -f są całkiem pomocne. Wielkie dzięki. - person Kellindil; 16.01.2013

Zamiast łączyć się z git pull, spróbuj tego:

git fetch --all

śledzony przez:

git reset --hard origin/master.

person Lloyd Moore    schedule 22.11.2012

Jedyne, co dla mnie zadziałało, to:

git reset --hard HEAD~5

Spowoduje to cofnięcie się o pięć zatwierdzeń, a następnie

git pull

Znalazłem to, sprawdzając jak cofnąć połączenie Git.

person Chris BIllante    schedule 05.05.2011
comment
To właśnie ostatecznie zadziałało dla mnie, ponieważ wymusiłem wypchnięcie mojego oddziału do repozytorium Origin i ciągle pojawiały się konflikty scalania, gdy próbowałem przeciągnąć go do mojego zdalnego repozytorium. - person jwfrench; 07.05.2014
comment
Cześć, właściwie to jest sztuczka dla work around, ale naprawdę skuteczna. Ponieważ niektóre konflikty mogą wystąpić tylko w kilku zatwierdzeniach, cofnięcie 5 zatwierdzeń sprawi, że nie będzie konfliktów ze zdalnym kodem. - person Hoang Le; 21.11.2014

Problem ze wszystkimi tymi rozwiązaniami polega na tym, że są albo zbyt skomplikowane, albo, co jest jeszcze większym problemem, polega na tym, że usuwają wszystkie nieśledzone pliki z serwera WWW, czego nie chcemy, ponieważ zawsze są potrzebne pliki konfiguracyjne, które są włączone na serwerze, a nie w repozytorium Git.

Oto najczystsze rozwiązanie, którego używamy:

# Fetch the newest code
git fetch

# Delete all files which are being added, so there
# are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    rm -f -- "$file"
done

# Checkout all files which were locally modified
for file in `git diff --name-status | awk '/^[CDMRTUX]/ {print $2}'`
do
    git checkout -- "$file"
done

# Finally pull all the changes
# (you could merge as well e.g. 'merge origin/master')
git pull
  • Pierwsze polecenie pobiera najnowsze dane.

  • Drugie polecenie sprawdza, czy do repozytorium są dodawane jakieś pliki i usuwa te nieśledzone pliki z lokalnego repozytorium, które mogłyby powodować konflikty.

  • Trzecie polecenie sprawdza wszystkie pliki, które zostały lokalnie zmodyfikowane.

  • Na koniec wykonujemy aktualizację do najnowszej wersji, ale tym razem bez żadnych konfliktów, ponieważ nieśledzone pliki znajdujące się w repozytorium już nie istnieją, a wszystkie lokalnie zmodyfikowane pliki są już takie same jak w repozytorium.

person Strahinja Kustudic    schedule 05.11.2012
comment
Użycie git merge Origin/master jako ostatniej linii (tak jak mówisz w swojej notatce) zamiast git pull będzie szybsze, ponieważ pobrałeś już wszelkie zmiany z repozytorium git. - person Josh; 06.05.2013
comment
Tak, oczywiście, git merge origin/master będzie szybszy i prawdopodobnie nawet bezpieczniejszy. Ponieważ gdyby ktoś wcisnął nowe zmiany podczas usuwania plików tego skryptu (co jest mało prawdopodobne, ale możliwe), całe ściąganie mogłoby się nie udać. Jedynym powodem, dla którego umieściłem tam pull, jest to, że ktoś może nie pracować nad gałęzią master, ale nad inną gałęzią, a ja chciałem, aby skrypt był uniwersalny. - person Strahinja Kustudic; 02.09.2013
comment
Jeśli utworzyłeś lokalnie pliki, takie jak pliki opcji, umieść je w .gitignore. - person Sebi; 21.11.2017

Na początek wypróbuj standardowy sposób:

git reset HEAD --hard # To remove all not committed changes!
git clean -fd         # To remove all untracked (non-git) files and folders!

Ostrzeżenie: powyższe polecenia mogą spowodować utratę danych/plików tylko wtedy, gdy ich nie zatwierdzisz! Jeśli nie masz pewności, wykonaj najpierw kopię zapasową całego folderu repozytorium.

Następnie pociągnij ponownie.

Jeśli powyższe nie pomoże i nie przejmujesz się nieśledzonymi plikami/katalogami (na wszelki wypadek najpierw wykonaj kopię zapasową), spróbuj wykonać następujące proste kroki:

cd your_git_repo  # where 'your_git_repo' is your git repository folder
rm -rfv *         # WARNING: only run inside your git repository!
git pull          # pull the sources again

Spowoduje to USUNIĘCIE wszystkich plików git (z wyjątkiem .git/ katalogu, w którym masz wszystkie zatwierdzenia) i pociągnięcie ich ponownie.


Dlaczego git reset HEAD --hard może w niektórych przypadkach zawieść?

  1. Niestandardowe reguły w .gitattributes file

    Posiadanie reguły eol=lf w .gitattributes może spowodować, że git zmodyfikuje niektóre zmiany w plikach poprzez konwersję końcówek linii CRLF na LF w niektórych plikach tekstowych.

    W takim przypadku musisz zatwierdzić te zmiany CRLF/LF (przeglądając je w git status) lub spróbować: git config core.autcrlf false, aby je tymczasowo zignorować.

  2. Niezgodność systemu plików

    Kiedy używasz systemu plików, który nie obsługuje atrybutów uprawnień. Na przykład masz dwa repozytoria, jedno w systemie Linux/Mac (ext3/hfs+), a drugie w systemie plików opartym na FAT32/NTFS.

    Jak zauważyłeś, istnieją dwa różne rodzaje systemów plików, więc ten, który nie obsługuje uprawnień Unixa, w zasadzie nie może zresetować uprawnień do plików w systemie, który nie obsługuje tego rodzaju uprawnień, więc niezależnie od tego, jak --hard spróbujesz, git zawsze wykrywa pewne „zmiany”.

person kenorb    schedule 26.10.2012

Miałem ten sam problem. Nikt nie dał mi tego rozwiązania, ale zadziałało dla mnie.

Rozwiązałem to poprzez:

  1. Usuń wszystkie pliki. Pozostaw tylko katalog .git.
  2. git reset --hard HEAD
  3. git pull
  4. git push

Teraz działa.

person John John Pichler    schedule 12.01.2011
comment
Tak samo tutaj. Czasami działa tylko bardzo trudne rozwiązanie, często zdarza się, że sam reset i czyszczenie jakoś nie wystarczą... - person jdehaan; 15.12.2011

Premia:

Mówiąc o ściąganiu/pobieraniu/scalaniu w poprzednich odpowiedziach, chciałbym podzielić się interesującą i produktywną sztuczką,

git pull --rebase

Powyższe polecenie jest najbardziej użytecznym poleceniem w moim życiu Git, które pozwoliło zaoszczędzić dużo czasu.

Zanim wypchniesz swoje nowe zatwierdzenie na serwer, wypróbuj to polecenie, a ono automatycznie zsynchronizuje najnowsze zmiany na serwerze (pobranie + połączenie) i umieści twoje zatwierdzenie na górze dziennika Git. Nie ma potrzeby martwić się o ręczne ściąganie/scalanie.

Więcej szczegółów znajdziesz w Co robi git pull --rebase?.

person Sazzad Hissain Khan    schedule 23.12.2015
comment
W skrócie: git pull -r. - person kenorb; 15.10.2019
comment
W moim przypadku, zanim to zrobiłem, musiałem 1) git add -A, 2) git commit -m 3) i na koniec git pull rebase. Dziękuję. - person Pathros; 03.02.2021

Miałem podobny problem. Musiałem to zrobić:

git reset --hard HEAD
git clean -f
git pull
person Ryan    schedule 14.01.2011
comment
używaj git clean ostrożnie - person nategood; 30.03.2012

Podsumowałem inne odpowiedzi. Możesz wykonać git pull bez błędów:

git fetch --all
git reset --hard origin/master
git reset --hard HEAD
git clean -f -d
git pull

Ostrzeżenie: ten skrypt ma bardzo duże możliwości, więc możesz utracić wprowadzone zmiany.

person Robert Moon    schedule 07.08.2015
comment
Spowoduje to zastąpienie zmodyfikowanych plików (plików, które zostały wcześniej zaewidencjonowane) i usunięcie nieśledzonych plików (plików, które nigdy nie zostały zaewidencjonowane). Dokładnie to, czego szukałem, dzięki! - person styfle; 03.03.2016
comment
Podejrzewam, że trzecia linia git reset --hard HEAD może być zbędna; moja lokalna strona podręcznika (2.6.3) mówi, że reset w drugiej linii git reset --hard origin/master domyślnie we wszystkich formularzach ma wartość HEAD. - person arichards; 19.04.2016
comment
@arichards Myślę, że twój podejrzany ma rację, ale jeśli druga linia nie zadziała (z jakiegokolwiek powodu), trzecia linia działa dobrze, aby zresetować. To rozwiązanie nie wymaga optymalizacji. Właśnie podsumowałem inne odpowiedzi. To wszystko. Dziękuję za Twój komentarz. :) - person Robert Moon; 20.04.2016
comment
Dziękuję za podsumowanie. Te kroki rzeczywiście mają moc :) - person Glorian; 10.12.2020

Bazując na moich własnych, podobnych doświadczeniach, powyższe rozwiązanie oferowane przez Strahinję Kustudic jest zdecydowanie najlepsze. Jak zauważyli inni, zwykłe wykonanie twardego resetu spowoduje usunięcie wszystkich nieśledzonych plików, które mogą zawierać wiele rzeczy, których nie chcesz usuwać, takich jak pliki konfiguracyjne. Bezpieczniejsze jest usunięcie tylko plików, które mają zostać dodane, a jeśli o to chodzi, prawdopodobnie warto także pobrać wszystkie pliki zmodyfikowane lokalnie, które mają zostać zaktualizowane.

Mając to na uwadze, zaktualizowałem skrypt Kustudica, aby właśnie to zrobić. Poprawiłem także literówkę (brakujące „w oryginale”).

#/bin/sh

# Fetch the newest code
git fetch

# Delete all files which are being added,
# so there are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    echo "Deleting untracked file $file..."
    rm -vf "$file"
done

# Checkout all files which have been locally modified
for file in `git diff HEAD..origin/master --name-status | awk '/^M/ {print $2}'`
do
    echo "Checking out modified file $file..."
    git checkout $file
done

# Finally merge all the changes (you could use merge here as well)
git pull
person Rolf Kaiser    schedule 27.02.2013
comment
Użycie git merge Origin/master jako ostatniej linii (tak jak mówisz w swojej notatce) zamiast git pull będzie szybsze, ponieważ pobrałeś już wszelkie zmiany z repozytorium git. - person Josh; 06.05.2013
comment
Konieczne jest sprawdzenie zmodyfikowanych plików, więc działa to w 100% przypadków. Zaktualizowałem swój skrypt dawno temu, ale zapomniałem zaktualizować również tutaj. Używam go też trochę inaczej niż Ty. Pobieram pliki, które mają dowolny typ modyfikacji, nie tylko M, więc działa to cały czas. - person Strahinja Kustudic; 02.09.2013

Uważam, że istnieją dwie możliwe przyczyny konfliktu, które należy rozwiązać osobno i o ile wiem, żadna z powyższych odpowiedzi nie dotyczy obu:

  • Lokalne pliki, które nie są śledzone, należy usunąć ręcznie (bezpieczniej) lub zgodnie z sugestią w innych odpowiedziach do git clean -f -d

  • Lokalne zatwierdzenia, które nie znajdują się w zdalnej gałęzi, również muszą zostać usunięte. IMO najłatwiej to osiągnąć za pomocą: git reset --hard origin/master (zamień „master” na dowolną gałąź, nad którą pracujesz, i najpierw uruchom git fetch origin)

person tiho    schedule 12.12.2011

Wygląda na to, że większość odpowiedzi koncentruje się na gałęzi master; jednak zdarza się, że pracuję nad tą samą gałęzią funkcji w dwóch różnych miejscach i chcę, aby zmiana bazy w jednym znalazła odzwierciedlenie w drugim, bez częstego przeskakiwania przez przeszkody.

Na podstawie kombinacji odpowiedzi RNA i odpowiedź Torka na podobne pytanie, wymyśliłem coś, co działa znakomicie:

git fetch
git reset --hard @{u}

Uruchom to z oddziału, a to zresetuje tylko twój lokalny oddział do wersji nadrzędnej.

Można to również ładnie umieścić w aliasie git (git forcepull):

git config alias.forcepull "!git fetch ; git reset --hard @{u}"

Lub w pliku .gitconfig:

[alias]
  forcepull = "!git fetch ; git reset --hard @{u}"

Cieszyć się!

person JacobEvelyn    schedule 25.02.2014
comment
Ta odpowiedź jest również fajna, ponieważ działa niezależnie od tego, w której gałęzi się znajdujesz! - person leafmeal; 11.09.2018

Miałem ten sam problem i z jakiegoś powodu nawet git clean -f -d by tego nie zrobił. Oto dlaczego: Z jakiegoś powodu, jeśli Twój plik jest ignorowany przez Gita (zakładam, że poprzez wpis .gitignore), nadal przeszkadza to w zastąpieniu go późniejszym ściągnięciem, ale czystym nie usunie go, chyba że dodasz -x.

person Tierlieb    schedule 03.08.2011

Łatwiejszym sposobem byłoby:

git checkout --theirs /path/to/file.extension
git pull origin master

Spowoduje to zastąpienie Twojego pliku lokalnego plikiem na git

person maximus 69    schedule 05.05.2015

Znam znacznie łatwiejszą i mniej bolesną metodę:

$ git branch -m [branch_to_force_pull] tmp
$ git fetch
$ git checkout [branch_to_force_pull]
$ git branch -D tmp

Otóż ​​to!

person ddmytrenko    schedule 05.09.2015
comment
Próbowałem zrobić zgodnie z sugestią w tej odpowiedzi. ŻADNE PLIKI nie zostały pobrane ze zdalnego repozytorium. Właściwie nie jest to zbyt zaskakujące, jeśli się nad tym zastanowić – w końcu nie ma tam żadnego odniesienia do origin/<branch_to_force_pull>. - person Henke; 10.12.2020

Właśnie rozwiązałem to sam:

git checkout -b tmp # "tmp" or pick a better name for your local changes branch
git add -A
git commit -m 'tmp'
git pull
git checkout master # Or whatever branch you were on originally
git pull
git diff tmp

gdzie ostatnie polecenie wyświetla listę zmian lokalnych. Kontynuuj modyfikowanie gałęzi „tmp”, aż będzie akceptowalna, a następnie wróć do mastera za pomocą:

git checkout master && git merge tmp

Następnym razem prawdopodobnie poradzisz sobie z tym w czystszy sposób, wyszukując „gałąź git stash”, chociaż skrytka prawdopodobnie sprawi ci problemy przy pierwszych kilku próbach, więc najpierw przeprowadź eksperyment na niekrytycznym projekcie…

person Simon B.    schedule 03.12.2010

Mam dziwną sytuację, w której ani git clean, ani git reset nie działają. Muszę usunąć powodujący konflikt plik z git index, używając następującego skryptu na każdym nieśledzonym pliku:

git rm [file]

Wtedy jestem w stanie dobrze ciągnąć.

person Chen Zhang    schedule 19.09.2011

Używać:

git fetch --all

Jeśli jesteś w gałęzi master,

git reset --hard origin/master

w przeciwnym razie

git reset --hard origin/master<branch_name>
person SUJITKUMAR SINGH    schedule 15.08.2019
comment
Ostatni fragment powinien mieć postać origin/<branch_name>, a nie origin/master<branch_name>. - person Adrian; 13.11.2020

Po prostu zrób

git fetch origin branchname
git checkout -f origin/branchname // This will overwrite ONLY new included files
git checkout branchname
git merge origin/branchname

Dzięki temu unikasz wszelkich niepożądanych skutków ubocznych, takich jak usuwanie plików lub katalogów, które chciałeś zachować itp.

person user2696128    schedule 19.10.2015
comment
Ładny. Najpierw używając checkout -f do gałęzi, z której chciałem się połączyć, pozbyłem się wszystkich problematycznych, nieśledzonych plików. Następnie mógłbym ponownie sprawdzić miejsce docelowe i ostatecznie połączyć się bez problemów. - person Patrick Parker; 02.10.2020

Pomimo pierwotnego pytania, najlepsze odpowiedzi mogą powodować problemy dla osób, które mają podobny problem, ale nie chcą stracić swoich plików lokalnych. Na przykład zobacz komentarze Al-Punk i crizCraiga.

Następująca wersja zatwierdza lokalne zmiany w gałęzi tymczasowej (tmp), sprawdza oryginalną gałąź (zakładam, że to master) i łączy aktualizacje. Można to zrobić za pomocą stash, ale odkryłem, że zwykle łatwiej jest po prostu zastosować podejście rozgałęziające/scalające.

git checkout -b tmp
git add *; git commit -am "my temporary files"
git checkout master

git fetch origin master
git merge -s recursive -X theirs origin master

gdzie zakładamy, że inne repozytorium to origin master.

person Snowcrash    schedule 22.10.2014

Zresetuj indeks i nagłówek do origin/master, ale nie resetuj drzewa roboczego:

git reset origin/master
person Community    schedule 15.02.2013
comment
Osobiście uważam, że jest to najbardziej przydatne. Następnie przechowuje Twoje drzewo robocze, abyś mógł je ponownie sprawdzić. W moim przypadku usunięto te same pliki, które zostały dodane, więc utknęło. Dziwne, wiem. - person King Friday; 05.01.2014

Te cztery polecenia działają dla mnie.

git reset --hard HEAD
git checkout origin/master
git branch -D master
git checkout -b master

Aby sprawdzić/wyciągnąć po wykonaniu tych poleceń

git pull origin master

Dużo próbowałem, ale w końcu udało mi się wykonać te polecenia.

person Vishesh Chandra    schedule 20.03.2014
comment
git gałąź -D master usuń gałąź. więc bądź z tym ostrożny. Wolę używać git checkout Origin/master -b ‹nowa nazwa oddziału›, który tworzy nową gałąź z nową nazwą, a ty potrzebujesz 3,4 linii. Zalecane jest również użycie git clean -f. - person Chand Priyankara; 05.04.2014

Wymagania:

  1. Śledź lokalne zmiany, aby nikt ich nigdy nie zgubił.
  2. Dopasuj lokalne repozytorium do zdalnego repozytorium pochodzenia.

Rozwiązanie:

  1. Ukryj zmiany lokalne.
  2. Pobierz z czystym plikami i katalogami, ignorując .gitignore i twardy reset do Origin.

    git stash --include-untracked
    git fetch --all
    git clean -fdx
    git reset --hard origin/master
    
person vezenkov    schedule 01.09.2015

Przeczytałem wszystkie odpowiedzi, ale szukałem jednego polecenia, aby to zrobić. Oto co zrobiłem. Dodano alias git do .gitconfig

[alias]
      fp = "!f(){ git fetch ${1} ${2} && git reset --hard ${1}/${2};};f"

Uruchom swoje polecenie jako

git fp origin master

równoważny

git fetch origin master
git reset --hard origin/master
person Venkat Kotra    schedule 08.07.2016

To zadziałało dla mnie bardzo dobrze!

git fetch --all
git reset --hard origin/master
person Shoaib Khalil    schedule 05.02.2021
comment
Czym różni się to od jednej lub więcej z poprzednich 58 odpowiedzi (nie jest to pytanie retoryczne)? Na przykład 红日初升 odpowiedź (wysłana tuż przed twoją) wydaje się być bardzo podobna. - person Peter Mortensen; 24.06.2021
comment
@PeterMortensen Cóż, moja odpowiedź polega po prostu na potwierdzeniu tego konkretnego rozwiązania, które zadziałało dla mnie bardzo dobrze, jak wspomniałem powyżej, a nie po prostu dodaniu kolejnej odpowiedzi - person Shoaib Khalil; 26.06.2021

Oto najlepsza praktyka przywracania zmian:

  • git commit Zatwierdź wprowadzone zmiany, aby zostały zapisane w reflogu (patrz poniżej)
  • git fetch Pobierz najnowsze zmiany z źródła
  • git reset --hard origin/master Twardy reset do głównej gałęzi Origin

reflog zapisuje gałęzie i inne odniesienia, które są aktualizowane w lokalnym repozytorium. Mówiąc prościej – reflog to historia Twoich zmian.

Dlatego zawsze warto się zaangażować. Zatwierdzenia są dołączane do reflogu, dzięki czemu zawsze będziesz mieć możliwość odzyskania usuniętego kodu.

person Jordan Georgiev    schedule 12.08.2016

Nie używaj git reset --hard. To usunie ich zmiany, które mogą być całkowicie niepożądane. Zamiast:

git pull
git reset origin/master
git checkout <file1> <file2> ...

Możesz oczywiście użyć git fetch zamiast git pull, ponieważ wyraźnie nie zamierza się połączyć, ale jeśli zwykle ciągniesz, sensowne jest kontynuowanie ciągnięcia tutaj.

Dzieje się tak dlatego, że git pull aktualizuje Twoje źródło/odniesienie główne; git reset aktualizuje numer referencyjny lokalnego oddziału tak, aby był taki sam jak Origin/master bez aktualizacji jakichkolwiek plików, więc stan wyewidencjonowania pozostaje niezmieniony; następnie git checkout przywraca pliki do stanu indeksu oddziału lokalnego, jeśli zajdzie taka potrzeba. W przypadkach, gdy dokładnie ten sam plik został dodany na serwerze głównym i na serwerze nadrzędnym, indeks jest już zgodny z plikiem po zresetowaniu, więc w typowym przypadku nie trzeba w ogóle wykonywać git checkout.

Jeśli gałąź nadrzędna zawiera również zatwierdzenia, które chcesz zastosować automatycznie, możesz zastosować subtelną odmianę tego procesu:

git pull
git merge <commit before problem commit>
git reset <problem commit>
git checkout <file1> <file2> ...
git pull
person Jim Driscoll    schedule 28.11.2017

Możesz spróbować:

$ git fetch --all
$ git reset --hard origin/master 
$ git pull
person 红日初升    schedule 17.01.2021

Użyłem tego polecenia, aby pozbyć się plików lokalnych uniemożliwiających mi wykonanie ściągania/scalania. Ale bądź ostrożny! Najpierw uruchom git merge …, aby sprawdzić, czy są tylko te pliki, które naprawdę chcesz usunąć.

git merge origin/master 2>&1 >/dev/null | grep ^[[:space:]] | sed s/^[[:space:]]//g | xargs -L1 rm
  • git merge wymienia między innymi wszystkie te pliki. Są one poprzedzone spacją.
  • 2>&1 >/dev/null przekierowuje wyjście błędu na standardowe, więc jest ono odbierane przez grep.
  • grep ^[[:space:]] filtruje tylko linie z nazwami plików.
  • sed s/^[[:space:]]//g przycina odstęp od początku.
  • xargs -L1 rm wywołuje rm na każdym z tych plików, usuwając je.

Zachowaj ostrożność: niezależnie od wyników git merge, rm zostanie wywołane dla każdej linii zaczynającej się od spacji.

person Glutexo    schedule 07.10.2015

Próbowałem użyć gałęzi Material2 na Angular2-Webpack-Starter i świetnie się bawiłem. Tylko w ten sposób mogłem pobrać tę gałąź i używać jej.

git clone --depth 1 https://github.com/angularclass/angular2-webpack-starter.git

cd angular2-webpack-starter/

git checkout -b material2

Otwórz folder projektu i usuń wszystkie nieukryte pliki i foldery. Zostaw wszystkie ukryte.

git add .

git commit -m "pokemon go"

git reset --hard

git pull origin material2

(Kiedy pojawi się edytor, naciśnij „:wq”, a następnie naciśnij Enter)

Teraz jesteś gotowy.

person Post Impatica    schedule 27.07.2016

Jeśli chcesz zresetować do gałęzi zdalnego śledzenia w sposób ogólny, użyj:

git fetch
git reset --keep origin/$(git rev-parse --abbrev-ref HEAD)

Jeśli chcesz także zresetować zmiany lokalne:

git fetch
git reset --hard origin/$(git rev-parse --abbrev-ref HEAD)
person warch    schedule 25.05.2018
comment
Jeśli często tego używasz, dodaj skrót bash alias gplf='git fetch && echo "HEAD was at $(git rev-parse --short HEAD)" && git reset --hard origin/$(git rev-parse --abbrev-ref HEAD)' - person Paul Odeon; 13.11.2019
comment
Genialny. Dzięki! Ludzie nie biorą pod uwagę automatycznych skryptów podczas odpowiadania. Jest to bardzo eleganckie, gdy po prostu nie można przekazać nazwy oddziału. - person Zeno Popovici; 24.09.2020

W systemie Windows wykonaj to pojedyncze polecenie:

git fetch --all & git reset --hard origin/master
person Luca C.    schedule 10.04.2018
comment
Dlaczego miałoby być inaczej niż np. na Linuksie? Której konkretnej implementacji/pakietu git używasz? I/lub jakie środowisko (np. MinGW)? - person Peter Mortensen; 27.04.2018
comment
Nie jestem pewien, jestem pewien, że to działa w systemie Windows. W systemie Linux jaki jest separator umożliwiający połączenie dwóch poleceń w jednym wierszu? (nie rura, po prostu połącz bez przechodzenia przez wyjście) - person Luca C.; 29.04.2018

Możesz zignorować ten plik z plikiem w folderze podstawowym projektu:

.gitignore

public/images/*

Następnie pociągnij zmiany, a następnie usuń tę linię z pliku gitignore.

person DanielG    schedule 09.11.2010

1: Reset do poprzedniego zatwierdzenia

git reset --hard HEAD

2: Usuń nieśledzone pliki

git clean -f

3: Wyciągnij zatwierdzenia

git pull

Źródła:

person abhijithvijayan    schedule 10.11.2018

Pomimo faktu, że na to pytanie istnieje już wiele odpowiedzi, pierwotnym pytaniem jest rozwiązanie tego pytania

błąd: Nieśledzony plik drzewa roboczego „public/images/icon.gif” zostałby nadpisany przez połączenie

Ponieważ plików binarnych nie można łączyć, prosta odpowiedź brzmi

git checkout public/images/icon.gif

Dzięki temu plik odzyska poprzedni stan, jaki miał w tej gałęzi.

Zwykle tak robię git stash, jeśli nie chcę stracić zmian, lub coś w rodzaju git checkout ., jeśli nie interesują mnie pliki modyfikowane lokalnie. IMO o wiele prostsze niż reset --hard, clean... i wszystkie te rzeczy lepiej nadają się do opuszczenia gałęzi jak w trybie zdalnym, w tym zatwierdzenia, nieśledzone pliki, a nie tylko rozwiązywanie lokalnie zmodyfikowanego pliku.

person guillem    schedule 24.07.2020

Gdy wykonasz git pull, otrzymasz listę plików, które nie pasują. Jeśli liczba plików nie jest zbyt duża, możesz je pobrać, ta akcja spowoduje nadpisanie tych plików.

git checkout -- ‹nazwa pliku›

Zwykle to robię, jeśli w celu szybkiego sprawdzenia modyfikuję pliki lokalne na serwerze (nie jest to zalecane i prawdopodobnie powód pojawienia się tego problemu :D), sprawdzam zmienione pliki po znalezieniu rozwiązania.

person Ashutosh Nigam    schedule 12.07.2020

Zrobiłem to, aby to zadziałało:

Na komputerze, na którym utworzyłem nowy oddział:

git push --all

Na komputerze, na którym chciałem, aby nowy oddział wyświetlał:

git fetch --all
person dadde    schedule 30.08.2019

Krok 1. (opcjonalnie)
W katalogu głównym lokalnego repozytorium zapisz kopię zapasową i opróżnij bieżący folder:

mkdir -p ../<branch>-bkp && mv --backup=t * ../<branch>-bkp

Krok 2. Pobierz wszystkie pliki i foldery oddziału ze zdalnego repozytorium:

git checkout <branch> && git add -A . && git reset --hard origin/<branch> && git pull

gdzie należy zastąpić <branch> nazwą gałęzi, którą chcesz zastąpić.

Komentarze:

  • Zamiast kroku 1 wolisz ręcznie wykonać kopię zapasową i usunąć bieżące pliki i foldery.
    polecam robiąc to za pomocą modułu obsługi plików w interfejsie GUI systemu operacyjnego.
  • Jeśli pominiesz krok 1, uważaj: utracisz całą pracę w lokalnym repozytorium!
  • Ważne: jeśli pominiesz git pull w kroku 2,
    ryzykujesz, że nie otrzymasz najnowszej wersji od zdalne repozytorium!
    Zgodnie z drugim odnośnikiem poniżej, git reset --hard
    zresetuje obszar przejściowy i katalog roboczy, aby dopasować je do najnowszego zatwierdzenia .
    Moje doświadczenie zaprzecza temu twierdzeniu!
  • Jeśli uruchomisz git reset --hard origin/<branch_to_overwrite> bez uprzedniego usunięcia wszystkich plików i folderów z lokalnego repozytorium, uważaj, ponieważ wszelkie niepotrzebne pliki, które wciąż się znajdują, mogą później przedostać się do zdalnego repozytorium git push, nawet jeśli nie było to Twoim zamiarem.
    Dodatkowe git add -A . w krok 2 zapobiega temu, jeśli zdecydujesz się pominąć krok 1.

Referencje:
https://gitforwindows.org/
https://www.atlassian.com/git/tutorials/undoing-changes/git-reset
https://www.atlassian.com/git/tutorials/rewriting-history/git-reflog

person Henke    schedule 10.12.2020

Ponieważ często potrzebuję szybkiego sposobu na zresetowanie bieżącej gałęzi w systemie Windows za pomocą wiersza poleceń, oto szybki sposób:

for /f "tokens=1* delims= " %a in ('git branch^|findstr /b "*"') do @git reset --hard origin/%b
person npocmaka    schedule 14.04.2020

Wypróbowałem większość tego, co mogłem tutaj znaleźć, żaden nie zadziałał w moim przypadku.

To, co zadziałało, to git merge -X theirs

person Sxilderik    schedule 01.12.2020

Możesz spróbować git pull --force lub może ukryć swoje zatwierdzenia, używając git stash, a następnie uruchamiając git pull.

person Ultan Kearns    schedule 22.08.2019
comment
To nie działa. fatal: refusing to merge unrelated histories - person Wyck; 23.08.2019
comment
Nie: error: The following untracked working tree files would be overwritten by merge: - nie interesują mnie te pliki. Gdyby były tylko dwa lub trzy, po prostu je usunąłem. Ale jest ich tak wielu. - person Martin; 20.08.2020
comment
To zadziałało dla mnie dobrze! Co się dzieje? - person EyesBear; 05.07.2021

Myślę, że możesz też wymusić git push -f / git push --force

person bombom    schedule 19.10.2020
comment
Pytanie dotyczy ciągnięcia, a nie pchania. - person Daemon Painter; 19.10.2020