2015-02-19 22 views
6

BackroundGit Squash begeht die umbenannten Dateien (eine keep Geschichte)

Hallo, ich bin auf einem lokalen Funktionszweig arbeiten. Dieser lokale Zweig ist mit vielen kleinen Commits durcheinander gebracht. Bevor ich den Ast zur Fernbedienung dränge, möchte ich alles aufräumen.

dieses Denn ich ein interaktiv rebase tun würde:

git rebase -i 

Kein Problem bisher.

Problem

hier ist nun der schwierige Teil: Bei der Entwicklung der Funktion, die ich mehrere Refactorings getan haben, einschließlich und bewegt von Dateien umbenennt. Die Geschichte der umbenannten Dateien verfügbar sind, aufgrund Umbenennung sie mit:

git -mv 

Aber wenn ich zerquetschen Commits vor und nach dem Umbenennungs-begeht, ist die Geschichte gegangen und git meldet die Änderungen als Löschen und Hinzufügen einer Datei.

Was ist das Problem?

Wie kann ich Commits committen einschließlich umbenennen, ohne Datei Geschichte zu verlieren?

Antwort

1

Git verfolgt keine Umbenennungen direkt, es vergleicht Dateiinhalte und erkennt Umbenennungen nach Ähnlichkeit.

Wenn Sie einen Verlauf quetschen, werden alle Änderungen einer Datei in einem Commit gespeichert. Die Datei könnte sich dann im Vergleich zum vorherigen Commit stark ändern. Somit ist es dem vorherigen Commit nicht sehr ähnlich und git denkt, dass es ein delete/add ist. Wenn Sie den Verlauf einer solchen Datei anzeigen möchten, müssen Sie die find-renames Schwelle anpassen. Z.B. für Ähnlichkeit 50%

git log --follow --find-rename=50 -- someFile 

ähnliche Optionen auch für diff, merge und rebase zur Verfügung stehen verwenden. Werfen Sie einen Blick auf die Dokumentation:

git rebase

Umbenennungs-Schwelle = n Steuert die Ähnlichkeitsschwelle für Umbenennungserkennung verwendet. Siehe auch git-diff 1 -M.

git diff

--find-Umbenennungs [= n]

Umbenennungs erkennen. Wenn n angegeben ist, ist dies ein Schwellenwert für den Ähnlichkeitsindex (d. H. Menge an Hinzufügungen/Löschungen verglichen mit der Dateigröße). Beispiel: -M90% bedeutet, dass Git ein Lösch-/Hinzufügen-Paar als Umbenennung betrachten sollte, wenn mehr als 90% der Datei nicht geändert wurden. Ohne ein% -Zeichen soll die Zahl als Bruch gelesen werden, mit einem Dezimalpunkt davor. I.e., -M5 wird 0,5 und ist somit dasselbe wie -M50%. Ähnlich ist -M05 gleich wie -M5%. Um die Erkennung auf exakte Umbenennungen zu beschränken, verwenden Sie -M100%. Der Standardähnlichkeitsindex ist 50%.

+0

Danke für Ihre Antwort. Also, das Umbenennen von Dateien mit 'git mv' sagt git nicht, dass es den Verlauf einer Datei behalten soll, sondern benennt die Datei einfach um und erkennt später automatisch, dass die Datei umbenannt wurde? Mit anderen Worten: Es gibt keine Möglichkeit zu tun, was ich wollte? Die einzige Möglichkeit ist das Umbenennen in einem separaten Commit. – RamNow