Przeczytałem, że zmieniając nazwę plików w git , powinieneś zatwierdzić wszelkie zmiany, zmienić nazwę, a następnie wprowadzić zmiany w pliku o zmienionej nazwie. Git rozpozna plik na podstawie zawartości, zamiast widzieć go jako nowy nieśledzony plik i zachowa historię zmian.
Jednak robiąc to właśnie tej nocy, w końcu powróciłem do git mv
.
> $ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
Zmień nazwę mojego arkusza stylów w Finderze z iphone.css
namobile.css
> $ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
# Changed but not updated:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# deleted: css/iphone.css
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# css/mobile.css
Więc git teraz myśli, że usunąłem jeden plik CSS i dodałem nowy. Nie to, czego chcę, cofnijmy zmianę nazwy i pozwól git wykonać pracę.
> $ git reset HEAD .
Unstaged changes after reset:
M css/iphone.css
M index.html
Z powrotem tam, gdzie zacząłem.
> $ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
Pozwala git mv
zamiast tego użyć .
> $ git mv css/iphone.css css/mobile.css
> $ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# renamed: css/iphone.css -> css/mobile.css
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: index.html
#
Wygląda na to, że jesteśmy dobrzy. Dlaczego więc nie rozpoznałem nazwy po raz pierwszy, kiedy korzystałem z Findera?
add+rm
lubmv
- daje ten sam wynik. Następnie Git wykrywa zmianę nazwy / kopii, aby poinformować cię, że była to zmiana nazwy. Źródło, które zacytowałeś, jest również niedokładne. Naprawdę nie ma znaczenia, czy modyfikujesz + zmieniasz nazwę w tym samym zatwierdzeniu, czy nie. Gdy zmienisz zarówno modyfikację, jak i zmianę nazwy, wykrywanie zmiany nazwy spowoduje, że będzie to zmiana nazwy + modyfikacja, lub jeśli modyfikacja jest całkowitym przepisem, będzie wyświetlana jako dodana i usunięta - nadal nie ma znaczenia, jak wykonałeś to.git mv old new
automatycznie aktualizuje indeks. Kiedy zmienisz nazwę poza Git, będziesz musiał zrobićgit add new
igit rm old
wprowadzić zmiany w indeksie. Po wykonaniu tej czynnościgit status
będzie działać zgodnie z oczekiwaniami.public_html
, które są śledzone w git. Po wykonaniugit add .
igit commit
nadal wyświetlał kilka „usuniętych” plików wgit status
. Wykonałemgit commit -a
a, usunięcie zostało zatwierdzone, ale teraz nie mam historii plików, które sąpublic_html
teraz w użyciu. Ten przepływ pracy nie jest tak płynny, jak bym chciał.Odpowiedzi:
Na
git mv
stronie podręcznika mówiTak więc najpierw musisz zaktualizować indeks samodzielnie (za pomocą
git add mobile.css
). Jednakgit status
nadal będą wyświetlać dwa różne plikiMożesz uzyskać inną wydajność, uruchamiając
git commit --dry-run -a
, co powoduje, że oczekujesz:Nie mogę powiedzieć dokładnie, dlaczego widzimy te różnice
git status
igit commit --dry-run -a
, ale o to wskazówka od Linusa :A
dry-run
używa prawdziwych mechanizmów zmiany nazwy, podczas gdygit status
prawdopodobnie nie.źródło
git add mobile.css
. Bez niegogit status -a
„zobaczyłby” jedynie usunięcie uprzednio śledzonegoiphone.css
pliku, ale nie dotknąłby nowego, nieśledzonegomobile.css
pliku. Ponadtogit status -a
jest nieprawidłowy w Git 1.7.0 i nowszych. „„ Git status ”nie jest już„ git commit --dry-run ”.” w kernel.org/pub/software/scm/git/docs/RelNotes-1.7.0.txt . Użyj,git commit --dry-run -a
jeśli chcesz tę funkcję. Jak powiedzieli inni, po prostu zaktualizuj indeks igit status
będzie działał zgodnie z oczekiwaniami PO.git commit
, plik nie zostanie zmieniony, a działające drzewo pozostanie takie samo.git commit -a
pokonuje prawie każdy aspekt modelu przepływu / myślenia git - każda zmiana jest zatwierdzona. co jeśli chcesz tylko zmienić nazwę pliku, ale zatwierdzić zmianyindex.html
w innym zatwierdzeniu?mobile.css
czym powinienem wspomnieć. Ale to jest sens mojej odpowiedzi: strona podręcznika mówi, żethe index is updated
kiedy używaszgit-mv
. Dzięki zastatus -a
wyjaśnienie, użyłem git 1.6.4git status
nie wykryłem zmiany nazwy. Uruchomieniegit commit -a --dry-run
po dodaniu moich „nowych” plików pokazało nazwy i wreszcie dało mi pewność, że dokonam zmian!git status
zachowuje się teraz jakgit commit
.Musisz dodać dwa zmodyfikowane pliki do indeksu, zanim git rozpozna go jako ruch.
Jedyna różnica między
mv old new
igit mv old new
polega na tym, że git mv dodaje również pliki do indeksu.mv old new
wtedy teżgit add -A
by działało.Pamiętaj, że nie możesz po prostu użyć,
git add .
ponieważ to nie dodaje usunięć do indeksu.Zobacz Różnica między „git add -A” i „git add”.
źródło
git add -A
link, bardzo przydatny, ponieważ szukałem takiego skrótu!git add .
ma dodać przeprowadzki do indeksu.Najlepiej jest spróbować samemu.
Teraz git status i git commit --dry-run -a pokazuje dwa różne wyniki, w których status git pokazuje bbb.txt jako nowy plik / aaa.txt jest usuwany, a polecenia --dry-run pokazują rzeczywistą zmianę nazwy.
Teraz idź i zrób odprawę.
Teraz możesz zobaczyć, że nazwa pliku faktycznie została zmieniona, a to, co jest wyświetlane w statusie git, jest nieprawidłowe.
Morał tej historii: jeśli nie masz pewności, czy nazwa pliku została zmieniona, wydaj „git commit --dry-run -a”. Jeśli pokazuje, że nazwa pliku została zmieniona, możesz zacząć.
źródło
W przypadku git 1.7.x działały dla mnie następujące polecenia:
Nie było potrzeby dodawania git, ponieważ oryginalny plik (tj. Css / mobile.css) był już wcześniej w zatwierdzonych plikach.
źródło
musisz przejść do
git add css/mobile.css
nowego plikugit rm css/iphone.css
, więc git o tym wie. wtedy pokaże to samo wyjście wgit status
widać to wyraźnie na wyjściu statusu (nowa nazwa pliku):
i (stara nazwa):
myślę, że za kulisami
git mv
jest tylko skrypt otoki, który robi dokładnie to: usuń plik z indeksu i dodaj go pod inną nazwąźródło
git rm css/iphone.css
bo myślałem, że to usunie istniejącą historię. Może nie rozumiem przepływu pracy w git.git rm
nie usunie historii. Usuwa tylko pozycję z indeksu, aby następne zatwierdzenie nie miało pozycji. Jednak nadal będzie istniał w starożytnych zobowiązaniach. Być może mylisz się, że (na przykład)git log -- new
zatrzymasz się w miejscu, w którym popełniłeśgit mv old new
. Jeśli chcesz śledzić zmiany nazw, użyjgit log --follow -- new
.Pomyślmy o twoich plikach z perspektywy git.
Twoje repozytorium ma (między innymi)
i jest pod kontrolą Git:
Przetestuj to za pomocą:
Kiedy to zrobisz
Z perspektywy Git
Git informuje więc o plikach, które już zna ( iphone.css ) i nowych plikach, które wykrywa ( mobile.css ), ale tylko wtedy, gdy pliki są w indeksie lub HEAD git zaczyna sprawdzać ich zawartość.
W tym momencie, ale ani „iphone.css usunięcie” ani mobile.css są na indeksie.
Dodaj usunięcie iphone.css do indeksu
git mówi dokładnie, co się stało: ( iphone.css jest usuwany. Nic więcej się nie wydarzyło)
następnie dodaj nowy plik mobile.css
Tym razem zarówno usunięcie, jak i nowy plik znajdują się w indeksie. Teraz git wykrywa, że kontekst jest taki sam i ujawnia go jako zmianę nazwy. W rzeczywistości, jeśli pliki są w 50% podobne, wykryje to jako zmianę nazwy, co pozwoli ci nieco zmienić mobile.css , zachowując operację jako zmianę nazwy.
Zobacz, że jest to powtarzalne w dniu
git diff
. Teraz, gdy Twoje pliki są w indeksie, musisz użyć--cached
. Edytuj trochę mobile.css , dodaj to do indeksu i zobacz różnicę między:i
-M
to opcja „wykryj nazwy” dlagit diff
.-M
oznacza-M50%
(50% lub więcej podobieństwa sprawi, że git wyrazi to jako zmianę nazwy), ale możesz zmniejszyć to do-M20%
(20%), jeśli dużo edytujesz mobile.css.źródło
Krok 1: Zmień nazwę pliku ze starego pliku na nowy plik
Krok 2: Zatwierdź i dodaj komentarze
Krok 3: przekaż tę zmianę zdalnemu serwerowi
źródło
git mv
nowy plik jest już w indeksie.Tam popełniłeś błąd.
Dopiero po dodaniu pliku git rozpozna go na podstawie zawartości.
źródło
Nie wystawiłeś wyników swojego ruchu w wyszukiwarce. Wierzę, że jeśli wykonałeś ruch za pomocą Findera, a następnie zrobiłeś to
git add css/mobile.css ; git rm css/iphone.css
, git obliczy skrót nowego pliku i dopiero wtedy zda sobie sprawę, że skróty plików pasują (a zatem jest to zmiana nazwy).źródło
W przypadkach, gdy naprawdę musisz ręcznie zmienić nazwę plików, na przykład. za pomocą skryptu, aby wsadowo zmienić nazwę wiązki plików, a następnie przy użyciu
git add -A .
pracował dla mnie.źródło
Dla użytkowników Xcode: jeśli zmienisz nazwę pliku w Xcode, ikona odznaki zmieni się na dołączoną. Jeśli wykonasz zatwierdzenie za pomocą XCode, faktycznie utworzysz nowy plik i stracisz historię.
Obejście jest łatwe, ale musisz to zrobić przed zatwierdzeniem przy użyciu Xcode:
przemianowano: Project / OldName.h -> Project / NewName.h przemianowano: Project / OldName.m -> Project / NewName.m
Następnie wróć do XCode, a zobaczysz, że znaczek zmienił się z A na M i zapisz się, aby zatwierdzić zmiany przy użyciu xcode teraz.
źródło