Mehrmals bin ich auf die Aussage gestoßen, dass Git sie verfolgen kann, wenn Sie eine einzelne Funktion von einer Datei in eine andere verschieben. In diesem Eintrag heißt es beispielsweise : "Linus sagt, wenn Sie eine Funktion von einer Datei in eine andere verschieben, zeigt Git Ihnen den Verlauf dieser einzelnen Funktion während der Verschiebung an."
Aber ich bin mir ein bisschen bewusst, was Git unter der Haube zu bieten hat, und ich sehe nicht, wie das möglich ist. Ich frage mich also ... ist das eine korrekte Aussage? Und wenn ja, wie ist das möglich?
Mein Verständnis ist, dass Git den Inhalt jeder Datei als Blob speichert und jeder Blob eine global eindeutige Identität hat, die sich aus dem SHA-Hash seines Inhalts und seiner Größe ergibt. Git repräsentiert dann Ordner als Bäume. Alle Dateinameninformationen gehören zum Baum, nicht zum Blob, sodass eine Umbenennung einer Datei beispielsweise als Änderung eines Baums und nicht eines Blobs angezeigt wird.
Wenn ich also eine Datei namens "foo" mit 20 Funktionen und eine Datei namens "bar" mit 5 Funktionen habe und eine der Funktionen von foo in bar verschiebe (was 19 bzw. 6 ergibt), Wie kann Git erkennen, dass ich diese Funktion von einer Datei in eine andere verschoben habe?
Nach meinem Verständnis würde dies dazu führen, dass 2 neue Blobs existieren (einer für den modifizierten foo und einer für den modifizierten Balken). Mir ist klar, dass ein Unterschied berechnet werden kann, um zu zeigen, dass die Funktion von einer Datei in die andere verschoben wurde. Aber ich sehe nicht, wie der Verlauf der Funktion möglicherweise mit bar anstelle von foo in Verbindung gebracht werden könnte (jedenfalls nicht automatisch).
Wenn Git tatsächlich in einzelne Dateien schauen und einen Blob pro Funktion berechnen würde (was verrückt / unmöglich wäre, weil man wissen müsste, wie man eine mögliche Sprache analysiert), könnte ich sehen, wie dies möglich sein könnte.
Also ... ist die Aussage richtig oder nicht? Und wenn es richtig ist, was fehlt dann in meinem Verständnis?