2013-04-19 8 views
26

Ich lerne gerade Git, durch ein Tutorial gehen. Ich bin in der Filiale seo_title und ich habe nicht festgeschriebene Änderungen an der Datei mission.html. Ich habe git checkout master die Warnung über Änderungen erhalten erwarten nicht inszeniert für begehen, fügte keine Änderungen, etc, aber anstatt es ging voran und schaltet Zweige mit der Meldung:Git erlaubt mir, Filialen zu wechseln, ohne Änderungen zu machen

M  mission.html 
Switched to branch 'master' 

Dann, wenn ich git diff mission.html tat es mir gezeigt, dass die Arbeitsverzeichnis enthält noch die Änderungen, die ich gemacht habe, während ich den anderen Zweig ausgecheckt hatte. Was fehlt mir? Für was es wert ist, verwende ich Git Bash unter Windows.

BEARBEITEN: die Änderungen an mission.html wurden auch nicht zum Staging-Index hinzugefügt.

BEARBEITEN 2: Ich dachte, dass die oben gewählte Antwort richtig war, aber bei weiterer Untersuchung stimmt es nicht mit dem Verhalten überein, das ich sehe. Hier ist eine vollständigere Beschreibung von dem, was ich tue:

top_directory(master) > git branch new_branch_1 
top_directory(master) > git branch new_branch_2 
top_directory(master) > git checkout new_branch_1 

(offene Notizblock ++ und ändern resources.html, speichern)

top_directory(master) > git status 
# On branch new_branch_1 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed 
# (use "git checkout -- <file>..." to discard changes in wo 
# 
#  modified: resources.html 
# 
no changes added to commit (use "git add" and/or "git commit 
top_directory(new_branch_1) > git checkout new_branch_2 

Dies ist, wo ich git erwarten, dass ich zu widersprechen und sagen, beiseite zu schaffen oder begehen seit new_branch_1 und new_branch_2 verschiedene Versionen von resources.html haben, aber es schaltet nur auf den neuen Zweig ohne eine Warnung und es bringt die unbestätigten Änderungen an:

M  resources.html 
Switched to branch 'new_branch_2' 
top_directory(new_branch_2) > git status 
# On branch new_branch_2 
# 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: resources.html 
# 
no changes added to commit (use "git add" and/or "git commit -a") 

gibt es ein mod Oder eine Einstellung, die dazu führt, dass sie sich so verhält, anstatt zu warnen? Oder verstehe ich das Szenario noch immer falsch?

EDIT 3: Ich verstehe es jetzt. Die bestbewertete Antwort war richtig, siehe meinen letzten Kommentar zu dieser Antwort.

+0

Was ist die Frage? Ja, git erlaubt es, andere Zweige zu prüfen. Das ist sehr nützlich. Wenn Sie versehentlich die Datei aus dem falschen Zweig bearbeitet haben, können Sie den korrekten Zweig auschecken und dort committen. – balki

+3

Die Sache, über die ich verwirrt bin, ist: Ich dachte, Checkout würde versuchen, das Arbeitsverzeichnis auf den neuen Zweig zu aktualisieren, und wenn es nicht festgeschriebene Änderungen finden würde (die beim Aktualisieren des Arbeitsverzeichnisses verloren gehen würden), würde es den Checkout abbrechen . Zumindest ist es das, was das Tutorial in einer früheren Lektion (und ich habe es gesehen) gezeigt hat. – burgerB

+0

Das liegt wahrscheinlich daran, dass Sie nach dem Master-Zweig keine Commits haben. Daher zeigen alle Ihre Zweige auf dasselbe Commit-Objekt. Wenn Sie aus einem anderen Zweig auschecken, checken Sie tatsächlich aus demselben Commit mit der aktuellen Verzweigung aus. – nn0p

Antwort

33

Das unterschiedliche Verhalten, das Sie bei der letzten Änderung der Verzweigungen mit lokalen Änderungen festgestellt haben, liegt nun an unterschiedlichen Dateiänderungen.

Also sagen wir, wir haben einen Zweig namens "readme", wo Sie einige Änderungen an einer Datei vorgenommen haben, sagen wir README.md.

Nun haben Sie wieder zum Master gewechselt. Sie arbeiten an anderen Dateien (nicht an README.md). Jetzt haben Sie lokale Änderungen. Wenn Sie versuchen, in den 'readme'-Zweig zurückzukehren, ohne Ihre Änderungen zu übernehmen, wird es Ihnen überlassen. Warum? Da der Wechsel zum 'readme'-Zweig keine lokalen Änderungen überschreibt.

Wenn Sie jedoch eine Änderung an der README vornehmen.md-Datei auf dem Master-Zweig, dann, wenn Sie versuchen, eine

git checkout readme 

zu tun, werden Sie

error: Your local changes to the following files would be overwritten by checkout: README.md 
Please, commit your changes or stash them before you can switch branches. 

begegnen, weil Sie Änderungen an README.md haben, die eine Zusammenführung erfordern würde.

+1

[this] (http://stackoverflow.com/a/12044758/1048479) könnte ebenfalls hilfreich sein. –

+0

Was du beschreibst ist was ich erwarte, aber nicht was ich sehe. Ich füge weitere Beschreibung in der Frage – burgerB

+0

Nevermind hinzu. Ich lese noch einmal und jetzt macht es Sinn. Jetzt denke ich darüber nach: Diese Warnung ist wie eine Konfliktwarnung während der Zusammenführung, außer dass sie auftritt, wenn Sie Änderungen in Ihrer Zweigstelle nicht festgeschrieben haben und wenn Sie Zweige wechseln, nicht festschreiben. Wenn ein Commit-Merge keinen Konflikt erzeugen würde, können Sie die Zweige wechseln, ohne das Commit durchzuführen. – burgerB

0

Git - the stupid content tracker. Es funktioniert nur mit funktionierenden Baumschnappschüssen. Die Hauptanforderung - Sie sollten in der Lage sein, Arbeitsbaum zu rekonstruieren. Es aktualisiert sich natürlich. Aber wenn die modifizierte Datei in beiden Zweigen gleich ist - warum nicht umschalten? Wenn Sie es aus Versehen tun, können Sie den vorherigen Zustand wiederherstellen, keine große Sache. Aber wenn die Datei in den Zweigen unterschiedlich ist, müssen Sie Inhalte zusammenführen, deshalb besteht sie darauf, Änderungen zu bestätigen, sonst ist es unmöglich, zurückzugehen.

2

Mit Git können Sie andere Zweige (oder Tags oder SHA1-Hashes) prüfen, solange der Commit, den Sie ändern, Ihren Arbeitsbaum in NOT überarbeiten Sie Ihre lokalen nicht festgeschriebenen Änderungen.

In Ihrem Fall hätte die Zweigstelle master die gleiche Version von missing.html, wie sie derzeit in der Spitze Ihrer aktuellen Zweigstelle existiert, von der Sie gewechselt haben. Git muss die Arbeitskopie nicht berühren (zumindest für missing.html), wenn Sie Zweige hier ändern, und Sie können Ihre lokalen Änderungen beibehalten.

Wenn Sie in der Tat zu checkout versucht, einen Commit, wo eine andere Version von missing.html in der Arbeit Baum war (als die in Ihrem aktuellen Zweig begangen), würde git eine Fehlermeldung ähnlich wie diese zeigen:

$ git checkout some-other-branch 
error: Your local changes to the following files would be overwritten by checkout: 
     missing.html 
Please, commit your changes or stash them before you can switch branches. 
Aborting 
12

Dies ist das normale Verhalten. Wenn Sie die geänderten Dateien nicht in Ihrem neu ausgecheckten Zweig speichern möchten, speichern Sie sie. So was.

# on branch dev 
$ git stash 
$ git checkout master 

# do stuff on master 

# back to dev 
$ git checkout dev 
$ git stash pop 
0

liegt auf der Hand, wenn Sie eine Datei ändern, die nicht in der Filiale in zur Kasse wollen geändert wird, weil die syntaktische der Kasse alle den Index zu bringen ist und das Arbeitsverzeichnis zu Ihrem neuen Zweig, werden Sie Lassen Sie sie in Ihrem neuen Zweig erscheinen. Wenn es Konflikte gibt, besteht die Gefahr, dass Sie diese Dateien zusammenführen müssen. Wenn Sie also nach der Zusammenführung in Ihre alte Zweigstelle zurückkehren, ist es bereits die zusammengeführte Version und nicht die vorherige. Um sicherzustellen, dass Sie die alte Änderung beibehalten, wird es Ihnen das nicht erlauben.

Verwandte Themen