Z tego, co rozumiem, Git tak naprawdę nie musi śledzić operacji zmiany nazwy pliku / przenoszenia / kopiowania, więc jaki jest prawdziwy cel git mv ? Strona podręcznika nie jest specjalnie opisowa ...
Czy to jest przestarzałe? Czy to polecenie wewnętrzne, które nie jest przeznaczone dla zwykłych użytkowników?
mv oldname newname; git add newname; git rm oldname
, również się nie powiedziegit mv oldname newname
(zobacz tę odpowiedź ).git mv
różni się nieco od tegomv oldname newname; git add newname; git rm oldname
, że jeśli dokonałeś zmian w pliku przedgit mv
jego wprowadzeniem, zmiany te nie zostaną wprowadzone do czasu, aż pojawigit add
się nowy plik.Z oficjalnego GitFaq :
źródło
git mv
podejściem ręcznym? To nie jest oczywiste zgit help mv
.Git próbuje zgadnąć, co próbujesz zrobić. Dokłada wszelkich starań, aby zachować nieprzerwaną historię. Oczywiście nie jest idealny. Dzięki
git mv
temu możesz wyrazić swoją intencję i uniknąć błędów.Rozważ ten przykład. Zaczynając od pustego repozytorium,
Wynik:
Autodetekcja nie powiodła się :( A może to?
i wtedy
Teraz spróbuj zamiast tego (pamiętaj, aby usunąć
.git
folder podczas eksperymentowania):Na razie w porządku:
Teraz nikt nie jest idealny:
Naprawdę? Ale oczywiście...
... a wynik jest taki sam jak powyżej:
--follow
pokazuje tylko pełną historię.Teraz zachowaj ostrożność przy zmianie nazwy, ponieważ każda z opcji może nadal wywoływać dziwne efekty . Przykład:
Porównaj to z:
Wynik:
Ups ... Teraz historia wraca do początkowej a zamiast początkowej b , co jest złe. Więc kiedy wykonaliśmy dwa ruchy na raz, Git był zdezorientowany i nie śledził poprawnie zmian. Nawiasem mówiąc, w moich eksperymentach to samo stało się, gdy usunąłem / utworzyłem pliki zamiast ich używać
git mv
. Postępuj ostrożnie; Zostałeś ostrzeżony...źródło
Jak mówi @Charles,
git mv
jest to skrót.Prawdziwe pytanie brzmi: „Inne systemy kontroli wersji (np. Subversion i Perforce) traktują specjalnie nazwy plików. Dlaczego Git?”
Linus wyjaśnia na http://permalink.gmane.org/gmane.comp.version-control.git/217 charakterystycznym taktem:
źródło
Jest jeszcze jedno zastosowanie, którego
git mv
nie wspomniałem powyżej.Od czasu odkrycia
git add -p
(tryb łatki git add; patrz http://git-scm.com/docs/git-add ), lubię go używać do sprawdzania zmian podczas dodawania ich do indeksu. Tak więc mój przepływ pracy staje się (1) pracą nad kodem, (2) przeglądaniem i dodawaniem do indeksu, (3) zatwierdzaniem.Jak
git mv
pasuje? Jeśli przenosisz plik bezpośrednio, wtedy używającgit rm
igit add
, wszystkie zmiany zostaną dodane do indeksu, a użycie git diff do przeglądania zmian jest mniej łatwe (przed zatwierdzeniem).git mv
Jednak użycie dodaje nową ścieżkę do indeksu, ale nie wprowadza zmian w pliku, co pozwalagit diff
igit add -p
działa jak zwykle.źródło
Istnieje niszowy przypadek, w którym
git mv
pozostaje bardzo przydatny: gdy chcesz zmienić obudowę nazwy pliku w systemie plików bez rozróżniania wielkości liter. Zarówno APFS (Mac), jak i NTFS (Windows) domyślnie nie rozróżniają wielkości liter (ale zachowują wielkość liter).greg.kindel wspomina o tym w komentarzu do odpowiedzi CB Baileya.
Załóżmy, że pracujesz na komputerze Mac i masz plik
Mytest.txt
zarządzany przez git. Chcesz zmienić nazwę pliku naMyTest.txt
.Możesz spróbować:
O jej. Git nie potwierdza, że doszło do jakichkolwiek zmian w pliku.
Państwo mogłoby obejść się przez zmianę nazwy pliku całkowicie następnie zmieniając jego nazwę z powrotem:
Hurra!
Lub możesz zaoszczędzić sobie tyle trudu, używając
git mv
:źródło