Git Pull ignorując lokalne zmiany?


489

Czy istnieje sposób, aby zrobić, git pullktóry ignoruje jakiekolwiek lokalne zmiany plików bez zdmuchiwania katalogu i konieczności wykonywania git clone?


17
Przez „ignorowanie” masz na myśli „nadpisywanie”?
Cascabel,

@Cascabel Oznacza cofnięcie wszystkich lokalnych zmian, anulowanie wszystkich lokalnych zatwierdzeń, usunięcie wszystkich nowych lokalnych plików i katalogów, usunięcie wszystkich lokalnie usuniętych plików i katalogów itp. Krótko mówiąc, po prostu uruchom polecenie tak, jakby rm -rf local_repo && git clone remote_url.
Victor

Odpowiedzi:


820

Jeśli masz na myśli, że chcesz, aby ściąganie zastąpiło lokalne zmiany, wykonaj scalanie tak, jakby działające drzewo było czyste, cóż, wyczyść działające drzewo:

git reset --hard
git pull

Jeśli istnieją nieśledzone pliki lokalne, możesz użyć ich git cleando usunięcia. Służy git clean -fdo usuwania nieśledzonych plików, -dfdo usuwania nieśledzonych plików i katalogów oraz -xdfdo usuwania nieśledzonych lub ignorowanych plików lub katalogów.

Jeśli z drugiej strony chcesz w jakiś sposób zachować lokalne modyfikacje, możesz użyć skrytki, aby ukryć je przed wyciągnięciem, a następnie ponownie je zastosuj:

git stash
git pull
git stash pop

Nie wydaje mi się jednak, aby dosłownie ignorować zmiany - połowa ściągania to scalanie i musi scalić zatwierdzone wersje treści z wersjami, które pobrał.


4
Jeśli po tym, jak git resettwoje pliki nadal różnią się od zdalnego, przeczytaj stackoverflow.com/questions/1257592/...
Pułkownik Panika

3
Git to najdziwniejsza rzecz na świecie. Reset Git - gotowe. Następnie status git: Twój oddział wyprzedza o 2 zatwierdzenia.
Shailen

21
@shailenTJ „Zmiany lokalne” oznaczają tutaj niezatwierdzone zmiany, a nie lokalne zmiany. git reset --harddotyczy pierwszego, a nie drugiego. Jeśli chcesz w pełni zresetować się do stanu pilota, git reset --hard origin/<branch>- ale często iw tym przypadku te dwa zobowiązania, przed którymi jesteś, to praca, którą wykonałeś, a nie coś, co chcesz wyrzucić.
Cascabel,

2
To jest to samo, co niszczenie lokalnego repozytorium i ponowne pobieranie, prawda? Chcę tylko móc wymusić ściąganie i zastępowanie zmian dla wygody. W 99% przypadków pojawia się ten komunikat o błędzie, gdy przypadkowo coś pomieszałem lokalnie i chcę zacząć od nowa od repozytorium.
sudo

Co jeśli nie możesz nie mieć lokalnej zmiany w stosunku do głowy? Np. Repo zostało wykonane w systemie plików z rozróżnianiem wielkości liter i jest klonowane w systemie plików bez rozróżniania wielkości liter i istnieją 2 pliki o tej samej nazwie, różniące się wielkością liter?
xster

305

Dla mnie działało:

(1) Najpierw pobierz wszystkie zmiany:

$ git fetch --all

(2) Następnie zresetuj master:

$ git reset --hard origin/master

(3) Pull / update:

$ git pull

22
Sprawdziło się dla mnie świetnie, gdy miałem wiele problemów z najlepszą odpowiedzią. Dzięki!
0x0

6
działa to nawet wtedy, gdy
dokonałeś

16
To powinna być najlepsza odpowiedź :)
Purus

5
@Marco Servetto: Najpierw pobierasz wszystkie zmiany git, ale jeszcze ich nie stosujesz. Następnie resetujesz system główny do ostatniego stanu (zaktualizowany). Jeśli pominiesz pierwszy krok, przywrócisz zmiany do starego wzorca (lokalnego). Z mojego doświadczenia wynika, że ​​sposób, w jaki to opisałem, nigdy nie powoduje problemów. Wszystkie inne próby są wykonywane na końcu.
Artur Barseghyan

1
To działało dla mnie, chciałem zignorować wszystkie moje lokalne zmiany, w tym odzyskiwanie usuniętych plików
Neri

28

Chcesz tylko polecenia, które daje dokładnie taki sam wynik jak rm -rf local_repo && git clone remote_url, prawda? Chcę też tej funkcji. Zastanawiam się, dlaczego git nie udostępnia takiego polecenia (takiego jak git reclonelub git sync), ani svn nie zapewnia takiego polecenia (takiego jak svn recheckoutlub svn sync).

Spróbuj wykonać następujące polecenie:

git reset --hard origin/master
git clean -fxd
git pull

To naprawdę działa, nawet jeśli masz już lokalne zatwierdzenia, które chcesz usunąć.
Jurij Ghensev,

5
Ostrzeżenie chłopaki !! git clean -fxdusuwa .gitignorerównież pliki .
Ramesh Navi,

@RameshNavi Sure. Właśnie tego chce. Potrzebny jest szybszy sposób, aby go ponownie sklonować, tj. Usunąć całe lokalne repozytorium, a następnie sklonować.
Victor,

27

Poniższe polecenie nie zawsze będzie działać . Jeśli po prostu:

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard
HEAD is now at b05f611 Here the commit message bla, bla

$ git pull
Auto-merging thefile1.c
CONFLICT (content): Merge conflict in thefile1.c
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

i tak dalej...

Aby naprawdę zacząć od nowa, pobierając gałąź i zastępując wszystkie lokalne zmiany, po prostu wykonaj:


$ git checkout thebranch
$ git reset --hard origin/thebranch

To zadziała dobrze.

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard origin/thebranch
HEAD is now at 7639058 Here commit message again...

$ git status
# On branch thebranch
nothing to commit (working directory clean)

$ git checkout thebranch
Already on 'thebranch'

4
TAK. Tego właśnie potrzebowałem, aby uzyskać ostateczne podejście „nie dawaj F o tym, co lokalne”. Dzięki. :)
Adambean


8

Spójrz na git stash, aby umieścić wszystkie lokalne zmiany w „pliku ukrytym” i powrócić do ostatniego zatwierdzenia. W tym momencie możesz zastosować swoje ukryte zmiany lub je odrzucić.


8

Jeśli korzystasz z systemu Linux:

git fetch
for file in `git diff origin/master..HEAD --name-only`; do rm -f "$file"; done
git pull

Pętla for usunie wszystkie śledzone pliki, które zostały zmienione w lokalnym repozytorium, więc git pullbędzie działać bez żadnych problemów.
Najładniejszą rzeczą jest to, że tylko pliki śledzone zostaną zastąpione przez pliki w repozytorium, wszystkie pozostałe pliki pozostaną niezmienione.


Myślę, że miałeś na myśli „śledzone pliki”, których dokładnie potrzebuję, dzięki.
Ali

jakiś odpowiednik Powershell?
Earlee

8

najkrótszym sposobem na to jest:

git pull --rebase --autostash

nie wiedziałem --autostashwcześniej, dzięki!
shiro

7

to zadziałało dla mnie

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

z zaakceptowaną odpowiedzią dostaję błędy konfliktu


Jest to bardzo podobne do odpowiedzi Artura Barseghyana z 2015 roku ... ale nadal chciałbym wiedzieć, jaki jest cel trzeciego polecenia: pliki robocze zmieniły się po drugim poleceniu, a trzecie polecenie mówi: „Już aktualne "
Mike gryzoni

to jedyna kombinacja, która działała w moim środowisku, być może widzisz inną rzecz, dla mnie potrzebowałem trzech poleceń
Pablo Pazos

Ciekawy. Może to być wersja. Jestem na git 2.7.4. Ale właśnie widziałem nowy komentarz Artura Barseghyana: „W przeciwnym razie możesz znaleźć się w pracy nad przypadkowo nieaktualnym mistrzem”.
Mike gryzoni

może, ale jedyne, co mogę powiedzieć, to „to zadziałało dla mnie, gdy nie było innego rozwiązania”, więc może pomóc innym
Pablo Pazos


2

Spowoduje to pobranie bieżącej gałęzi i spróbuje wykonać szybkie przewijanie do przodu w celu opanowania:

git fetch && git merge --ff-only origin/master

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.