git: Wechseln Sie den Zweig und ignorieren Sie alle Änderungen, ohne sie festzuschreiben

318

Ich habe an einem Git-Zweig gearbeitet und war bereit, meine Änderungen festzuschreiben. Daher habe ich ein Festschreiben mit einer nützlichen Festschreibungsnachricht durchgeführt. Ich habe dann geistesabwesend kleinere Änderungen am Code vorgenommen, die es nicht wert sind, beibehalten zu werden. Ich möchte jetzt die Zweige wechseln, aber git gibt mir,

Fehler: Sie haben lokale Änderungen an "X"; Zweige können nicht gewechselt werden.

Kann ich Filialen wechseln, ohne mich zu verpflichten? Wenn ja, wie kann ich das einrichten? Wenn nicht, wie komme ich aus diesem Problem heraus? Ich möchte die geringfügigen Änderungen ignorieren, ohne sie festzuschreiben, und nur die Zweige wechseln.

Daniel Farrell
quelle
1
Ich glaube, dass dies nur passiert, wenn die Änderungen für das Festschreiben bereitgestellt, aber nicht festgeschrieben werden. git checkout eignet sich gut zum Ändern von Zweigen, wenn Sie die Dateien noch nicht mit git add oder ähnlichem bereitgestellt haben.
Jeremy Wall
1
Hallo Jeremy, was meinst du mit "inszeniert"? Den Benutzer zum Festschreiben von Dateien zu zwingen, bevor Zweige geändert werden, scheint kein 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! Wollen Sie damit sagen, dass es in dieser Situation tatsächlich möglich sein sollte, eine Filiale auszuchecken?
Daniel Farrell
@boyfarrell Sie können 'Git stash' verwenden, um die Änderungen vorübergehend zu speichern, ohne sie festzuschreiben.
Howiecamp
Vernetzung der eng verwandten Wie erzwinge ich "Git Pull", um lokale Dateien zu überschreiben?
user56reinstatemonica8
1
Wenn Sie zu einem Zweig wechseln, ohne Änderungen im alten Zweig zu übernehmen, versucht git, die Änderungen an den Dateien im neuen Zweig zusammenzuführen. Wenn das Zusammenführen ohne Konflikte erfolgt, ist das Umschalten von Zweigen erfolgreich und Sie können die Änderungen in dem neuen Zweig sehen. Wenn jedoch ein Konflikt auftritt, erhalten Sie error: You have local changes to '<filename>'; cannot switch branches.und der Zweig ändert sich nicht. Sie können git checkout -m <branch-name>Konflikte zusammenführen und in den Zweig auschecken und Konflikte selbst lösen oder git checkout -f <branch-name>Änderungen ignorieren.
Samad Montazeri

Antworten:

400

Sie benötigen einen sauberen Status, um Zweige zu wechseln. Das Auschecken von Zweigen ist nur zulässig, wenn die "schmutzigen Dateien" nicht betroffen sind (wie Charles Bailey in den Kommentaren bemerkt).

Andernfalls sollten Sie entweder:

  • Verstecken Sie Ihre aktuelle Änderung oder
  • reset --hard HEAD (wenn es Ihnen nichts ausmacht, diese kleinen Änderungen zu verlieren) oder
  • checkout -f (Fahren Sie beim Wechseln der Zweige fort, auch wenn sich der Index oder der Arbeitsbaum von HEAD unterscheidet. Dies wird verwendet, um lokale Änderungen wegzuwerfen.)

Oder in jüngerer Zeit:

Fahren Sie fort, auch wenn sich der Index oder der Arbeitsbaum von HEAD unterscheidet.
Sowohl der Index als auch der Arbeitsbaum werden wiederhergestellt, um mit dem Schaltziel übereinzustimmen.

Dies unterscheidet sich von dem git switch -m <branch-name>, was eine Drei-Wege-Zusammenführung zwischen dem aktuellen Zweig, Ihrem Arbeitsbauminhalt und dem neuen Zweig auslöst: Auf diese Weise verlieren Sie Ihre laufende Arbeit nicht.

VonC
quelle
34
"Sie brauchen einen sauberen Zustand, um Zweige zu wechseln." ist nur wahr, wenn die Zweigänderung die 'schmutzigen Dateien' betrifft.
CB Bailey
10
Für die Stash-Methode habe ich "git stash save", "git checkout otherbranch" und schließlich "git stash pop" eingegeben.
Venkat D.
1
Momentan sehe ich diese Fehlermeldung nicht und die Änderungen, die ich an einem Zweig vorgenommen habe, werden auf dem anderen angezeigt, wenn ich "git status" mache. hat sich etwas geändert?
Senthil A Kumar
2
Vielen Dank. Die Kasse -f war das, was ich brauchte. Ich habe git zurückgesetzt --hard git clean -f git checkout mybranch -f
nologo
1
Hier ist die eine großartige Sache, die Git völlig falsch gemacht hat, als er gegen die grundlegende Definition eines Zweigs verstoßen hat. Im Gegensatz zu Git Branch bedeutet dies, dass zwei völlig unterschiedliche Arbeitsbereiche aus einem Repository stammen.
Nehem
125

Wenn Sie die Änderungen verwerfen möchten,

git checkout -- <file>
git checkout branch

Wenn Sie die Änderungen behalten möchten,

git stash save
git checkout branch
git stash pop
Jamie Macey
quelle
10
In der Tat, was Romerun sagt (um vollständig zu sein): git stash save(wenn Sie in einem Zweig arbeiten), dann git checkout branchXtun Sie etwas git add/commit -musw. git checkout branchYund git stash popholen Sie sich das
Versteck
2
Vielleicht so. Ich habe jedoch eine Situation, in der ich tun möchte, was in der Antwort steht, wenn ich es richtig verstehe: Änderungen speichern, von Y zu X wechseln, dann Änderungen einfügen und auf X festschreiben.
Ben Klein
1
Beachten Sie, dass git stash savejetzt zugunsten vongit stash push
Argento
Dieser Alias vereinfacht das Beibehalten von Änderungen beim Ändern von Zweigen.
Tom Hale
62

Nun, es sollte sein

git stash save
git checkout branch
// do something
git checkout oldbranch
git stash pop
Romerun
quelle
5
Ja, Stash ist global, nicht branchenspezifisch. Wenn ich Pop nach dem Filialwechsel verstecke, erhalte ich den gleichen Stash wie auf den anderen Filialen
Aditya Mittal
6
Sollte beachtet werden, git stashwird standardmäßiggit stash save
Charlie-Greenman
Vielen Dank, es ist sehr hilfreich für mich
Govind Kumar
22

Folgen,

$: git checkout -f

$: git checkout next_branch
einfach hart
quelle
16

Beachten Sie, dass Sie Folgendes tun müssen, wenn Sie Remote-Zweige zusammengeführt haben oder lokale Commits haben und zum Remote-HEAD zurückkehren möchten:

git reset --hard origin/HEAD

HEAD allein bezieht sich nur auf das lokale Festschreiben / Zusammenführen - mehrmals habe ich vergessen, dass beim Zurücksetzen und am Ende "Ihr Repository hat X Festschreibungen voraus ...", als ich beabsichtigte, ALLE Änderungen / Festschreibungen zu nuklearisieren und zum Remote-Zweig zurückzukehren .

ccliffe
quelle
9

Wenn Sie Änderungen an Dateien vorgenommen haben, die Git auch beim Wechseln von Zweigen ändern muss, können Sie dies nicht. Verwenden Sie zum Verwerfen von Arbeitsänderungen:

git reset --hard HEAD

Dann können Sie die Zweige wechseln.

Greg Hewgill
quelle
8

Keine dieser Antworten hat mir geholfen, da ich auch nach dem Zurücksetzen und Verstecken noch nicht verfolgte Dateien hatte. Ich musste es machen:

git reset --hard HEAD
git clean -d -f
Vishnu Viswanath
quelle
4

Wechsel zu einem neuen Zweig, der Änderungen verliert:

git checkout -b YOUR_NEW_BRANCH_NAME --force

Wechseln zu einer bestehenden Niederlassung, bei der Änderungen verloren gehen:

git checkout YOUR_BRANCH --force
Jorge Avila
quelle
4

Einfache Antwort:

ist das Auschecken eines Zweigs zu erzwingen

git checkout -f <branch_name>

Wenn Sie das Auschecken eines Zweigs erzwingen, wird git angewiesen, alle Änderungen, die Sie am aktuellen Zweig vorgenommen haben, zu löschen und den gewünschten auszuchecken.

oder für den Fall, dass Sie ein Commit auschecken

git checkout -f <commit-hash>


"Ich dachte, ich könnte die Filialen wechseln, ohne mich zu verpflichten. Wenn ja, wie kann ich das einrichten? Wenn nicht, wie komme ich aus diesem Problem heraus?"

Die Antwort darauf lautet Nein , das ist buchstäblich die Philosophie von Git, dass Sie alle Änderungen verfolgen und dass jeder Knoten (dh Commit) mit den neuesten Änderungen auf dem neuesten Stand sein muss, es sei denn, Sie haben machte natürlich ein neues Commit.


Sie haben beschlossen, Änderungen beizubehalten?

Dann verstauen Sie sie mit

git stash

Verwenden Sie dann, um Ihre Änderungen in der gewünschten Verzweigung zu entfernen

git stash apply

Dadurch werden Ihre Änderungen übernommen, aber auch in der Stash-Warteschlange gespeichert. Wenn Sie sie nicht im Stack-Stack behalten möchten, platzieren Sie sie mit

git stash pop

Das ist das Äquivalent von applyund danndrop

Kareem Jeiroudi
quelle
2

Schließen Sie das Terminal, löschen Sie den Ordner, in dem sich Ihr Projekt befindet, und klonen Sie dann erneut Ihr Projekt und voilá.

Miguelacio
quelle
2
git soll Sie nicht dazu bringen, das Projekt zu löschen und erneut zu klonen! Wenn Sie die neueste Version von Origin erhalten möchten, müssen Sie nur reset --hard!
Ahmed Nour Jamal El-Din
2

Wenn Sie die Änderungen beibehalten und den Zweig in einem einzeiligen Befehl ändern möchten

git stash && git checkout <branch_name> && git stash pop
Vinit Solanki
quelle
1

Verschieben Sie nicht festgeschriebene Änderungen in einen neuen Zweig

Ich habe dafür einen .gitconfigAlias erstellt :

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

new-branch-nameVerwenden Sie zum Wechseln zu :

git spcosp new-branch-name

Nicht festgeschriebene Datei- und Indexänderungen werden beibehalten.

Tom Hale
quelle
1

git checkout -f your_branch_name

git checkout -f your_branch_name

Wenn Sie Probleme beim Zurücksetzen von Änderungen haben:

git checkout .

Wenn Sie nicht verfolgte Verzeichnisse und Dateien entfernen möchten:

git clean -fd
Pedro Trujillo
quelle
0

Um zu einem anderen Zweig zu wechseln, ohne die Änderungen zu übernehmen, wenn Git Stash nicht funktioniert. Sie können den folgenden Befehl verwenden:

Git Checkout -f Filialname

Rajkumar Chilukuri
quelle