Fehler beim Wechsel zum Hauptzweig: Meine lokalen Änderungen werden beim Auschecken überschrieben

127

Diese Frage ähnelt dieser , ist jedoch spezifischer.

Ich habe ein Projekt mit zwei Zweigen ( stagingund beta).

Ich entwickle weiter stagingund benutze den masterZweig, um Fehler zu beheben. Wenn ich also an der Bereitstellung arbeite und einen Fehler sehe, wechsle ich zum masterZweig:

git checkout master

und mach das Zeug:

git add fileToAdd
git commit -m "bug fixed"

und dann verschmelze ich mit beiden Zweigen:

git checkout staging
git merge master
git checkout beta
git merge beta

Und es spielt keine Rolle, ob sich andere Dateien im Arbeitsbaum befinden.

Aber jetzt, wenn ich versuche, zum masterZweig zu wechseln , erhalte ich eine Fehlermeldung :

error: Your local changes to the following files would be overwritten by checkout:
src/Pro/ConvocationBundle/Controller/DefaultController.php
Please, commit your changes or stash them before you can switch branches.
Aborting

Ich dachte, ich sollte die Datei aus dem Staging-Bereich entfernen:

git reset HEAD src/Pro/ConvocationBundle/Controller/DefaultController.php

aber ich bekomme den gleichen Fehler. Wenn ich das tue, git statusbekomme ichNo changes to commit

Manolo
quelle
4
Hast du es versucht reset --hard? Wenn Sie wirklich sicher sind, dass Sie Ihre Änderungen verwerfen möchten. Oder verwenden Sie Stash, wenn Sie dies nicht tun.
Keltar
@keltar - Nein. Ich möchte meine Änderungen nicht verwerfen. Halten Sie sie einfach für ein späteres Commit auf dem Arbeitsbaum
Manolo
1
Ich glaube nicht, dass Sie Zweige wechseln können, während Sie nicht festgeschriebene Änderungen beibehalten, aber ich könnte mich leicht irren - nicht wirklich mein Fachgebiet. Versuchen git add your-fileund zu begehen.
Keltar
@ Keltar - Ich habe vorher auf diese Weise gearbeitet. Ich möchte stagingjetzt keine Änderungen vornehmen .
Manolo
Vielleicht wurde Ihre widersprüchliche Datei nicht geändert, als Sie das zuvor versucht haben. Sie haben Änderungen, Git müssen sie irgendwo speichern, um sie später wiederherzustellen. Es ist sehr unwahrscheinlich, dass dies ohne Commits möglich ist. Aber wenn Sie wirklich nicht wollen - verwenden Sie Stash, es ist genau der Grund, warum es existiert.
Keltar

Antworten:

128

Ihr Fehler wird angezeigt, wenn Sie eine Datei geändert haben und der Zweig, zu dem Sie wechseln, auch Änderungen für diese Datei enthält (ab dem letzten Zusammenführungspunkt).

Ich sehe es so, dass Sie Folgendes festlegen: Festschreiben und dann dieses Festschreiben mit zusätzlichen Änderungen ändern (Sie können Festschreibungen in Git ändern, solange sie nicht pushbearbeitet werden). oder - Stash verwenden:

git stash save your-file-name
git checkout master
# do whatever you had to do with master
git checkout staging
git stash pop

git stash saveerstellt einen Stash, der Ihre Änderungen enthält, aber keinem Commit oder Zweig zugeordnet ist. git stash popWendet den neuesten Stash-Eintrag auf Ihren aktuellen Zweig an, stellt gespeicherte Änderungen wieder her und entfernt sie aus dem Stash.

Keltar
quelle
3
Danke dir. Sind Sie sicher, dass dadurch keine Änderungen an meinem Arbeitsbaum vorgenommen werden (keine hinzugefügten Dateien)? Ich möchte meine Änderungen nicht verlieren: - /
Manolo
Ups, falsch geschrieben, addwenn es tatsächlich saveaktualisiert wird. Du meinst, für andere Dateien? git stash saveOhne Dateinamen speichert der Parameter alle geänderten Dateien, wenn Sie möchten (und setzt sie auf den zuletzt festgeschriebenen Zustand zurück). Und eine zusätzliche Kopie des Verzeichnisbaums zu haben, tut nie weh, aber ich bin immer paranoid.
Keltar
Die Sache wäre, alle geänderten Dateien außer der zu speichern, die ich zum masterZweig hinzufügen möchte . Eine Option wären auch popdie Änderungen in einem anderen Zweig?
Manolo
Ich bin mir nicht sicher was du meinst. Ja, Sie können Stash auf einen anderen Zweig anwenden, aber es ersetzt einfach den Dateiinhalt und führt ihn nicht zusammen.
Keltar
1
@Honey es hat nichts mit Filialen zu tun, Problem sind nicht festgeschriebene Änderungen. Checkout muss per Definition Ihre Dateien auf den Status von zurücksetzen master, aber dadurch geht der aktuelle Inhalt verloren. Da dieser Inhalt nicht festgeschrieben ist, ist es unmöglich, später in diesen Status zurückzukehren, daher ein Fehler Ich würde mich später nicht über verlorene Änderungen aufregen.
Keltar
149

Ich bin auf das gleiche Problem gestoßen und habe es durch gelöst

git checkout -f branch

und seine Spezifikation ist ziemlich klar.

-f, --force

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 .

Wenn Sie Pfade aus dem Index auschecken, schlagen Sie nicht bei nicht zusammengeführten Einträgen fehl. Stattdessen werden nicht zusammengeführte Einträge ignoriert.

KikiYu
quelle
7
Als mein Git gestaut wurde (keine lokalen Änderungen, aber immer noch dieser Fehler), hat mir diese Lösung geholfen!
lukyer
5
Danke, du hast meinen Bildschirm davor bewahrt, eine Faust durch ihn zu bekommen.
Eule
3
Ich habe meine Änderungen auf diese Weise verloren
Jacek Dziurdzikowski
1
Ja, Sie werden dadurch Änderungen verlieren. Dies sollte mit einer großen Einschränkung verbunden sein.
Alexander Mills
Ich will es umgekehrt. Der Master befindet sich hinter meinem Zweig und ich bin mit dem Master auf dem neuesten Stand, kann aber immer noch nicht den Zweig wechseln. Muss ein Idiot sein.
jgmjgm
12

Sie können das Auschecken Ihres Zweigs erzwingen, wenn Sie Ihre lokalen Änderungen nicht übernehmen möchten.

git checkout -f branch_name
Deepika Patel
quelle
1
Das sudoist nicht notwendig, es wird nur die Dateiberechtigungen brechen. Es ist der gleiche Git-Befehl wie vor einem Jahr von @kiki_yu , aber es ist noch schlimmer.
Kenorb
2
Ich habe meine Änderungen auf diese Weise verloren
Jacek Dziurdzikowski
2
@JacekDziurdzikowski Sie haben Ihre Änderungen also zweimal verloren (siehe Kommentar zu kiki_yus Antwort), indem Sie Lösungen angewendet haben, in denen ausdrücklich darauf hingewiesen wurde, dass das Verwerfen lokaler Änderungen der eigentliche Zweck war . Ist mein Sarkasmusdetektor kaputt oder ... meinst du das ernst?
RomainValeri
@RomainValeri Hmm, ich denke, das war meine Art, andere zu warnen, die Anfänger mit Git sind (sie müssen Anfänger sein, wenn sie diesen Beitrag lesen), um bereit zu sein, sich von allen Änderungen zu verabschieden, die sie vorgenommen haben. Ich dachte, dass die Zeit, in der Änderungen in einem Zweig vorgenommen werden, in diesem Zweig bleiben sollte, bis ich ihn erneut auschecke. Hinweis für Neulinge, die auch so denken: Verwenden Sie Git Stash :)
Jacek Dziurdzikowski
Doppelte Antwort ohne Grund. Die erste Antwort enthält noch mehr Informationen.
MAChitgarha
9

Ich bin auf das gleiche Problem gestoßen und habe es durch gelöst

Git Checkout -f Zweig

Nun, sei vorsichtig mit dem -fSchalter. Sie verlieren alle nicht festgeschriebenen Änderungen, wenn Sie den -fSchalter verwenden. Während es einige Anwendungsfälle geben kann, in denen die Verwendung hilfreich -fist, möchten Sie in den meisten Fällen möglicherweise stashIhre Änderungen vornehmen und dann switchverzweigen. Die stashingVorgehensweise ist oben erläutert.

BeNiza
quelle
0

Sie können in der aktuellen Verzweigung festschreiben, in eine andere Verzweigung auschecken und schließlich diese Festschreibung auswählen (anstelle der Zusammenführung).

Vitaly Zdanevich
quelle
Es kann hilfreicher sein, wenn Sie dies näher erläutern.
MAChitgarha
-1

Wenn Sie dies erhalten, wenn Sie versuchen, einen anderen Zweig zu überprüfen:

my-mac:myGHProject ~$ git checkout other-branch
error: Your local changes to the following files would be overwritten by checkout:
    src/main/resources/reference.conf

Dies bedeutet, dass Sie einige Änderungen an dem Zweig vornehmen müssen, den Sie ausgecheckt haben - oder Sie müssen sie entweder löschen oder verstauen, wie die meisten der oben genannten Punkte zeigen. 19 von 20 Mal bin ich viel wahrscheinlicher, nur meine Änderungen zu übernehmen.

my-mac:myGHProject ~$ git branch
  * my-local-branch
  * develop    

my-mac:myGHProject ~$ git status
On branch my-local-branch
   Changes not staged for commit:
   (use "git add <file>..." to update what will be committed)
   (use "git checkout -- <file>..." to discard changes in working directory)
 modified:   src/main/resources/reference.conf

my-mac:myGHProject ~$ git add src/main/resources/reference.conf

my-mac:myGHProject ~$ git commit -m "updates on some config"
  [my-local-branch] updates on some config
  1 file changed, 131 insertions(+), 85 deletions(-)

Nachdem Sie dies getan haben, können Sie den anderen Zweig überprüfen und ganz einfach hin und her wechseln.

my-mac:myGHProject ~$ git checkout other-branch

my-mac:myGHProject ~$ git status
  On branch other-branch

my-mac:myGHProject ~$ git checkout my-local-branch
  Switched to branch 'my-local-branch'

Stellen Sie einfach sicher, dass Sie sich beide im rechten Zweig befinden und zum rechten Zweig pushen, wenn Sie Ihren Befehl git push origin $ {branch} ausführen. Hinweis: Wenn Sie Ihr Projekt direkt in Intellij eingebunden haben, können Sie sehen, dass Sie Ihren Zweig in der unteren rechten Ecke des Hauptfensters geändert haben.

Tony Fraser
quelle