W moim oddziale miałem kilka plików .gitignore
W innym oddziale tych plików nie ma.
Chcę połączyć inną gałąź z moją i nie dbam o to, czy te pliki nie są już ignorowane, czy nie.
Niestety dostaję to:
Następujące nieśledzone pliki drzewa roboczego zostaną zastąpione przez scalenie
Jak zmodyfikowałbym polecenie ściągania, aby zastąpić te pliki bez konieczności samodzielnego znajdowania, przenoszenia lub usuwania tych plików?
Odpowiedzi:
Problem polega na tym, że nie śledzisz plików lokalnie, ale identyczne pliki są śledzone zdalnie, więc w celu „ściągnięcia” system byłby zmuszony zastąpić pliki lokalne, które nie są kontrolowane pod względem wersji.
Spróbuj uruchomić
Spowoduje to śledzenie wszystkich plików, usunięcie wszystkich lokalnych zmian w tych plikach, a następnie pobranie plików z serwera.
źródło
git add -A .; git stash
pracował dla mnie.git add *
Wariant narzekali ignorowane ścieżkach.Możesz spróbować wykonać polecenie, aby usunąć nieśledzone pliki z lokalnego pliku
Git 2.11 i nowsze wersje:
Starsze wersje Git:
Gdzie
-d
można zastąpić następującym:-x
ignorowane pliki są również usuwane, a także pliki nieznane Gitowi.-d
usuń nieśledzone katalogi oprócz nieśledzonych plików.-f
jest wymagane, aby wymusić uruchomienie.Oto link, który może być również pomocny.
źródło
-i
do trybu interaktywnego. Oprócz usunięcia niechcianego katalogu-x
może to zranić.Jedyne polecenia, które działały dla mnie, to:
źródło
Zastąpienie
git merge
tego spowoduje zastąpienie nieśledzonych plikówPoniższe komentarze używają „FOI” dla „interesujących plików”, czyli plików, które
Zastąpienie
git pull
tego spowoduje zastąpienie nieśledzonych plikówpull = fetch + merge
, Więc niegit fetch
następujegit checkout -f, git checkout, git merge
sztuczki powyżej.Szczegółowe wyjaśnienie
git merge -f
nie istnieje, ale istniejegit checkout -f
.Użyjemy
git checkout -f
+git checkout
do usunięcia interesujących plików (patrz wyżej), a następnie scalenie może przebiegać normalnie.Krok 1. Ten krok wymusza zastąpienie niewyśledzonego FOI śledzonymi wersjami gałęzi dawcy (sprawdza również gałąź dawcy i aktualizuje resztę działającego katalogu).
Krok 2. Ten krok usuwa FOI, ponieważ są one śledzone w naszym obecnym oddziale (dawcy) i nieobecne w
receiving-branch
przełączamy się do.Krok 3. Teraz, gdy FOI jest nieobecny, scalenie w gałęzi dawcy nie zastąpi żadnych nieśledzonych plików, więc nie otrzymujemy błędów.
źródło
Usuń wszystkie nieśledzone pliki:
źródło
Jeśli jest to operacja jednorazowa, możesz po prostu usunąć wszystkie nieśledzone pliki z katalogu roboczego przed wykonaniem ściągania. Przeczytaj Jak usunąć lokalne (nieśledzone) pliki z bieżącego drzewa roboczego Git?aby uzyskać informacje na temat usuwania wszystkich nieśledzonych plików.
Pamiętaj, aby przypadkowo nie usunąć nieśledzonego pliku, którego nadal potrzebujesz;)
źródło
Możesz wypróbować to polecenie
źródło
Aktualizacja - lepsza wersja
To narzędzie ( https://github.com/mklepaczewski/git-clean-before-merge ) będzie:
git pull
odpowiednikami,git pull
odpowiednikami,git pull
wersji,--pretend
opcję, która nie modyfikuje żadnych plików.Stara wersja
Czym różni się ta odpowiedź od innych odpowiedzi?
Przedstawiona tutaj metoda usuwa tylko pliki, które zostałyby zastąpione przez scalanie. Jeśli masz inne nieśledzone (prawdopodobnie zignorowane) pliki w katalogu, ta metoda ich nie usunie.
Rozwiązanie
Ten fragment wyodrębni wszystkie nieśledzone pliki, które zostaną nadpisane
git pull
i usunie je.a następnie po prostu wykonaj:
To nie jest polecenie git porcelany, więc zawsze dokładnie sprawdź, co by to zrobiło z:
Objaśnienie - ponieważ jeden liner jest przerażający:
Oto podział tego, co robi:
git pull 2>&1
- przechwytujgit pull
dane wyjściowe i przekieruj je na standardowe wyjście, abyśmy mogli łatwo je przechwycićgrep
.grep -E '^\s
- celem jest przechwycenie listy nieśledzonych plików, które zostałyby zastąpione przezgit pull
. Nazwy plików mają przed sobą kilka białych znaków, więc wykorzystujemy je do ich uzyskania.cut -f2-
- usuń białe znaki z początku każdej linii przechwyconej w 2.xargs -I {} rm -rf "{}"
- nasxargs
do iteracji po wszystkich plikach, zapisz ich nazwę w „{}” i zadzwońrm
do każdego z nich. Używamy-rf
do wymuszania usuwania i usuwania nieśledzonych katalogów.Byłoby wspaniale zastąpić kroki 1-3 poleceniem porcelany, ale nie znam żadnego odpowiednika.
źródło
git pull
zgit checkout <branch_name>
Jeśli zastanawiasz się nad użyciem
-f
flagi, możesz najpierw uruchomić ją na sucho. Wystarczy, że wiesz z góry, jaką ciekawą sytuację znajdziesz w następnej kolejności ;-Pźródło
Oprócz zaakceptowanej odpowiedzi możesz oczywiście usunąć pliki, jeśli nie są już potrzebne, określając plik:
Pamiętaj, aby najpierw uruchomić go z flagą -n, jeśli chcesz zobaczyć, które pliki usunie git clean. Pamiętaj, że te pliki zostaną usunięte. W moim przypadku i tak się nimi nie przejmowałem, więc było to dla mnie lepsze rozwiązanie.
źródło
Jednym ze sposobów na to jest ukrywanie lokalnych zmian i pobieranie ze zdalnego repozytorium. W ten sposób nie stracisz lokalnych plików, ponieważ pliki trafią do skrytki.
Możesz sprawdzić lokalne ukryte pliki za pomocą tego polecenia -
git stash list
źródło
Dla tych, którzy nie wiedzą, git ignoruje różnice nazw wielkich i małych liter w plikach i folderach. To okazuje się koszmarem, gdy zmienisz nazwę na dokładnie taką samą nazwę z innym przypadkiem.
Napotkałem ten problem, gdy zmieniłem nazwę folderu z „Petstore” na „petstore” (wielkie litery na małe litery). Zedytowałem plik .git / config, aby przestać ignorować wielkość liter, wprowadziłem zmiany, zmiażdżyłem swoje commity i ukryłem moje zmiany, aby przejść do innej gałęzi. Nie mogłem zastosować moich ukrytych zmian do tego drugiego oddziału.
Poprawką, którą znalazłem, która działała, była tymczasowa edycja mojego pliku .git / config, aby tymczasowo ponownie zignorować wielkość liter. To spowodowało
git stash apply
sukces. Następnie zmieniłem ignoreCase z powrotem nafalse
. Następnie dodałem wszystko oprócz nowych plików w folderze sklepu, które dziwnie twierdzi Git z jakiegokolwiek powodu. Popełniłem swoje zmiany, a następnie pobiegłemgit reset --hard HEAD
Zatwierdziłem aby pozbyć się nowych, nieśledzonych plików. Moje zatwierdzenie pojawiło się dokładnie tak, jak oczekiwano: nazwy plików w folderze zostały zmienione.Mam nadzieję, że pomoże ci to uniknąć mojego koszmaru.
źródło
git pull -f
potemgit checkout .
. Co za koszmar.Ani czyste / reset / twarde kasy / rebase nie działało dla mnie.
Właśnie usunąłem pliki, na które Git narzekał *
* Sprawdziłem, czy te pliki można usunąć, sprawdzając zupełnie nowe repozytorium w osobnym folderze (plików tam nie było)
źródło
W moim przypadku, gdy miałem ten problem. Miałem plik lokalny, którego nazwę zmieniłem na pilocie.
Podczas próby
git pull
Git powiedział mi, że nowa nazwa pliku nie była śledzona - która była na pilocie, chociaż nie istniała jeszcze na poziomie lokalnym.Ponieważ nie było tego lokalnie, nie mogłem tego zrobić,
git pull
dopóki nie zrobiłemgit rm
na starej nazwie pliku (co początkowo nie było oczywiste z powodu mojego głupiego pomysłu zmiany nazwy).źródło
Jeśli masz pliki zapisane w .gitignore, usuń je i ponownie uruchom git pull. To mi pomogło.
źródło
Problem polega na tym, że mamy nadchodzące zmiany, które scalą nieśledzony plik, narzeka git. Te polecenia pomogły mi:
źródło