Różne sposoby usuwania lokalnych zmian w Git

Właśnie sklonowałem repozytorium git i sprawdziłem gałąź. Pracowałem nad tym, a następnie postanowiłem usunąć wszystkie moje lokalne zmiany, ponieważ chciałem oryginalną kopię.

W skrócie, 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 poprawne podejście w pozbyciu się lokalnych zmian, czy proszę dać mi znać poprawne podejście.

(2) kiedy używamy {[7] } ponieważ jestem w stanie zresetować nawet bez tego polecenia

Dzięki

*rozwiązanie: Major Edit(s): 03/26 : * Zastąpiono wiele niejasnych terminów terminologią specyficzną dla Gita [tracked / untracked/staged / unstaged]

Mogą być tylko trzy kategorie plików, gdy dokonujemy lokalnych zmian:

Typ 1. Wyświetlane pliki śledzone

Typ 2. Pliki śledzone]}

Typ 3. Pliki nieaktywne (Unstaged UnTracked files vel UnTracked files)

  • - Te, które zostały przeniesione do miejsca postoju / dodane do indeksu
  • śledzone-zmodyfikowane pliki
  • UnTracked-nowe pliki. Zawsze nietknięty. Jeśli są ustawione, oznacza to, że są śledzone.

Co robią poszczególne komendy:

  1. git checkout . - usuwa tylko nieuszkodzone śledzone pliki [wpisz 2]

  2. git clean -f - usuwa tylko nieuszkodzone, nieuszkodzone pliki [Typ 3]

  3. git reset --hard - usuwa tylko śledzone i nieakcentowane pliki śledzone [Typ 1, Typ 2]

  4. git stash -u - usuwa wszystkie zmiany [Typ 1, Typ 2, Typ 3]

Wniosek:

Jest jasne, że możemy użyć albo

(1) combination of `git clean -f` and `git reset --hard` 

Lub

(2) `git stash -u`

Aby osiągnąć pożądany rezultat.

Uwaga: Przechowywanie, ponieważ słowo oznacza " przechowywać (coś) bezpiecznie i potajemnie w określonym miejscu.'Można to zawsze pobrać za pomocą git stash pop. Więc wybór pomiędzy powyższymi dwoma opcjami jest wywołaniem dewelopera.

Dziękuję Christoph i Frederik Schøning.

Edytuj: 03/27

Pomyślałem, że warto umieścić notkę "uważaj " do git clean -f

git clean -f

Nie ma odwrotu. Użyj -n lub --dry-run, aby wyświetlić podgląd uszkodzeń.

Jeśli chcesz również usunąć katalogi, Uruchom git clean -f -d

Jeśli chcesz tylko usunąć ignorowane pliki, uruchom git clean -f -X

Jeśli chcesz usunąć zarówno ignorowane, jak i nie ignorowane pliki, uruchom git clean -f -x

Reference: more on git clean : jak usunąć lokalne (nie śledzone) pliki z bieżącego drzewa pracy Gita?

Edytuj: 05/20/15

Usuwanie wszystkich lokalnych commitów z tej gałęzi [usuwanie lokalnych commitów]

W celu odrzucenia wszystkich lokalnych commitów na tej gałęzi, aby lokalna gałąź była identyczna do" upstream " tej gałęzi po prostu uruchom git reset --hard @{u}

Odniesienie: http://sethrobertson.github.io/GitFixUm/fixup.html

Lub do git reset --hard origin/master [jeśli lokalny oddział to master]

Uwaga: 06/12/2015 To jest a nie duplikat drugiego pytania, które jest oznaczone jako DUPLIKAT. To pytanie dotyczy Jak usunąć lokalne zmiany w GIT [Usuń dodany plik, Usuń zmiany dodane do istniejącego pliku itp. i różne podejścia; gdzie w drugim tak wątku tylko adres Jak usunąć lokalny commit. Jeśli dodałeś plik, a Ty chcesz to usunąć sam, to drugi tak wątek nie dyskutować o tym. To nie jest duplikat tego drugiego.]}

Edytuj: 06/23/15

Jak przywrócić commit już wypchnięty do zdalnego repozytorium?

$ git revert ab12cd15

Edytuj: 09/01/2015

Usuń poprzedni commit z lokalnej gałęzi i zdalnej gałęzi

Przypadek: właśnie wprowadziłeś zmianę do lokalnego oddziału i natychmiast pchnąłeś do zdalnego oddziału, Nagle zdałem sobie sprawę , nie! Nie potrzebuję tej reszty. Co teraz?

git reset --hard HEAD~1 [aby usunąć ten commit z lokalnej gałęzi]

git push origin HEAD --force [oba polecenia muszą być wykonane. Do usuwania ze zdalnej gałęzi]

Co to za gałąź ? Jest to obecnie sprawdzony oddział.

Edit 09/08/2015 - Remove local Git merge :

Jestem na master oddziale i połączyłem master oddziale z nowo działającym oddziałem phase2

$ 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 się tego pozbyć połączyć? Wypróbowane git reset --hard i git clean -d -f Oba nie zadział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 przed wydaniem wszystkich commitów scalających]

 578
Author: spiderman, 2014-03-25

9 answers

Wszystko zależy dokładnie od tego, co próbujesz cofnąć / cofnąć. Zacznij od przeczytania posta w linku. Ale próba odpowiedzi:

Hard reset

git reset --hard [HEAD]

całkowicie usuń wszystkie zainscenizowane i nieakcentowane zmiany śledzonych plików.

Często używam twardego resetowania, Kiedy mówię: "po prostu cofnij wszystko, jakbym zrobił kompletny ponowny klon z pilota". W Twoim przypadku, gdy chcesz, aby twój repo był nieskazitelny, to praca.

Clean

git clean [-f]

Usuń pliki, które nie są śledzone.

Do usuwania plików tymczasowych, ale zachowuj w poczekalni i nieagresywne zmiany w już śledzonych plikach. W większości przypadków prawdopodobnie kończyłbym się regułą ignorowania, zamiast wielokrotnego czyszczenia - np. dla folderów bin / obj w projekcie C#, które zazwyczaj chcesz wykluczyć z repo, aby zaoszczędzić miejsce, lub coś w tym stylu.

Opcja-f (force) usunie również pliki, które nie są śledzone i są również ignorowane przez git, chociaż ignoruj-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 Wymuś usunie je z twojego systemu plików. Sporadycznie widziałem zastosowanie do tego, np. podczas wdrażania skryptów, i chcesz wyczyścić swój kod przed wdrożeniem, zipping lub cokolwiek innego.

Git clean nie dotknie plików, które są już namierzony.

Checkout "kropka"

git checkout .

Właściwie nigdy nie widziałem tej notacji przed przeczytaniem Twojego postu. Mam problem ze znalezieniem dokumentacji na ten temat( moze ktos pomoze), ale z gry wyglada na to, ze to znaczy: [11]}

"Cofnij wszystkie zmiany w moim drzewie roboczym".

Czyli cofanie nieakceptowanych zmian w śledzonych plikach. Wygląda na to, że nie dotyka zmian i pozostawia nie śledzone pliki sam.

Stashing

Niektóre odpowiedzi wspominają o ukrywaniu. Jak sugeruje sformułowanie, prawdopodobnie używałbyś stashingu, gdy jesteś w środku czegoś (nie jesteś gotowy na commit) i musisz tymczasowo zmienić gałęzie lub jakoś popracować nad innym stanem kodu, aby później wrócić do swojego"brudnego biurka". Nie widzę, żeby to odnosiło się do twojego pytania, ale na pewno jest przydatne.

Podsumowując

Ogólnie, jeśli jesteś pewien, że masz popełnione i być może zepchnięte do odległych ważnych zmian, jeśli tylko się bawisz lub tym podobne, użycie git reset --hard HEAD, a następnie git clean -f ostatecznie oczyści Twój kod do stanu, w którym byłby, gdyby został sklonowany i sprawdzony z gałęzi. Bardzo ważne jest, aby podkreślić, że Resetowanie usunie również zmiany wystawione, ale niezatwierdzone. usunie wszystko, co nie zostało popełnione (z wyjątkiem plików nie śledzonych, w takim przypadku użyj clean ).

Wszystkie inne polecenia są tam, aby ułatwić bardziej złożone scenariusze, w których wymagana jest szczegółowość "cofania rzeczy":)

Wydaje mi się, że twoje pytanie #1 zostało uwzględnione, ale na koniec, podsumowując #2: powodem, dla którego nigdy nie znalazłeś potrzeby użycia git reset --hard było to, że nigdy niczego nie zainscenizowałeś. Gdybyś upozorował zmianę, ani git checkout ., ani git clean -f by tego nie cofnęli.

Mam nadzieję, że to pokryje.

 475
Author: Frederik Struck-Schøning,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-04 16:49:56

Tak jak w przypadku wszystkiego w git, istnieje wiele sposobów na zrobienie tego. Dwa polecenia, których użyłeś, są jednym ze sposobów. Inną rzeczą, którą mogłeś zrobić, to po prostu ukryć je za pomocą git stash -u. -u upewnia się, że nowo dodane pliki (nie śledzone) są również dołączone.

Przydatne w git stash -u jest to, że

  1. to chyba najprostszy (tylko?) jedno polecenie do osiągnięcia celu
  2. jeśli później zmienisz zdanie, odzyskasz całą swoją pracę z To tak, jakby usunąć wiadomość e-mail w Gmailu, którą możesz cofnąć, jeśli później zmienisz zdanie.]}

W związku z drugim pytaniem git reset --hard nie usunie nie śledzonych plików, więc nadal będziesz potrzebował git clean -f. Ale git stash -u może być najwygodniejszy.

 20
Author: Christoph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-24 22:51:18

powód dodania odpowiedzi w tej chwili:

Do tej pory dodawałem wnioski i "odpowiedzi" do samego pytania początkowego, czyniąc pytanie bardzo długim, a tym samym przechodząc do osobnej odpowiedzi.

Dodałem również więcej często używanych komend git , które pomagają mi na git, aby pomóc komuś innemu.

Pierwszym krokiem przed wykonaniem zmian jest skonfigurowanie nazwy użytkownika i adresu e-mail, który pojawi się wraz z Twoim / align = "left" /

#ustawia nazwę, którą chcesz dołączyć do transakcji commit

$ git config --global user.name "[name]"

#ustawia adres e-mail, który chcesz przesłać do transakcji commit

$ git config --global user.email "[email address]"

#lista globalnych konfiguracji

$ git config --list

#sprawdź status

git status

#Lista wszystkich lokalnych i zdalnych oddziałów

git branch -a

#Utwórz nową lokalną gałąź i rozpocznij pracę nad tą gałęzią

git checkout -b "branchname" 

Lub, można to zrobić jako dwa proces krokowy

Utwórz gałąź: git branch branchname praca na tej gałęzi: git checkout branchname

#commit local changes [proces dwuetapowy: - dodanie pliku do indeksu, co oznacza dodanie do przechowalni. Następnie zatwierdź pliki obecne w tym obszarze przejściowym]

git add <path to file>

git commit -m "commit message"

#sprawdź inny lokalny oddział

git checkout "local branch name"

#usuń wszystkie zmiany w lokalnej gałęzi [Załóżmy, że dokonałeś pewnych zmian w lokalnej gałęzi, takich jak dodanie nowego pliku lub modyfikacja istniejącego pliku, lub tworzenia lokalnego commita, ale już nie trzeba tego] git clean -d -f i git reset --hard [wyczyść wszystkie lokalne zmiany wprowadzone do lokalnej gałęzi z wyjątkiem local commit]

git stash -u usuwa również wszystkie zmiany

Uwaga: Jasne jest, że możemy użyć albo (1) połączenie git clean –d –f i git reset --hard Lub (2) git stash -u aby osiągnąć pożądany rezultat.

Uwaga 1: Przechowywanie, ponieważ słowo oznacza " przechowywać (coś) bezpiecznie i potajemnie w określonym miejscu.'To zawsze można odtworzyć używając git' a stash pop. Więc wybór pomiędzy powyższymi dwoma opcjami jest wywołaniem dewelopera.

Uwaga 2: git reset --hard usunie zmiany w katalogu roboczym. Przed uruchomieniem tej komendy upewnij się, że przechowujesz wszelkie lokalne zmiany, które chcesz zachować.

# przejdź do gałęzi master i upewnij się, że jesteś na bieżąco.

git checkout master

git fetch [może to być konieczne (w zależności od konfiguracji Gita) do otrzymywania aktualizacji origin/master]

git pull

# Połącz gałąź funkcji z master branch.

git merge feature_branch

# Zresetuj gałąź master do stanu origin.

git reset origin/master

#przypadkowo usunięty plik z lokalnego, jak go odzyskać? Aby uzyskać pełną ścieżkę pliku usuniętego zasobu, wykonaj git status ]}

git checkout branchname <file path name>
To jest to!

#Połącz gałąź główną z someotherbranch

git checkout master
git merge someotherbranchname

#Zmień nazwę lokalnego oddziału

git branch -m old-branch-name new-branch-name

#delete local branch

git branch -D branch-name

#Usuń zdalną gałąź

git push origin --delete branchname

Lub

git push origin :branch-name

#Przywróć commit już wypchnięty do zdalnego repozytorium

git revert hgytyz4567

#branch z poprzedniego commita używając GIT

git branch branchname <sha1-of-commit>

#Zmień komunikat commit najnowszego commita, który został już wypchnięty do zdalnego

git commit --amend -m "new commit message"
git push --force origin <branch-name>

# odrzucanie wszystkich commitów lokalnych w tej gałęzi [usuwanie lokalnych commitów]

W aby odrzucić wszystkie lokalne commity tej gałęzi, aby lokalna gałąź była identyczna z "upstream" tej gałęzi, po prostu uruchom

git reset --hard @{u}

Numer referencyjny: http://sethrobertson.github.io/GitFixUm/fixup.html lub do git reset --hard origin/master [jeśli lokalna gałąź jest master]

# przywraca commit już wypchnięty do zdalnego repozytorium?

$ git revert ab12cd15

#Usuń poprzedni commit z lokalnej gałęzi i zdalnej gałęzi

Use-Case: You just wprowadził zmianę do lokalnego oddziału i natychmiast popchnął do zdalnego oddziału, nagle zdał sobie sprawę, o nie! Nie potrzebuję tej reszty. Co teraz?

git reset --hard HEAD~1 [do usunięcia tego commita z lokalnej gałęzi. 1 oznacza jeden commit, który zrobiłeś]

git push origin HEAD --force [oba polecenia muszą być wykonane. Do usuwania ze zdalnej gałęzi]. Aktualnie sprawdzona gałąź będzie określana jako gałąź, w której dokonujesz tej operacji.

#usuń niektóre ostatnie commity z lokalnego i zdalne repo i zachować do commit, który chcesz. (rodzaj cofania commitów z lokalnego i zdalnego)

Załóżmy, że masz 3 commity, które wypchnąłeś do zdalnej gałęzi o nazwie 'develop'

commitid-1 done at 9am
commitid-2 done at 10am
commitid-3 done at 11am. // latest commit. HEAD is current here.

Aby przywrócić stary commit (aby zmienić stan gałęzi)

git log --oneline --decorate --graph // aby zobaczyć wszystkie komisje

git clean -d -f // Wyczyść wszelkie lokalne zmiany

git reset --hard commitid-1 // lokalne przywracanie do tego komisjid

git push -u origin +develop // push this state za pilota. + to do force push

# Remove local Git merge: Case: Jestem na gałęzi master i połączyłem gałąź master z nowo działającą gałęzią phase2

$ git status

On branch master

$ git merge phase2 $ git status

On branch master

twoja gałąź wyprzedza 'origin/master' przez 8 / align = "left" /

P: Jak pozbyć się tego lokalnego git merge? próbowałem git reset --hard i git clean -d -f oba nie zadziałały. Na 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 przed wydaniem wszystkich commitów scalających]

#tworzenie pliku gitignore

touch .gitignore // tworzenie pliku U użytkowników komputerów mac lub unix

Próbka .zawartość gitignore:

.project
*.py
.settings

Odnośnik do ściągawki GIT: https://services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf

 17
Author: spiderman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-17 17:57:30

1. Kiedy nie chcesz w ogóle utrzymywać lokalnych zmian.

git reset --hard

To polecenie całkowicie usunie wszystkie lokalne zmiany z lokalnego repozytorium. Jest to najlepszy sposób na uniknięcie konfliktów podczas polecenia pull, tylko jeśli nie chcesz w ogóle utrzymywać lokalnych zmian.

2. Kiedy chcesz zachować lokalne zmiany

Jeśli chcesz pobrać nowe zmiany z pilota i chcesz zignorować lokalne zmiany podczas tego pull then,

git stash

Ukryje wszystkie zmiany lokalne, teraz możesz pobrać zmiany zdalne,

git pull

Teraz możesz przywrócić swoje lokalne zmiany przez,

git stash pop
 7
Author: Actung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-04 10:46:50

Użycie:

git checkout -- <file>

Aby odrzucić zmiany w katalogu roboczym.

 4
Author: Tadas Stasiulionis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-26 13:57:22

Myślę, że git ma jedną rzecz, która nie jest wyraźnie udokumentowana. Myślę, że to było właściwie zaniedbane.

git checkout .

Uratowałeś mi dzień. Zawsze mam rzeczy, które chcę wypróbować za pomocą zmodyfikowanego kodu. Ale rzeczy czasami kończą się na zamieszaniu w zmodyfikowanym kodzie, dodaniu nowych Nie śledzonych plików itp. Więc chcę zrobić to, co chcę, zrobić bałagan, a potem szybko posprzątać i zaangażować się, jeśli jestem szczęśliwy.

Jest git clean -fd działa dobrze dla plików nie śledzonych.

Wtedy git reset po prostu usuwa inscenizowane, ale git checkout jest trochę zbyt uciążliwe. Podanie Pliku jeden po drugim lub użycie katalogów nie zawsze jest idealne. Czasami zmienione pliki, których chcę się pozbyć, znajdują się w katalogach, które chcę zachować. Życzyłem sobie tej jednej komendy, która usuwa niezakłócone zmiany i oto jesteś. Dzięki.

Ale myślę, że powinni mieć git checkout bez żadnych opcji, usunąć wszystkie nieakcentowane zmiany i nie dotykać wystawionego. Jest modułowy i intuicyjny. Raczej to, co robi git reset. git clean powinien też zrobić to samo.

 4
Author: Emmanuel Mahuni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-08 21:14:42

Najlepszym sposobem jest sprawdzenie zmian.

Zmiana pliku pom.xml w projekcie o nazwie project-name możesz to zrobić:

git status

# modified:   project-name/pom.xml

git checkout project-name/pom.xml
git checkout master

# Checking out files: 100% (491/491), done.
# Branch master set up to track remote branch master from origin.
# Switched to a new branch 'master'
 2
Author: bpedroso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-15 17:01:22

Dla odrzuć wszystkie lubię schować i upuścić ten schowek, jest to najszybszy sposób na odrzucenie wszystkich, zwłaszcza jeśli pracujesz między wieloma repo.

To ukryje wszystkie zmiany w kluczu {0} i natychmiast upuści je z {0}

git stash && git stash drop

 2
Author: Tatarin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-27 16:26:25

Po pierwsze sprawdzanie jest twoją ważną zmianą zapisaną lub nie przez:

$ Git status

Than try

$ git reset --hard

Zresetuje Twoją gałąź do domyślnej

Ale jeśli trzeba po prostu cofnąć:

$ edit (1) $ git add frotz.c filfre.c $ mailx (2) $ Git reset
(3) $ git pull git: / / info. example. com/ nitfol


Czytaj więcej > > https://git-scm.com/docs/git-reset

 1
Author: Rizo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-21 22:56:30