Software Engineering for Smart Data Analytics & Smart Data Analytics for Software Engineering
Git verwaltet Dateien im Repository und Index anhand ihres SHA1-Hash-Wertes, nicht anhand ihres Namens (siehe http://git-scm.com/book/en/v2/Git-Internals-Git-Objects und http://www-cs-students.stanford.edu/~blynn/gitmagic/ch08.html).
Aus der Tatsache, dass die Dateien im Arbeitsbereich hingegen nach Namen organisiert sind ergeben sich beim Arbeiten mit git gelegentlich irritierende Effekte, insbesondere in Zusammenhang mit Datei-Umbenennungen. Die aufzuklären ist das Ziel dieser Seite.
Wenn ich eine Datei außerhalb von Git umbenenne zeigt SmartGit mir anschließend folgendes:
Ich bekomme die Löschung der alten Datei und das Hinzufügen einer noch nicht im Repository vorhandenen Datei angezeigt. Das mag verwirren, da sich ja der Inhalt der Datei und somit der SHA1-Hash nicht verändert hat.
Die Erklärung ist, dass Git für neue Dateien im Arbeitsbereich keinen SHA1 hash Wert berechnet und somit
die beiden Dateien nicht zuordnen kann. Dass das tatsächlich von Git kommt und nicht nur ein Fehler der visuellen Anzeige in SmartGit, lässt sich überprüfen indem man +eine Git-Bash Shell öffnet| In SmartGit geht sehr leicht indem sie aus dem Kontextmenu des Repositories den entsprechenden Befehl auswählen.++
und darin das “git status
”-Kommando absetzt:
Um GIt mittzuteilen, dass sowohl die (scheinbare) Löschung als auch die (scheinbare) Änderung aus dem Workspace ins Repository übernommen werden soll müssen beide Änderungen ge-staged werden. Das geht in SmartGit mit dem “Stage”-Kommando im Kontextmenu der beiden Dateien. Auf der Git Kommandozeile geht es
mit “git add <Datei>
” und “git rm <datei>
”.
Nun werden zur Übernahme / Löschung der Dateien ihre SHA1-Hashes berechnet, denn sonst könnte Git sie ja nicht den Dateien im Repository zuordnen. Somit ist plötzlich erkennbar, dass es sich nur um eine Umbenennung handelt, denn nun “sieht” Git, dass die scheinbar gelöschte und die scheinbar hinzugefügte Datei den gleichen Hash-Wert hat.
In SmartGit ist das leider nicht so klar erkennbar, dafür um so klarer auf der Kommandozeile:
Da ab jetzt die Hashes verfügbar sind, werden sie bei allen weiteren Operationen genutzt. Somit kann auch ein Abgleich der lokalen Umbenennung mit einem Pull von woanders problemlos stattfinden. DIe Umbenennung wird erkannt.