2009-08-20 10 views
229

Ich arbeitete auf einem Git-Zweig und war bereit, meine Änderungen zu begehen, also machte ich einen Commit mit einer nützlichen Commit-Nachricht. Ich habe dann geistesabwesend kleinere Änderungen am Code vorgenommen, die es nicht wert sind, aufbewahrt zu werden. Ich möchte jetzt Zweige ändern, aber git gibt mir,git: Zweig wechseln und alle Änderungen ignorieren, ohne zu committen

error: You have local changes to "X"; cannot switch branches.

Ich dachte, dass ich Zweige ändern könnte, ohne zu begehen. Wenn ja, wie kann ich das einrichten? Wenn nicht, wie komme ich aus diesem Problem heraus? Ich möchte die kleinen Änderungen ignorieren, ohne zu committen und nur die Zweige zu wechseln.

+1

Ich glaube, dies geschieht nur, wenn sie Änderungen in Szene gesetzt werden für begehen, aber nicht verpflichtet? git checkout funktioniert gut, um Zweige zu ändern, wenn Sie die Dateien noch nicht mit git add oder ähnlichem inszeniert haben. –

+1

Hallo Jeremy, Was meinst du mit "inszeniert"? Forcieren des Benutzers, Datei vor Änderungsfiles zu committen, scheint nicht wie ein guter Workflow zu sein. Zum Beispiel, wenn ich im Master-Repository bin und schnell etwas in einem Zweig überprüfen möchte. Ich muss den Code zuerst an den Master übergeben, auch wenn der Code zur Hälfte geschrieben ist! Sie sagen, dass es in der Tat möglich sein sollte, eine Filiale in dieser Situation zu überprüfen? –

+0

@boyfarrell Sie können 'Git stash' verwenden, um die Änderungen vorübergehend zu speichern, ohne zu committen. – Howiecamp

Antwort

297

Sie benötigen einen sauberen Status, um Zweige zu ändern. Der Zweig-Checkout ist nur erlaubt, wenn er die "schmutzigen Dateien" nicht beeinflusst (wie Charles Bailey Bemerkungen in den Kommentaren).

Andernfalls sollten Sie entweder:

  • stash Ihre aktuelle Änderung oder
  • reset --hard HEAD (wenn Sie nichts dagegen, diese geringfügigen Änderungen zu verlieren) oder
  • checkout -f (Wenn Zweige Schalt, gehen, selbst wenn die Index oder der Arbeitsbaum unterscheidet sich von HEAD. Dies wird verwendet, um lokale Änderungen wegzuwerfen.)
+28

"Sie benötigen einen sauberen Zustand, um Zweige zu ändern." ist nur wahr, wenn der Zweigwechsel die "schmutzigen Dateien" beeinflusst. –

+0

Große Antwort von VonC und Kommentar von Charles Bailey –

+6

Für die Stash-Methode, tippte ich "Git stash speichern", "git checkout otherbranch", dann endlich "git stash pop". –

7

Wenn Sie Änderungen an Dateien vorgenommen haben, die Git beim Wechseln von Zweigen auch ändern muss, wird es Sie nicht zulassen. Um Arbeitsänderungen zu verwerfen, verwenden Sie:

git reset --hard HEAD 

Dann können Sie Zweige wechseln.

12

Folgen,

$: git checkout -f 

$: git checkout next_branch 
90

Wenn Sie die Änderungen verwerfen wollen,

git checkout -- <file> 
git checkout branch 

Wenn Sie die Änderungen behalten möchten,

git stash save 
git checkout branch 
git stash pop 
+8

In der Tat, was Romerun sagt (um abgeschlossen zu sein): 'git stash save' (wenn in Arbeits BranchY) dann' git checkout branchX' etwas tun 'git add/commit -m' usw.' git checkoutY' und 'git stash pop 'um das Versteck zurück zu bekommen – Highmastdon

+2

Vielleicht so. Ich habe jedoch eine Situation, wo ich tun möchte, was die Antwort sagt, wenn ich es richtig verstehe: Verstecke Änderungen, Wechsel von Y zu X, Pop-Änderungen und verpflichten sie auf X. –

51

gut, sollte es

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

Ja, Stash ist global, nicht Zweig Spezifisch, wenn ich Pop nach dem Wechseln des Zweiges verstaue, werde ich das gleiche Versteck wie auf dem anderen Zweig bekommen –

+4

Sollte notiert werden 'git stash' wird standardmäßig' git stash save' –

+0

Vielen Dank, es ist sehr hilfreich für mich –

7

Hinweis sein dass, wenn Sie entfernte Zweige zusammengeführt haben oder lokale commits ein d wollen an den Remote-HEAD zurück zu gehen, müssen Sie tun:

git reset --hard origin/HEAD 

HEAD allein nur auf die lokale commit/merge beziehen - mehrmals habe ich vergessen, dass beim Zurücksetzen und am Ende mit „Ihr Repository ist X commits ahead .. "als ich beabsichtigte, ALLE Änderungen/Commits zu nuken und in die entfernte Filiale zurückzukehren.

0

zu einem neuen Zweig Schalen verlieren Änderungen:

git checkout -b YOUR_NEW_BRANCH_NAME --force 

Wechsel zu einem bestehenden Zweig zu verlieren Änderungen:

git checkout YOUR_BRANCH --force 
Verwandte Themen