Warum zeigt git meine Änderungen immer wieder an, wenn ich Zweige wechsle (geänderte, hinzugefügte, gelöschte Dateien), egal ob ich git add ausführe oder nicht?

115

Ich bin wirklich neu in Git und ich habe versucht zu verstehen, warum Git immer wieder anzeigt, was ich in einem Zweig in einem anderen Zweig geändert habe, wenn ich git checkout ausführe, um zwischen Zweigen zu wechseln. Zuerst habe ich versucht, git add nicht zu verwenden und es hat nicht funktioniert. Allerdings habe ich dann versucht, git add zu verwenden, aber das Problem nicht behoben. Ich verwende Git Commit noch nicht.

Das ist im Grunde das, was ich tue:

$ git clone <a_repository>  
$ git branch  
* master  
$ git branch testing  
$ git checkout testing  
...edit a file, add a new one, delete...  
$ git status  
    # On branch testing  
    # Changed but not updated:  
    #   (use "git add/rm <file>..." to update what will be committed)  
    #   (use "git checkout -- <file>..." to discard changes in working directory)  
    #  
    #       deleted:    file1.txt  
    #  
    # Untracked files:  
    #   (use "git add <file>..." to include in what will be committed)  
    #  
    #       file2.txt  
no changes added to commit (use "git add" and/or "git commit -a")  
$ git branch  
  master  
* testing  
$ git checkout master  
D       file1.txt  
Switched to branch 'master'  
$ git status  
    # On branch master  
    # Changed but not updated:  
    #   (use "git add/rm <file>..." to update what will be committed)  
    #   (use "git checkout -- <file>..." to discard changes in working directory)  
    #  
    #       deleted:    file1.txt  
    #  
    # Untracked files:  
    #   (use "git add <file>..." to include in what will be committed)  
    #  
    #       file2.txt  
no changes added to commit (use "git add" and/or "git commit -a")  

Ich dachte, dass bei der Verwendung von Zweigen alles, was Sie in einem Zweig tun, für alle anderen Zweige unsichtbar ist. Ist das nicht der Grund für die Schaffung von Filialen?

Ich habe versucht, "git add" zu verwenden, aber die Änderungen sind in beiden Zweigen sichtbar. Muss ich "git commit" ausführen, bevor ich zwischen Zweigen wechsle, um dies zu vermeiden?

JPZ
quelle

Antworten:

142

Das Wechseln von Zweigen bringt nicht festgeschriebene Änderungen mit sich. Entweder zuerst festschreiben, ausführen git checkout ., um sie rückgängig zu machen, oder git stashvor dem Umschalten ausführen . (Sie können Ihre Änderungen mit zurückbekommen git stash apply)

Sean Clark Hess
quelle
10
Git Stash Pop ist besser, es sei denn, Sie möchten einen riesigen Stapel Stashes aufbauen.
Siride
7
@JPZ: git stash befasst sich nur mit verfolgten Dateien; Neue Dateien werden nicht nachverfolgt, sodass sie nicht gespeichert werden.
Siride
2
@JPZ: Wenn Sie nicht verfolgte Dateien verstauen möchten, müssen Sie git adddiese vor dem Verstecken aufbewahren. Trotzdem bin ich mir nicht sicher, ob Sie sich hier tatsächlich verstecken möchten. Wenn Sie beabsichtigen, dass diese Änderungen Teil des Zweigs sind, von dem Sie wechseln, legen Sie sie fest. (Wenn Sie beabsichtigen, zu diesem Zweig zurückzukehren und mehr an den Änderungen zu arbeiten, bevor Sie sie festschreiben, ist dies stashmöglicherweise das richtige Werkzeug für den Job.)
Cascabel
16
"Das Wechseln von Filialen bringt unverbindliche Änderungen mit sich" - Dies ist sinnvoll und möglicherweise die schlechteste Designidee. Was bringt es, Niederlassungen zu haben, wenn Sie nicht isoliert arbeiten können? !!!
Nehem
1
In meinem Fall habe ich einen Feature-Zweig aus einem Entwicklungszweig. Ich habe mich im Feature-Zweig verpflichtet, aber es zeigt die Änderungen, wenn ich auch den Entwicklungszweig auschecke.
Hitesh Garg
31

Kurze Antwort: Ja, Sie müssen sich verpflichten. Stellen Sie jedoch sicher, dass Sie es auf dem richtigen Ast tun!

Ein Zweig ist ein Zeiger auf ein Commit. Wenn Sie mit einem ausgecheckten Zweig festschreiben, zeigt der Zweig auf diesen neuen Commit. Wenn Sie einen Zweig auschecken, überprüfen Sie das Commit, auf das er verweist. (Sie können sich Commits als Schnappschüsse Ihres Arbeitsbaums vorstellen.)

Wenn Sie also Änderungen haben, die Sie nicht festgeschrieben haben, werden diese durch den Zweigwechsel nicht beeinflusst. Wenn das Wechseln der Zweige nicht mit Ihren Änderungen kompatibel ist, git checkoutwird dies natürlich einfach abgelehnt.

git addist ein Befehl zum Bereitstellen von Änderungen, den Sie dann festschreiben. Diese Änderungen werden nicht im Verlauf des Repositorys aufgezeichnet. Es platziert sie einfach in einem Bereitstellungsbereich (dem Index); git commitVerwendet dann den Inhalt dieses Staging-Bereichs, um Commits zu erstellen.

Cascabel
quelle