Jak wymusić zastąpienie plików lokalnych w pliku git pull
?
Scenariusz jest następujący:
- Członek zespołu modyfikuje szablony witryny, nad którą pracujemy
- Dodają kilka obrazów do katalogu obrazów (ale zapomina dodać je pod kontrolą źródła)
- Później wysyłają mi zdjęcia pocztą
- Dodaję obrazy pod kontrolą źródła i wypycham je do GitHub wraz z innymi zmianami
- Nie mogą pobierać aktualizacji z GitHub, ponieważ Git nie chce zastępować swoich plików.
To jest błąd, który otrzymuję:
błąd: nieśledzony plik drzewa roboczego „public / images / icon.gif” zostałby zastąpiony przez scalenie
Jak zmusić Gita do zastąpienia ich? Osoba jest projektantem - zwykle wszystkie konflikty rozwiązuję ręcznie, więc serwer ma najnowszą wersję, którą wystarczy zaktualizować na swoim komputerze.
git reset --hard origin/branch_to_overwrite
git branch <branch> -D
2. Zresetuj do zatwierdzenia przed konfliktem:git reset <commit> --hard
3. Ponownie utwórz gałąź:git branch <branch>
4. Ustaw śledzenie na serwerze:git --set-upstream-to=origin/<branch> <branch> 5. Pull:
git pull`git config core.autocrlf false; git ls-files -z | xargs -0 rm; git checkout .
Odpowiedzi:
Ważne: jeśli wprowadzisz jakieś zmiany lokalne, zostaną one utracone. Z
--hard
opcją lub bez , wszelkie lokalne zatwierdzenia, które nie zostały wypchnięte, 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.
Myślę, że to właściwy sposób:
Następnie masz dwie opcje:
LUB Jeśli jesteś w innym oddziale:
Wyjaśnienie:
git fetch
pobiera najnowsze z pilota, bez próby scalania lub zmiany bazy danych.Następnie
git reset
resetuje gałąź master do tego, co właśnie pobrałeś. Ta--hard
opcja zmienia wszystkie pliki w drzewie roboczym, aby pasowały do plików worigin/master
Utrzymuj bieżące lokalne zobowiązania
[*] : Warto zauważyć, że możliwe jest utrzymanie bieżących lokalnych zatwierdzeń poprzez utworzenie oddziału
master
przed zresetowaniem:Po tym wszystkie stare zmiany będą przechowywane
new-branch-to-save-current-commits
.Niezatwierdzone zmiany
Niezatwierdzone zmiany zostaną jednak utracone. Pamiętaj, aby schować i popełnić wszystko, czego potrzebujesz. W tym celu możesz uruchomić następujące czynności:
A następnie, aby ponownie zastosować te niezatwierdzone zmiany:
źródło
git reset --hard origin/branch-name
git pull -f
git reflog
, które wyświetla wszystkie zatwierdzenia, także te bez podstawy. Dopóki nie wyczyścisz swojej lokalnej kopii za pomocągit gc
, wtedy wszystko zostanie utraconeSpróbuj tego:
Powinien robić, co chcesz.
źródło
OSTRZEŻENIE:
git clean
usuwa wszystkie nieśledzone pliki / katalogi i nie można ich cofnąć.Czasami po prostu
clean -f
nie pomaga. W przypadku nieśledzonych DIRECTORIES -d również potrzebna jest opcja:OSTRZEŻENIE:
git clean
usuwa wszystkie nieśledzone pliki / katalogi i nie można ich cofnąć.Najpierw rozważ użycie flagi
-n
(--dry-run
). To pokaże, co zostanie usunięte bez faktycznego usuwania:Przykładowe dane wyjściowe:
źródło
.gitignore
git clean -dfx
. W-x
ignoruje .gitignore. Zazwyczaj produkty kompilacji będą w .gitignore.Podobnie jak Jeż, myślę, że odpowiedzi są okropne. Ale chociaż odpowiedź Jeża może być lepsza, nie sądzę, aby była tak elegancka, jak mogłaby być. Znalazłem to, używając „pobierania” i „scalania” ze zdefiniowaną strategią. Co powinno sprawić, że lokalne zmiany zostaną zachowane, o ile nie będą to jeden z plików, które próbujesz wymusić nadpisaniem.
Najpierw wykonaj zatwierdzenie swoich zmian
Następnie pobierz zmiany i zastąp je, jeśli wystąpi konflikt
„-X” to nazwa opcji, a „ich” to wartość tej opcji. Zdecydujesz się użyć „ich” zmian, zamiast „swoich” zmian w przypadku konfliktu.
źródło
get fetch other-repo
; 2)git merge -s recursive -X theirs other-repo/master
git merge -X theirs origin/master
Zamiast robić:
Radzę wykonać następujące czynności:
Nie musisz pobierać wszystkich pilotów i gałęzi, jeśli chcesz zresetować do źródła / gałęzi głównej, prawda?
źródło
git add .
wcześniejgit reset --hard
Wygląda na to, że najlepiej jest najpierw zrobić:
Aby usunąć wszystkie nieśledzone pliki, a następnie kontynuować zwykłe
git pull
...źródło
git fetch origin && git reset --hard origin/master
git clean
najlepsza odpowiedź tutaj? Wydaje się, że usuwanie plików niekoniecznie jest tym, czego chce OP. Poprosili o „nadpisanie lokalnych plików”, a nie usunięcie.Uwaga, zrobienie tego spowoduje trwałe usunięcie plików, jeśli masz jakieś wpisy katalogu / * w pliku gitignore.
Niektóre odpowiedzi wydają się okropne. Straszne w tym, co się stało z @Lauri, postępując zgodnie z sugestią Davida Avsajanishvili.
Raczej (git> v1.7.6):
Później możesz wyczyścić historię zapasów.
Ręcznie, jeden po drugim:
Brutalnie, od razu:
Oczywiście, jeśli chcesz wrócić do tego, co ukryłeś:
źródło
--include-untracked
po prostu tymczasowo -git add
całe swoje repozytorium, a następnie natychmiast je składując.git stash apply
przywrócił wszystkie moje nieśledzone pliki z wyjątkiem (słusznie) tych, które scalenie już utworzył: „już istnieje, nie ma kasy”. Działał idealnie.git stash -u
.To polecenie może pomóc w odrzuceniu lokalnych zmian:
A następnie wykonaj czyszczenie (usuwa nieśledzone pliki z działającego drzewa):
Jeśli chcesz usunąć nieśledzone katalogi oprócz nieśledzonych plików:
źródło
Zamiast łączyć się z
git pull
, spróbuj tego:git fetch --all
śledzony przez:
git reset --hard origin/master
.źródło
Jedyne, co działało dla mnie, to:
Spowoduje to powrót do pięciu zatwierdzeń, a następnie z
Zauważyłem, że patrząc na to, jak cofnąć scalenie Git .
źródło
work around
ale naprawdę skuteczna. Ponieważ niektóre konflikty mogą wystąpić tylko w kilku zatwierdzeniach, cofnięcie 5 zatwierdzeń sprawi, że nie wystąpią konflikty ze zdalnym kodem.Problem z tymi wszystkimi rozwiązaniami polega na tym, że wszystkie są albo zbyt skomplikowane, albo, jeszcze większy problem, 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 serwer, a nie repozytorium Git.
Oto najczystsze rozwiązanie, którego używamy:
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 zmodyfikowane lokalnie.
Wreszcie staramy się zaktualizować 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.
źródło
git merge origin/master
będzie szybszy i prawdopodobnie jeszcze bezpieczniejszy. Ponieważ jeśli ktoś pchnie nowe zmiany podczas usuwania plików tego skryptu (co prawdopodobnie nie nastąpi, ale możliwe), całe ściągnięcie może się nie powieść. Jedyny powód, dla któregopull
tam wprowadziłem, to fakt, że ktoś może nie pracować nad gałęzią master, ale z inną gałęzią i chciałem, aby skrypt był uniwersalny..gitignore
.Najpierw wypróbuj standardowy sposób:
Ostrzeżenie : powyższe polecenia mogą spowodować utratę danych / plików tylko wtedy, gdy ich nie zatwierdzisz! Jeśli nie masz pewności, wykonaj kopię zapasową na pierwszym miejscu w całym folderze repozytorium.
Następnie pociągnij ponownie.
Jeśli powyższe nie pomoże i nie obchodzi Cię nieśledzone pliki / katalogi (wykonaj kopię zapasową na wszelki wypadek), spróbuj wykonać następujące proste kroki:
Spowoduje to USUNIĘCIE wszystkich plików git (wyłącz katalog
.git/
, w którym masz wszystkie zatwierdzenia) i ściągniesz je ponownie.Dlaczego
git reset HEAD --hard
w niektórych przypadkach może się nie powieść?Niestandardowe reguły w
.gitattributes file
Mający
eol=lf
reguły w .gitattributes może spowodować, że git zmodyfikuje niektóre zmiany pliku, przekształcając zakończenia linii CRLF w LF w niektórych plikach tekstowych.W takim przypadku należy zatwierdzić zmiany CRLF / LF (przeglądając je
git status
) lub spróbować:git config core.autcrlf false
tymczasowo je zignorować.Niezgodność systemu plików
Gdy używasz systemu plików, który nie obsługuje atrybutów uprawnień. Na przykład masz dwa repozytoria, jedno w systemie plików 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ń uniksowych, zasadniczo nie może zresetować uprawnień do plików w systemie, który nie obsługuje tego rodzaju uprawnień, więc bez względu na to, jak
--hard
spróbujesz, git zawsze wykrywaj „zmiany”.źródło
Miałem ten sam problem. Nikt nie dał mi tego rozwiązania, ale zadziałało dla mnie.
Rozwiązałem to przez:
.git
katalog.git reset --hard HEAD
git pull
git push
Teraz działa.
źródło
Premia:
Mówiąc o pull / fetch / merge w poprzednich odpowiedziach, chciałbym podzielić się ciekawą i produktywną sztuczką,
git pull --rebase
To powyższe polecenie jest najbardziej użytecznym poleceniem w moim życiu Git, które pozwoliło zaoszczędzić dużo czasu.
Przed wypchnięciem nowego zatwierdzenia na serwer, wypróbuj to polecenie, a ono automatycznie zsynchronizuje najnowsze zmiany na serwerze (z funkcją pobierania + scalania) i umieści zatwierdzenie na górze w dzienniku Git. Nie musisz martwić się ręcznym ściąganiem / scalaniem.
Znajdź szczegóły w Czym zajmuje się „git pull --rebase”? .
źródło
git pull -r
.Miałem podobny problem. Musiałem to zrobić:
źródło
git clean
ostrożniePodsumowałem inne odpowiedzi. Możesz wykonać
git pull
bez błędów:Ostrzeżenie : ten skrypt jest bardzo wydajny, więc możesz stracić zmiany.
źródło
git reset --hard HEAD
może być zbędna; moja lokalna stronareset
podręcznika (2.6.3) mówi, że w drugim wierszugit reset --hard origin/master
„domyślnie HEAD we wszystkich formach”.W oparciu o moje własne podobne doświadczenia, rozwiązanie oferowane przez Strahinja Kustudic powyżej jest zdecydowanie najlepsze. Jak zauważyli inni, zwykły twardy reset usunie wszystko nieśledzone pliki, które mogą zawierać wiele rzeczy, których nie chcesz usuwać, takich jak pliki konfiguracyjne. Bezpieczniejsze jest usuwanie tylko plików, które mają zostać dodane, i w związku z tym prawdopodobnie będziesz również chciał pobrać wszystkie lokalnie zmodyfikowane pliki, które mają zostać zaktualizowane.
Mając to na uwadze, zaktualizowałem skrypt Kustudica, aby to zrobić. Naprawiłem także literówkę (brakujące w oryginale).
źródło
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:
Pliki lokalne, które nie są śledzone, muszą zostać usunięte ręcznie (bezpieczniej) lub zgodnie z sugestią w innych odpowiedziach autorstwa
git clean -f -d
Lokalne zatwierdzenia, które nie znajdują się w oddziale zdalnym, również muszą zostać usunięte. IMO najprostszym sposobem na osiągnięcie tego jest:
git reset --hard origin/master
(zamień „master” na jakąkolwiek gałąź, nad którą pracujesz, i uruchomgit fetch origin
pierwszą)źródło
Łatwiejszym sposobem byłoby:
Spowoduje to zastąpienie lokalnego pliku plikiem w git
źródło
Wygląda na to, że większość odpowiedzi tutaj dotyczy
master
gałęzi; są jednak chwile, kiedy pracuję nad tą samą gałęzią funkcji w dwóch różnych miejscach i chcę, aby podstawa w jednym była odzwierciedlona w drugim, bez dużej ilości skoków przez obręcze.Oparty na kombinacji odpowiedzi RNA i odpowiedzi torek do podobnych pytanie , mam wymyślić ten, który działa wspaniale:
Uruchom to z oddziału, a spowoduje to zresetowanie lokalnego oddziału do wersji nadrzędnej.
Można to również dobrze umieścić w git alias (
git forcepull
):git config alias.forcepull "!git fetch ; git reset --hard @{u}"
Lub w twoim
.gitconfig
pliku:Cieszyć się!
źródło
Miałem ten sam problem iz jakiegoś powodu nawet
git clean -f -d
tego nie zrobiłbym. Oto dlaczego: Z jakiegoś powodu, jeśli twój plik jest ignorowany przez Git (zakładam, że za pomocą wpisu .gitignore), nadal kłopota się nadpisaniem go późniejszym ściągnięciem , ale czysty nie usunie go, chyba że dodasz-x
.źródło
Znam dużo łatwiejszą i mniej bolesną metodę:
Otóż to!
źródło
Właśnie rozwiązałem to przez:
gdzie ostatnie polecenie podaje listę lokalnych zmian. Kontynuuj modyfikowanie gałęzi „tmp”, aż będzie to akceptowalne, a następnie ponownie połącz z master:
Następnym razem możesz prawdopodobnie poradzić sobie z tym w bardziej przejrzysty sposób, patrząc na „gałąź git stash”, chociaż skrytka może powodować problemy w pierwszych kilku próbach, więc najpierw eksperymentuj nad niekrytycznym projektem ...
źródło
Mam dziwną sytuację, że żadna
git clean
lubgit reset
robót. Muszę usunąć plik powodujący konflikt,git index
używając następującego skryptu na każdym nieśledzonym pliku:Jestem w stanie dobrze pociągnąć.
źródło
git fetch --all && git reset --hard origin/master && git pull
źródło
Pomimo pierwotnego pytania, najlepsze odpowiedzi mogą powodować problemy dla osób, które mają podobny problem, ale nie chcą stracić swoich lokalnych plików. Na przykład zobacz komentarze Al-Punk i crizCraig.
Następująca wersja zatwierdza lokalne zmiany w gałęzi tymczasowej (
tmp
), sprawdza oryginalną gałąź (którą zakładam, że jestmaster
) i łączy aktualizacje. Możesz to zrobić za pomocąstash
, ale stwierdziłem, że zwykle łatwiej jest po prostu użyć metody rozgałęzienia / scalenia.gdzie zakładamy, że drugie repozytorium znajduje się
origin master
.źródło
Te cztery polecenia działają dla mnie.
Aby sprawdzić / pociągnąć po wykonaniu tych poleceń
Próbowałem dużo, ale w końcu udało mi się uzyskać te polecenia.
źródło
Po prostu zrób
Dzięki temu unikniesz wszystkich niepożądanych efektów ubocznych, takich jak usuwanie plików lub katalogów, które chcesz zachować itp.
źródło
Zresetuj indeks i nagłówek do
origin/master
, ale nie resetuj działającego drzewa:źródło
Wymagania:
Rozwiązanie:
Fetch z czysty z plików i katalogów ignorując .gitignore i twardy reset do pochodzenia .
źródło