Czy istnieje sposób, aby zrobić, git pullktóry ignoruje jakiekolwiek lokalne zmiany plików bez zdmuchiwania katalogu i konieczności wykonywania git clone?
@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ł.
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?
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).
@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
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'
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ć.
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.
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
rm -rf local_repo && git clone remote_url
.Odpowiedzi:
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:
Jeśli istnieją nieśledzone pliki lokalne, możesz użyć ich
git clean
do usunięcia. Służygit clean -f
do usuwania nieśledzonych plików,-df
do usuwania nieśledzonych plików i katalogów oraz-xdf
do 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:
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ł.
źródło
git reset
twoje pliki nadal różnią się od zdalnego, przeczytaj stackoverflow.com/questions/1257592/...git reset --hard
dotyczy 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ć.Dla mnie działało:
(1) Najpierw pobierz wszystkie zmiany:
(2) Następnie zresetuj master:
(3) Pull / update:
źródło
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 jakgit reclone
lubgit sync
), ani svn nie zapewnia takiego polecenia (takiego jaksvn recheckout
lubsvn sync
).Spróbuj wykonać następujące polecenie:
źródło
git clean -fxd
usuwa.gitignore
również pliki .Poniższe polecenie nie zawsze będzie działać . Jeśli po prostu:
i tak dalej...
Aby naprawdę zacząć od nowa, pobierając gałąź i zastępując wszystkie lokalne zmiany, po prostu wykonaj:
To zadziała dobrze.
źródło
źródło
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ć.
źródło
Jeśli korzystasz z systemu Linux:
Pętla for usunie wszystkie śledzone pliki, które zostały zmienione w lokalnym repozytorium, więc
git pull
bę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.
źródło
najkrótszym sposobem na to jest:
źródło
--autostash
wcześniej, dzięki!to zadziałało dla mnie
z zaakceptowaną odpowiedzią dostaję błędy konfliktu
źródło
Zwyklę robię:
W folderze głównym projektu.
źródło
Spowoduje to pobranie bieżącej gałęzi i spróbuje wykonać szybkie przewijanie do przodu w celu opanowania:
źródło
.gitignore
„Dodawanie niechcianych plików do .gitignore działa, dopóki początkowo nie przypisałeś ich do żadnego oddziału.”
Możesz także uruchomić:
https://chamindac.blogspot.com/2017/07/ignoring-visual-studio-2017-created.html
źródło