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.

Daniel Farrell
źródło
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
Łączenie powiązanych ze sobą powiązań Jak zmusić „git pull” do zastąpienia lokalnych plików?
user56reinstatemonica8
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.

VonC
źródło
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
Jamie Macey
źródło
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
romerun
źródło
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
22

Podążać,

$: git checkout -f

$: git checkout next_branch
po prostu trudne
źródło
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 .

ccliffe
źródło
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.

Greg Hewgill
źródło
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
Visnu viswanath
źródło
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
Jorge Avila
źródło
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

Kareem Jeiroudi
źródło
2

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

miguelacio
źródło
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
Vinit Solanki
źródło
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.

Tom Hale
źródło
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
Pedro Trujillo
źródło
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

rajkumar chilukuri
źródło