2017-11-24 4 views
0

ich die folgende Sequenz von Kommandos ausführen:Warum sind Änderungen in einem Zweig in einem anderen Zweig sichtbar?

git init rep 
cd rep/ 
echo '111' > 1.txt 
git add 1.txt 
git commit -m '1' 
git checkout -b dev 
echo '222' > 1.txt 
git checkout master 
more 1.txt 

Als Ergebnis dieser Befehle I

sehen
222 

Und ich verstehe nicht, warum. Wie Sie sehen können, erstelle ich und gehe in den Zweig 'dev'. Ich mache dort einige Änderungen, aber ich füge sie nicht hinzu und begehe sie nicht. Warum sehe ich nach dem Wechsel von "dev" zu "master" die Veränderungen, die ich in "dev" gemacht habe? Sollten sie nicht im Entwickler bleiben, bis ich sie addiere, begehe und sie wieder zum Meister zusammenführe?

+0

Änderungen werden im Arbeitsbaum vorgenommen. 'git add' bringt die Änderungen in den Index. 'git commit' erstellt eine Momentaufnahme aller im Index hinterlegten Dateien als Commit. Ein Zweig ist ein Verweis, der auf ein Commit verweist. In Ihrem Fall befinden sich die Änderungen immer noch im Arbeitsbaum. Der Zweig kennt sie noch nicht. – ElpieKay

Antwort

0

Dies liegt daran, dass Sie Ihre Änderungen nicht an Branch Dev übergeben haben. Daher sind die nicht festgeschriebenen Änderungen noch nicht an einen übergeordneten Commit gebunden.

Do

git checkout dev 
git add . 
git commit -m "changed 1.txt" 

Wenn Sie die Änderungen entfernen möchten tun

git reset --hard master 

EDIT

Der Entwickler und Master-Zweig verweisen auf den gleichen Hash begehen. Schauen Sie in den Ordner .git/refs/heads, dort werden die Zweige in separaten Dateien gespeichert. Der Inhalt ist der Commit-Hash, auf den der jeweilige Zweig verweist. Die Verzweigung ist also einfach ein Zeiger auf ein Commit.

In Ihrem speziellen Fall, wenn Sie Master oder dev auschecken, zeigen beide auf den gleichen Commit, und daher ändert die Operation den Arbeitsbaum nicht. Sonst würden Sie einen Fehler erhalten. Probieren Sie etwas auf dem dev Zweig ändert sich jetzt, dann sollten Sie eine Fehlermeldung erhalten, wenn git checkout master

+0

Ihre Anweisungen funktionierten gut. Jetzt haben die zwei Zweige verschiedene Versionen der Datei und Änderungen, die im Zweig "dev" gemacht wurden, sind im Master nicht sichtbar (wie ich es erwartet und erwartet habe). Ich verstehe jedoch immer noch nicht, warum die Änderungen, die ich in "dev" gemacht habe, zu "master" migriert sind. Sollen nicht begangene Änderungen nicht verschwinden oder in der ursprünglichen Branche bleiben? – Roman

+0

@Roman Ich habe meine Frage bearbeitet, um deine Frage zu beantworten – smerlung

1
git checkout -b dev 
echo '222' > 1.txt 
git checkout master 

Die Änderungen, die Sie auf der 1.txt Datei betrieben in den obigen Zeilen sind nicht auf einem Zweig, weil sie nicht begangen wurden (sie waren nicht sogar zum Index hinzugefügt).

Ein Git-Zweig ist nur ein Zeiger auf ein Commit. Wenn Sie den Zweig von dev zu master änderten, änderten Sie tatsächlich das aktuell ausgecheckte Festschreiben nicht. Aus diesem Grund musste Git den Index oder den Inhalt von 1.txt im Arbeitsbaum nicht aktualisieren.

0

Alle nicht aufgezeichneten Dateien werden nicht beeinflusst, wenn Sie zwischen verschiedenen Zweigen wechseln. Da sie zu Ihrem Dateisystem gehören und GIT nicht weiß, zu welchem ​​Zweig diese Dateien gehören. Wenn Sie also diese Dateien festschreiben, weiß GIT, welche Dateien zu welcher Branche gehören. Und kann Dateien im Arbeitsbereich basierend auf Ihrer Zweigstelle entfernen oder hinzufügen.

Verwandte Themen