2015-02-19 31 views
6

BackroundGit squash zobowiązuje plików (przemianowany historii zachować)

Witam, pracuję na lokalnym oddziale funkcji. Ten lokalny oddział jest popsuty wieloma drobnymi zobowiązaniami. Zanim odepchnę gałąź do pilota, chciałbym wszystko uporządkować.

Do tego chciałbym zrobić interaktywnie rebase:

git rebase -i 

Nie ma problemu do tej pory.

Problem

Teraz tutaj jest trudna część: Podczas rozwoju funkcji Zrobiłem kilka refaktoryzacji tym zmienia nazwę i ruchy plików. Dzieje przemianowany plików są dostępne, z powodu zmiany nazwy im:

git -mv 

Ale kiedy Squash zobowiązuje przed i po rename-popełnia historia znika i git zawiadamia zmiany jak delecji i dodanie pliku.

Na czym polega problem?

Jak mogę zgrupować zatwierdzenia, w tym zmienić nazwę bez utraty historii plików?

Odpowiedz

1

Git nie śledzi bezpośrednio nazw plików, porównuje zawartość plików i wykrywa nazwy według podobieństwa.

Po przyciśnięciu historii wszystkie zmiany pliku zostają zapisane w jednym zatwierdzeniu. Plik może wtedy znacznie się zmienić w porównaniu do poprzedniego zatwierdzenia. W związku z tym nie jest bardzo podobny do poprzedniego zatwierdzenia, a git uważa, że ​​jest to delete/add.

Jeśli chcesz zobaczyć historię takiego pliku, musisz wyregulować próg find-renames. Na przykład. do 50% podobieństwa dyspozycji są również

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

podobne opcje dla diff, merge i rebase. Spójrz w Dokumentach

git rebase

zmiany nazwy bezprogowy = N sterowania próg podobieństwo do wykrywania zmiany nazwy. Zobacz także git-diff 1 -M.

git diff

--find-zmienia nazwę [= n]

Wykrywanie Zmienia nazwę. Jeśli podano n, jest to próg indeksu podobieństwa (to jest liczba dodawania/usuwania w porównaniu do rozmiaru pliku). Na przykład -M90% oznacza, że ​​Git powinien rozważyć zmianę typu delete/add, aby zmienić nazwę, jeśli ponad 90% pliku nie uległo zmianie. Bez znaku%, liczba powinna być odczytywana jako ułamek, z kropką dziesiętną przed nim. To znaczy.-M5 staje się 0,5, a więc jest taki sam jak -M50%. Podobnie -M05 jest taki sam jak -M5%. Aby ograniczyć wykrywanie do dokładnych nazw, użyj -M100%. Domyślny indeks podobieństwa to 50%.

+0

Dzięki za odpowiedź. Zmienianie nazw plików za pomocą 'git mv' tak naprawdę nie mówi git, aby zachować historię pliku, zamiast tego zmienia nazwę pliku, a później automatycznie wykrywa, że ​​plik został zmieniony? Innymi słowy: nie ma możliwości zrobienia tego, co chciałem? Jedyną możliwością jest zmiana nazwy w oddzielnym zatwierdzeniu. – RamNow