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:
git checkout .
- usuwa tylko nieuszkodzone śledzone pliki [wpisz 2]git clean -f
- usuwa tylko nieuszkodzone, nieuszkodzone pliki [Typ 3]git reset --hard
- usuwa tylko śledzone i nieakcentowane pliki śledzone [Typ 1, Typ 2]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
-n
lub --dry-run
, aby wyświetlić podgląd uszkodzeń.
Jeśli chcesz również usunąć katalogi, Uruchom git clean -f -d
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]
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.
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
- to chyba najprostszy (tylko?) jedno polecenie do osiągnięcia celu
- 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.
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
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
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.
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 .
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.
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'
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
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
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