git: przełącz gałąź i zignoruj ​​wszelkie zmiany bez popełniania


318

Pracowałem nad gałęzią git i byłem gotowy na zatwierdzenie moich zmian, więc dokonałem zatwierdzenia za pomocą użytecznego komunikatu zatwierdzenia. Następnie z roztargnieniem wprowadziłem niewielkie zmiany w kodzie, które nie są warte zachowywania. Chcę teraz zmienić gałęzie, ale git daje mi,

błąd: masz lokalne zmiany na „X”; nie można przełączać gałęzi.

Czy mogę zmienić oddziały bez zobowiązań? Jeśli tak, jak mogę to skonfigurować? Jeśli nie, jak mogę wyjść z tego problemu? Chcę zignorować drobne zmiany bez zobowiązań i po prostu zmienić gałęzie.


1
Wierzę, że dzieje się tak tylko wtedy, gdy zmiany są wprowadzane do zatwierdzenia, ale nie są zatwierdzane? git checkout działa dobrze do zmiany gałęzi, jeśli nie ustawiłeś jeszcze plików przy użyciu git add lub podobnego.
Jeremy Wall,

1
Cześć Jeremy, Co masz na myśli przez „inscenizację”? Zmuszanie użytkownika do zatwierdzenia pliku przed zmianą gałęzi nie wydaje się być świetnym przepływem pracy. Na przykład, jeśli jestem w głównym repozytorium i chcę szybko sprawdzić coś w oddziale. Najpierw muszę przekazać kod do mistrza, nawet jeśli kod jest w połowie napisany! Czy mówisz, że w tej sytuacji powinna istnieć możliwość dokonania transakcji w oddziale?
Daniel Farrell,

@boyfarrell Możesz użyć „Git stash”, aby tymczasowo zapisać zmiany bez popełniania.
Howiecamp


1
po przejściu do gałęzi bez dokonywania zmian w starej gałęzi, git próbuje scalić zmiany w plikach w nowej gałęzi. Jeśli scalenie zostanie wykonane bez żadnych konfliktów, przełączanie gałęzi zakończy się powodzeniem, a zmiany będą widoczne w nowej gałęzi. Ale jeśli dojdzie do konfliktu, dostaniesz error: You have local changes to '<filename>'; cannot switch branches.i gałąź się nie zmieni. możesz zrobić, git checkout -m <branch-name>aby scalić konflikty i przejść do oddziału i samodzielnie rozwiązać konflikty lub git checkout -f <branch-name>zignorować zmiany.
samad montazeri

Odpowiedzi:


400

Potrzebujesz czystego stanu, aby zmienić gałęzie. Kasy będą dozwolone tylko wtedy, gdy nie wpłynie to na „brudne pliki” (jak Charles Bailey zauważa w komentarzach).

W przeciwnym razie powinieneś:

  • ukryć swoją obecną zmianę lub
  • reset --hard HEAD (jeśli nie masz nic przeciwko utracie tych drobnych zmian) lub
  • checkout -f (Podczas przełączania gałęzi postępuj, nawet jeśli indeks lub drzewo robocze różni się od HEAD. Służy do odrzucania lokalnych zmian).

Lub ostatnio:

Kontynuuj, nawet jeśli indeks lub drzewo robocze różni się od HEAD.
Zarówno indeks, jak i drzewo robocze są przywracane, aby pasowały do ​​celu przełączania.

Różni się to od tego git switch -m <branch-name>, który uruchamia trójstronne połączenie między bieżącą gałęzią, zawartością drzewa roboczego, a nową gałęzią jest zrobiona: w ten sposób nie stracisz trwającej pracy.


34
„Potrzebujesz czystego stanu, aby zmienić gałęzie”. jest prawdą tylko wtedy, gdy zmiana gałęzi wpływa na „brudne pliki”.
CB Bailey,

10
W przypadku metody ukrywania wpisałem „git stash save”, „git checkout otherbranch”, a następnie „git stash pop”.
Venkat D.

1
Obecnie nie widzę tego komunikatu o błędzie, a zmiany, które wprowadziłem w jednej gałęzi, pojawiają się w drugiej, gdy wykonuję „status git”. czy coś się zmieniło?
Senthil A Kumar

2
dzięki. Kasa -f była tym, czego potrzebowałem. zrobiłem git reset
hard

1
Oto jedna wielka rzecz, w której Git całkowicie się pomylił, naruszając podstawową definicję gałęzi. W przeciwieństwie do gałęzi git, oznacza to dwa całkowicie różne obszary robocze rozwidlone z repozytorium.
nehem

125

Jeśli chcesz odrzucić zmiany,

git checkout -- <file>
git checkout branch

Jeśli chcesz zachować zmiany,

git stash save
git checkout branch
git stash pop

10
Rzeczywiście, co mówi Romerun (do uzupełnienia): git stash save(kiedy pracujesz w oddziale Y), a następnie git checkout branchXzrób coś git add/commit -mitp. git checkout branchYI git stash popodzyskaj zapas
Highmastdon,

2
Może tak. Mam jednak sytuację, w której chcę zrobić to, co mówi odpowiedź, jeśli dobrze to rozumiem: ukryj zmiany, zmień z Y na X, a następnie pop zmiany i zatwierdź je na X.
Ben Klein

1
zauważ, że git stash saveobecnie jest przestarzałe na korzyśćgit stash push
Argento

Ten alias upraszcza przypadek utrzymywania zmian przy zmianie gałęzi.
Tom Hale

62

tak powinno być

git stash save
git checkout branch
// do something
git checkout oldbranch
git stash pop

5
Tak, skrytka ma charakter globalny, nie jest specyficzna dla gałęzi, jeśli ukryję pop po zmianie gałęzi, dostanę taką samą skrytkę, jak na innych gałęziach
Aditya Mittal

6
Należy zauważyć, git stashże domyślniegit stash save
Charlie-Greenman

Dziękuję, jest to dla mnie bardzo pomocne
Govind Kumar


16

Pamiętaj, że jeśli połączyłeś zdalne oddziały lub masz lokalne zatwierdzenia i chcesz wrócić do zdalnego HEAD, musisz:

git reset --hard origin/HEAD

HEAD sam będzie odnosił się tylko do lokalnego zatwierdzenia / scalenia - kilkakrotnie zapomniałem, że kiedy resetuję i kończę na „twoje repozytorium to X zatwierdza do przodu ..”, kiedy w pełni zamierzałem nuke WSZYSTKIE zmiany / zatwierdzenia i powrócić do zdalnej gałęzi .


9

Jeśli dokonałeś zmian w plikach, które Git musi zmienić również podczas zmiany gałęzi, nie pozwoli ci to. Aby odrzucić działające zmiany, użyj:

git reset --hard HEAD

Następnie będziesz mógł zmieniać gałęzie.


9

Żadna z tych odpowiedzi nie pomogła mi, ponieważ nadal miałem nieśledzone pliki nawet po zresetowaniu i ukryciu. Musiałem zrobić:

git reset --hard HEAD
git clean -d -f

4

przejście do nowego oddziału tracąc zmiany:

git checkout -b YOUR_NEW_BRANCH_NAME --force

przejście do istniejącej gałęzi tracąc zmiany:

git checkout YOUR_BRANCH --force

4

Łatwa odpowiedź:

jest wymuszenie kasy oddziału

git checkout -f <branch_name>

Wymuszanie wyewidencjonowania gałęzi mówi gitowi, aby porzucił wszystkie zmiany dokonane w bieżącej gałęzi i wypisał żądaną.

lub w przypadku sprawdzania zatwierdzenia

git checkout -f <commit-hash>


„myślałem, że mogę zmienić oddziały bez zobowiązań. Jeśli tak, to jak to skonfigurować? Jeśli nie, jak mogę wyjść z tego problemu?”

Odpowiedź brzmi: nie , to dosłownie filozofia Git, że śledzisz wszystkie zmiany, i że każdy węzeł (tj. Zatwierdzenie) musi być na bieżąco z najnowszymi zmianami, które wprowadziłeś, chyba że oczywiście dokonał nowego zatwierdzenia.


Zdecydowałeś się zachować zmiany?

Następnie schowaj je za pomocą

git stash

a następnie, aby odblokować zmiany w wybranej gałęzi, użyj

git stash apply

które zastosują zmiany, ale zachowaj je również w kolejce ukrytych. Jeśli nie chcesz trzymać ich w stosie, ukryj je za pomocą

git stash pop

To jest odpowiednik applyi wtedydrop


2

Zamknij terminal, usuń folder, w którym znajduje się twój projekt, a następnie sklonuj ponownie swój projekt i voilá.


2
git nie ma na celu nakłaniać cię do usunięcia projektu i sklonowania go ponownie! jeśli chcesz uzyskać najnowszą wersję od pochodzenia, po prostu reset --hard!
Ahmed Nour Jamal El-Din

2

Jeśli chcesz zachować zmiany i zmienić gałąź w poleceniu w jednym wierszu

git stash && git checkout <branch_name> && git stash pop

1

Przenieś niezaangażowane zmiany do nowej gałęzi

Utworzyłem .gitconfigdo tego alias:

[alias]
spcosp = !"git stash push && git checkout \"$@\" && git stash pop --index #"

Aby zmienić new-branch-name, użyj:

git spcosp new-branch-name

I wszelkie niezaangażowane zmiany plików i indeksów zostaną zachowane.


1

git checkout -f twoja_nazwa_gałęzi

git checkout -f your_branch_name

jeśli masz problemy z cofnięciem zmian:

git checkout .

jeśli chcesz usunąć nieśledzone katalogi i pliki:

git clean -fd

0

Aby przejść do innej gałęzi bez zatwierdzania zmian, gdy git skrytka nie działa. Możesz użyć poniższego polecenia:

git checkout -f nazwa-gałęzi

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.