Właśnie sklonowałem repozytorium git i sprawdziłem oddział. Pracowałem nad tym, a następnie postanowiłem usunąć wszystkie moje lokalne zmiany, ponieważ chciałem oryginalnej kopii.
Krótko mówiąc, musiałem wykonać następujące dwa polecenia, aby usunąć moje lokalne zmiany
git checkout .
git clean -f
Moje pytanie brzmi,
(1) Czy jest to właściwe podejście do pozbycia się lokalnych zmian, czy proszę dać mi znać właściwe podejście.
(2) kiedy używamy, git reset --hard
ponieważ jestem w stanie zresetować nawet bez tego polecenia
Dzięki
* Rozwiązanie: Najważniejsze zmiany: 26/26: * Zastąpiono wiele niejasnych terminów terminologią specyficzną dla git [śledzone / nieśledzone / przemieszczane / niestopowane]
Gdy wprowadzamy zmiany lokalne, mogą istnieć tylko trzy kategorie plików:
Wpisz 1. Przeniesione śledzone pliki
Wpisz 2. Nieustalone pliki śledzenia
Typ 3. Niestabilizowane nieprześledzone pliki, zwane także nieprześledzonymi plikami
- Staged - Te, które zostaną przeniesione do obszaru staging / Dodano do indeksu
- Śledzone - zmodyfikowane pliki
- UnTracked - nowe pliki. Zawsze bez sceny. Jeśli ustawione, oznacza to, że są śledzone.
Co robią poszczególne polecenia:
git checkout .
- Usuwa TYLKO niestabilizowane pliki śledzone [Typ 2]git clean -f
- Usuwa TYLKO niestabilizowane nieśledzone pliki [Typ 3]git reset --hard
- Usuwa TYLKO etapowe pliki śledzone i pliki niestacjonarne [typ 1, typ 2]git stash -u
- Usuwa wszystkie zmiany [Typ 1, Typ 2, Typ 3]
Wniosek:
Oczywiste jest, że możemy użyć obu
(1) combination of `git clean -f` and `git reset --hard`
LUB
(2) `git stash -u`
aby osiągnąć pożądany rezultat.
Uwaga: Składowanie, ponieważ słowo to oznacza „Przechowuj (coś) bezpiecznie i potajemnie w określonym miejscu”. Zawsze można to odzyskać za pomocą git stash pop
. Zatem wybór pomiędzy powyższymi dwiema opcjami jest wywołaniem programisty.
Dziękuję Christoph i Frederik Schøning.
Edycja: 03/27
Pomyślałem, że warto umieścić notatkę „ strzeż się ”git clean -f
git clean -f
Nie ma powrotu. Użyj -n
lub, --dry-run
aby wyświetlić podgląd zadanych obrażeń.
Jeśli chcesz również usunąć katalogi, uruchom git clean -f -d
Jeśli chcesz po prostu usunąć zignorowane pliki, uruchom git clean -f -X
Jeśli chcesz usunąć zarówno pliki ignorowane, jak i niezignorowane, uruchom git clean -f -x
odniesienie: więcej na git clean
: Jak usunąć lokalne (nieśledzone) pliki z bieżącego drzewa roboczego Git?
Edycja: 05/20/15
Odrzucanie wszystkich lokalnych zatwierdzeń w tym oddziale [Usuwanie lokalnych zatwierdzeń]
Aby odrzucić wszystkie zatwierdzenia lokalne w tej gałęzi, aby lokalna gałąź była identyczna z „nadrzędną” tej gałęzi, po prostu uruchom git reset --hard @{u}
Odniesienie: http://sethrobertson.github.io/GitFixUm/fixup.html
lub zrobić git reset --hard origin/master
[jeśli oddział lokalny jest master
]
Uwaga: 06.12.2015 To nie jest duplikat drugiego pytania SO oznaczonego jako duplikat. To pytanie dotyczy sposobu usuwania lokalnych zmian GIT [usuń dodany plik, usuń zmiany dodane do istniejącego pliku itp. Oraz różne podejścia; Gdzie w drugim wątku SO podaj tylko sposób usunięcia zatwierdzenia lokalnego. Jeśli dodałeś plik i chcesz go usunąć sam, drugi wątek SO nie dyskutuje o nim. Dlatego nie jest to duplikat drugiego]
Edycja: 23.6.2015
Jak przywrócić zatwierdzenie już przekazane do zdalnego repozytorium?
$ git revert ab12cd15
Edytuj: 09.01.2015
Usuń poprzednie zatwierdzenie z oddziału lokalnego i oddziału zdalnego
Przypadek: Właśnie dokonałeś zmiany w lokalnym oddziale i natychmiast przeszedłeś do oddziału zdalnego, Nagle zdałem sobie sprawę, O nie! Nie potrzebuję tej zmiany. Co teraz zrobić?
git reset --hard HEAD~1
[do usunięcia tego zatwierdzenia z lokalnego oddziału]
git push origin HEAD --force
[oba polecenia muszą zostać wykonane. Do usunięcia ze zdalnego oddziału]
Jaka jest gałąź? Jest to obecnie sprawdzony oddział.
Edytuj 09/08/2015 - Usuń lokalne scalanie git :
Jestem w master
oddziale i połączyłem master
oddział z nowo działającym oddziałemphase2
$ git status
# On branch master
$ git merge phase2
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 8 commits.
P: Jak pozbyć się tego scalenia? Próbowałem git reset --hard
i git clean -d -f
oba nie działały.
Jedyne, co zadziałało, to jedno z poniższych:
$ git reset --hard origin/master
lub
$ git reset --hard HEAD~8
lub
$ git reset --hard 9a88396f51e2a068bb7
[sha commit code - ten, który był obecny, zanim nastąpiły wszystkie twoje zatwierdzenia scalania]
git stash -a
[lub --all] ukryje również zignorowane i nieśledzone pliki.git clean -x
wyczyści również zignorowane pliki.git clean -X
wyczyści tylko zignorowane pliki.Odpowiedzi:
Wszystko zależy dokładnie od tego, co próbujesz cofnąć / przywrócić. Zacznij od przeczytania posta w linku Ube . Ale aby spróbować odpowiedzieć:
Twardy reset
całkowicie usuń wszystkie zmiany etapowe i niestacjonarne w śledzonych plikach.
Często używam twardego resetowania, kiedy mówię „po prostu cofnij wszystko, tak jakbym wykonał całkowite ponowne klonowanie z pilota”. W twoim przypadku, gdy chcesz po prostu nieskazitelnego repo, to by zadziałało.
Czysty
Usuń pliki, które nie są śledzone.
Do usuwania plików tymczasowych, ale zachowuj zmiany etapowe i niestacjonarne w już śledzonych plikach. W większości przypadków prawdopodobnie zamiast tego robiłbym regułę ignorowania zamiast wielokrotnie czyścić - np. Dla folderów bin / obj w projekcie C #, który zwykle chciałbyś wykluczyć z repozytorium, aby zaoszczędzić miejsce lub coś w tym rodzaju.
Opcja -f (force) spowoduje również usunięcie plików, które nie są śledzone i są również ignorowane przez git przez ignore-rule. W powyższym przypadku, z regułą ignorowania, aby nigdy nie śledzić folderów bin / obj, nawet jeśli te foldery są ignorowane przez git, użycie opcji force spowoduje usunięcie ich z systemu plików. Sporadycznie widziałem takie zastosowanie, np. Podczas wdrażania skryptów, a chcesz wyczyścić kod przed wdrożeniem, skompresowaniem lub czymkolwiek innym.
Git clean nie dotyka plików, które są już śledzone.
Kasa „kropka”
Właściwie nigdy nie widziałem tego zapisu przed przeczytaniem twojego postu. Trudno mi znaleźć dokumentację na ten temat (może ktoś może pomóc), ale po zabawie wygląda na to, że:
„cofnij wszystkie zmiany w moim drzewku roboczym”.
Czyli cofam nieustawione zmiany w śledzonych plikach. Najwyraźniej nie dotyka on etapowych zmian i pozostawia nieśledzone pliki w spokoju.
Schowanie
Niektóre odpowiedzi wspominają o chowaniu. Jak sugeruje to sformułowanie, prawdopodobnie użyłbyś ukrywania, gdy jesteś w środku czegoś (nie jesteś gotowy na zatwierdzenie), i musisz tymczasowo zmienić gałęzie lub w jakiś sposób pracować nad innym stanem kodu, później, aby powrócić do swojego „bałaganu” biurko". Nie widzę, żeby to dotyczyło twojego pytania, ale jest zdecydowanie przydatne.
Podsumowując
Ogólnie rzecz biorąc, jeśli masz pewność, że dokonałeś (aś) zmiany, a może zepchnąłeś (-aś) się na odległe, ważne zmiany, jeśli po prostu bawisz się lub coś w tym stylu, użycie przycisku „
git reset --hard HEAD
następnie”git clean -f
definitywnie wyczyści kod do stanu, w którym byłby, gdyby został sklonowany i wymeldowałem się z oddziału. Naprawdę ważne jest podkreślenie, że resetowanie usunie również zmiany etapowe, ale niezaangażowane. Wyczyści wszystko, co nie zostało popełnione (z wyjątkiem nieśledzonych plików, w takim przypadku użyj czystego ).Wszystkie pozostałe polecenia mają na celu ułatwienie bardziej skomplikowanych scenariuszy, w których potrzebna jest szczegółowość „cofania rzeczy” :)
Wydaje mi się, że twoje pytanie nr 1 zostało ujęte, ale na koniec, podsumowując pytanie nr 2: powodem, dla którego nigdy nie znalazłeś potrzeby użycia,
git reset --hard
było to, że nigdy niczego nie wystawiłeś. Gdybyś dokonał zmiany, anigit checkout .
niegit clean -f
cofnąłby tego.Mam nadzieję, że to obejmuje.
źródło
git reset --hard
. Wypróbowałem to i tak .. te pliki dodane do indeksu (przemieszczanie) zostały usunięte dopiero późniejgit reset --hard
i domyślniegit reset --hard
jest togit reset --hard head
. Ten link był także pomocny gitready.com/beginner/2009/01/18/the-staging-area.htmlgit stash -u
ma to sens.git stash -u
robi i jak to pop, ale Frederik dał mi znać, resetuj mocno i używając kombinacjigit reset --hard
igit clean -f
, a dlaczego nie,stash
jest preferowany w niektórych scenariuszach. Teraz pomóż mi w wyborze, który powinienem oznaczyć jako odpowiedź :), obie są moimi odpowiedziami..
to ścieżka określająca bieżący katalog roboczy, który może być katalogiem głównym repozytorium. Z git-scm.com:git checkout [<tree-ish>] [--] <pathspec>…
aktualizuje nazwane ścieżki w drzewie roboczym z pliku indeksu lub z nazwanego <tree-ish>.git reset --hard
agit clean -dfx
i tym podobne są destrukcyjne . W każdym razie, popraw małąhead
odpowiedź w odpowiedzi, powinna być albo wielka,HEAD
albo w ogóle nieobecna.Powód dodania odpowiedzi w tym momencie:
Do tej pory dodawałem wnioski i „odpowiedzi” do samego pytania początkowego, czyniąc je bardzo długim, dlatego przechodziłem do osobnej odpowiedzi.
Dodałem również częściej używane polecenia git, które pomagają mi w git, aby pomóc komuś również.
Zasadniczo do czyszczenia wszystkich lokalnych zatwierdzeń
$ git reset --hard
i$ git clean -d -f
Pierwszym krokiem przed dokonaniem jakichkolwiek zatwierdzeń jest skonfigurowanie nazwy użytkownika i adresu e-mail wyświetlanego wraz z zatwierdzeniem.
# Ustawia nazwę, którą chcesz dołączyć do swoich transakcji zatwierdzania
# Ustawia wiadomość e-mail, którą chcesz dołączyć do swoich transakcji zatwierdzania
# Lista globalnej konfiguracji
#Listuj zdalny adres URL
#Sprawdź status
# Lista wszystkich lokalnych i zdalnych oddziałów
# Utwórz nowy oddział lokalny i rozpocznij pracę nad tym oddziałem
lub można to zrobić jako proces dwuetapowy
utwórz oddział:
git branch branchname
pracuj nad tym oddziałem:git checkout branchname
#commit zmiany lokalne [proces dwuetapowy: - Dodaj plik do indeksu, co oznacza dodanie do obszaru pomostowego. Następnie zatwierdz pliki, które są obecne w tym obszarze testowym]
#checkout jakiś inny lokalny oddział
#remove wszystkie zmiany w oddziale lokalnym [Załóżmy, że dokonałeś pewnych zmian w oddziale lokalnym, takich jak dodanie nowego pliku lub modyfikacja istniejącego pliku lub dokonanie lokalnego zatwierdzenia, ale nie jest to już potrzebne]
git clean -d -f
igit reset --hard
[wyczyść wszystkie lokalne zmiany wprowadzone w oddziale lokalnym, z wyjątkiem zatwierdzenie lokalne]git stash -u
usuwa również wszystkie zmianyUwaga: Oczywiste jest, że możemy użyć albo (1) kombinacji
git clean –d –f
igit reset --hard
LUB (2),git stash -u
aby osiągnąć pożądany rezultat.Uwaga 1: Składowanie, ponieważ słowo to oznacza „Przechowuj (coś) bezpiecznie i potajemnie w określonym miejscu”. Zawsze można to odzyskać za pomocą git stash pop. Zatem wybór pomiędzy powyższymi dwiema opcjami jest wywołaniem programisty.
Uwaga 2:
git reset --hard
usunie zmiany katalogu roboczego. Przed uruchomieniem tego polecenia pamiętaj o ukryciu wszelkich zmian lokalnych, które chcesz zachować.# Przejdź do głównej gałęzi i upewnij się, że jesteś na bieżąco.
git fetch
[może to być konieczne (w zależności od konfiguracji git), aby otrzymywać aktualizacje na temat źródła / wzorca]# Scal gałąź gałęzi z gałęzią główną.
# Zresetuj gałąź główną do stanu początkowego.
# Przypadkowo usunąłem plik z lokalnego, jak go odzyskać? Wykonaj a,
git status
aby uzyskać pełną ścieżkę do pliku usuniętego zasobuOtóż to!
# Połącz gałąź master z inną gałąź
# nazwa lokalnego oddziału
# usuń oddział lokalny
# usuń zdalny oddział
lub
#revert zatwierdzenie już przekazane do zdalnego repozytorium
# odgałęzienie z poprzedniego zatwierdzenia za pomocą GIT
#Zmień komunikat zatwierdzenia ostatniego zatwierdzenia, które zostało już przekazane do zdalnego
# Odrzucanie wszystkich lokalnych zatwierdzeń w tym oddziale [Usuwanie lokalnych zatwierdzeń]
Aby odrzucić wszystkie zatwierdzenia lokalne w tej gałęzi, aby lokalna gałąź była identyczna z „nadrzędną” tej gałęzi, po prostu uruchom
Odniesienie: http://sethrobertson.github.io/GitFixUm/fixup.html lub wykonaj
git reset --hard origin/master
[jeśli oddział lokalny jest głównym]# Cofnąć zatwierdzenie już przesłane do zdalnego repozytorium?
# Usuń poprzednie zatwierdzenie z oddziału lokalnego i oddziału zdalnego
Przypadek użycia: Właśnie zatwierdziłeś zmianę w lokalnym oddziale i natychmiast przeszedłeś do zdalnego oddziału, Nagle zdałem sobie sprawę, O nie! Nie potrzebuję tej zmiany. Co teraz zrobić?
git reset --hard HEAD~1
[do usunięcia tego zatwierdzenia z lokalnego oddziału. 1 oznacza JEDEN zatwierdzony przez Ciebie]git push origin HEAD --force
[oba polecenia muszą zostać wykonane. Do usuwania ze zdalnego oddziału]. Aktualnie wyewidencjonowany oddział będzie nazywany oddziałem, w którym wykonujesz tę operację.# Usuń niektóre ostatnie zatwierdzenia z lokalnego i zdalnego repozytorium i zachowaj żądane zatwierdzenie. (rodzaj cofania zatwierdzeń z lokalnego i zdalnego)
Załóżmy, że masz 3 zatwierdzenia przekazane do zdalnej gałęzi o nazwie „
develop
”Aby powrócić do starego zatwierdzenia (aby zmienić stan oddziału)
git log --oneline --decorate --graph
// aby zobaczyć wszystkie swoje zatwierdzeniagit clean -d -f
// wyczyść wszelkie zmiany lokalnegit reset --hard commitid-1
// lokalne przywracanie do tego pliku zatwierdzeniagit push -u origin +develop
// przekaż ten stan do zdalnego. + zrobić siłę push# Usuń lokalne scalanie git: Przypadek: Jestem w gałęzi master i połączyłem gałąź master z nowo działającą gałęzią fazy 2
Na mistrzu oddziału
$ git merge phase2
$ git status
Na mistrzu oddziału
Twój oddział wyprzedza „origin / master” o 8 zatwierdzeń.
P: Jak pozbyć się lokalnego połączenia git? Próbowałem
git reset --hard
igit clean -d -f
oba nie działały. Jedyne, co zadziałało, to jedno z poniższych:$ git reset - hard origin / master
lub
$ git reset - hard HEAD ~ 8
lub
$ git reset --hard 9a88396f51e2a068bb7
[sha commit code - ten, który był obecny, zanim nastąpiły wszystkie twoje zatwierdzenia scalania]# Utwórz plik gitignore
touch .gitignore
// utwórz plik w systemie Mac lub Unixprzykładowa zawartość .gitignore:
Odnośnik do ściągawki GIT: https://services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf
źródło
git push origin :branch-name
jednak polecam używaniegit push origin --delete branchname
Podobnie jak w przypadku wszystkiego w git, istnieje wiele sposobów na zrobienie tego. Dwa użyte polecenia są jednym ze sposobów. Inną rzeczą, którą mogłeś zrobić, to po prostu schować je
git stash -u
.-u
Daje pewność, że nowo dodane pliki (Nieśledzone) są również zawarte.Przydaje się
git stash -u
togit stash pop
(to tak jak usunięcie wiadomości e-mail w Gmailu, gdzie możesz po prostu cofnąć, jeśli później zmienisz zdanie)Od drugiego pytania
git reset --hard
nie usuniesz nieśledzonych plików, więc nadal będziesz potrzebowaćgit clean -f
. Alegit stash -u
może być najwygodniejszy.źródło
git reset --hard
nie usunie nieśledzone pliki rzeczywiście, ale to będzie usunąć nieśledzone zmian, czyli zmiany w plikach, które są już w indeksie. Jestem pewien, że o to ci chodziło :)git stash -u
, zobaczyłem tę odpowiedź od git bash. "Zapisany katalog roboczy i indeks stanu WIP na {nazwa gałęzi}. Może to być ten zapisany, który moglibyśmy odzyskaćgit stash pop
.git stash -u
robi i jak to pop, ale Frederik dał mi znać, resetuj mocno i używając kombinacjigit reset --hard
igit clean -f
, a dlaczego nie,stash
jest preferowany w niektórych scenariuszach. Teraz pomóż mi w wyborze, który powinienem oznaczyć jako odpowiedź :), obie są moimi odpowiedziami.1. Gdy nie chcesz w ogóle zachowywać lokalnych zmian.
To polecenie całkowicie usunie wszystkie lokalne zmiany z lokalnego repozytorium. Jest to najlepszy sposób na uniknięcie konfliktów podczas polecenia ściągania, tylko jeśli nie chcesz w ogóle zachowywać lokalnych zmian.
2. Kiedy chcesz zachować lokalne zmiany
Jeśli chcesz wyciągnąć nowe zmiany ze zdalnego i zignorować zmiany lokalne podczas tego ściągania,
Przechowa wszystkie lokalne zmiany, teraz możesz pobrać zmiany zdalne,
Teraz możesz przywrócić lokalne zmiany,
źródło
git reset --hard
nie usuwa wszystkich lokalnych zmian. Usuwa tylko modyfikacje. Jeśli chcesz usunąć dodaje, musisz takżegit clean -fd
Posługiwać się:
Aby odrzucić zmiany w katalogu roboczym.
źródło
Myślę, że git ma jedną rzecz, która nie jest wyraźnie udokumentowana. Myślę, że to zostało faktycznie zaniedbane.
git checkout .
Człowieku, uratowałeś mi dzień. Zawsze mam rzeczy, które chcę wypróbować przy użyciu zmodyfikowanego kodu. Ale czasem rzeczy psują zmodyfikowany kod, dodają nowe nieśledzone pliki itp. Więc chcę to zrobić, zrobić to, czego chcę, zrobić bałagan, a następnie szybko wyczyścić i zatwierdzić, jeśli jestem szczęśliwy.
Nie
git clean -fd
działa dobrze dla plików nieśledzonej.Potem
git reset
po prostu usuwa inscenizację, alegit checkout
jest trochę kłopotliwa. Określanie pliku jeden po drugim lub używanie katalogów nie zawsze jest idealne. Czasami zmienione pliki, których chcę się pozbyć, znajdują się w katalogach, które chcę zachować. Marzyłem o tym jednym poleceniu, które po prostu usuwa nieustawione zmiany i proszę bardzo. Dzięki.Ale myślę, że powinni po prostu mieć
git checkout
bez żadnych opcji, usunąć wszystkie nieustawione zmiany i nie dotykać inscenizacji. Jest trochę modułowy i intuicyjny. Bardziej jak to, cogit reset
robi.git clean
powinien również zrobić to samo.źródło
Najlepszym sposobem jest sprawdzenie zmian.
Zmieniając plik pom.xml w projekcie o nazwie nazwa-projektu, możesz to zrobić:
źródło
Aby odrzucić wszystko, co lubię składować i upuszczać, to jest najszybszy sposób na odrzucenie wszystkich, szczególnie jeśli pracujesz między wieloma repozytoriami.
Spowoduje to ukrycie wszystkich zmian
{0}
klucza i natychmiastowe usunięcie{0}
git stash && git stash drop
źródło
Przede wszystkim sprawdź, czy twoja ważna zmiana została zapisana czy nie przez:
niż spróbować
ale jeśli potrzebujesz cofnąć:
Czytaj więcej >> https://git-scm.com/docs/git-reset
źródło