Wie genau funktioniert Git?
Morgen,
wie funktioniert git eigentlich? Ich meine damit nicht, wie man es nutzt oder wofür, sondern ich rede hauptsächlich von den Branches. Ich nutze momentan git in der Konsole also lokal und da frage ich mich, wie genau jtz git weiß, welche Dateien in einem Branch sind. Ich hab bei meinem aktuellem Projekt den .git Ordner geguckt und dort ist eigentlich nichts, was auf eine Kopie von dem Projekt sich rückschließen lässt.
Auch wenn ich in vscodium den Branch wechsle geschieht das sofort. Wie stellt git das an?
2 Antworten
Erst mal wie funktionieren Änderungen in Git.
Bei jedem Commit werden die neuen Versionen der Dateien und der Verzeichnisstruktur gespeichert. Das praktische ist, durch Komprimierung belegen diese geänderten Versionen am Ende nur so viel Speicherplatz wie für die Änderungen bennötigt wird. Das sind die Blob und Tree Objekte, die einen meistens nicht interessieren.
Ein Commit zeigt jetzt auf einen bestimmten Stand des Repositories, also die oben erwähnten Tree und Blob Objekte, und zusätzlich noch die Commit Message, auf welchem Commit (oder bei einem Merge; auf welchen Commits) sie basieren und ähnliche Metadaten. So bekommst du eine Kette an Commits die deinen Änderungsverlauf darstellt.
Ein Branch in Git ist eigentlich jetzt super simpel, es ist einfach - mehr oder weniger - die Information auf welchem Commit der Branch gerade ist. Der ganze Rest mit der Änderungshistorie steckt in der Kette der Commits.
Das heißt, wenn du jetzt den Branch wechselst, dann muss git sich einfach nur den Commit suchen auf den der Branch zeigt, über den Commit holt es sich die Version von dem Repository die es zu dem Zeitpunkt des Commits hat und aktualisiert dann das Dateisystem in dem sich eben deine aktuelle Kopie befindet an der du arbeitest.
Durch die intelligente Verwendung von Komprimierung und dadurch, dass ein Branch einfach nur die Information darstellt auf welchem Commit er gerade ist geht der branch wechsel sehr schnell. Deswegen ist es auch so schnell einen branch zu löschen oder zu erstellen. Der branch selber enthält kaum Information, die ganzen Änderungen stecken in der Kette der Commits und eben die Daten in den Tree und Blob Objekten.
Ich hab bei meinem aktuellem Projekt den .git Ordner geguckt und dort ist eigentlich nichts, was auf eine Kopie von dem Projekt sich rückschließen lässt.
Der git Ordner enthält eine komprimierte Kopie aller Dateien (bzw. Unterschiede).
Branches sind wie Zweige, d. h. enthalten andere Änderungen und können mithilfe von merge wieder zusammengeführt werden.
Wenn der Branch gewechselt wird, werden alle Änderungen im .git-Ordner, die zum Branch gehören ausgecheckt und angewandt.
ah, also werden dann die Dateien ansich nicht ersetzt, sondern deren Inhalt wird geändert (und natürlich Dateien die es vorher nicht gab werden wieder eingefügt/gelöscht). Ich muss sagen, dass ich von sowas doch eher fasziniert bin haha. Danke für die Erklärung!