/ / „Git rm - cached x” vs „git reset head - x”? - git, git-reset, git-index, git-rm

"Git rm --cached x" vs "git reset head - x"? - git, git-reset, git-index, git-rm

GitRef.org - Podstawowy:

git rm usunie wpisy z miejsce postoju. To jest trochę inne od git reset HEAD które „odsłaniają” akta. Przez „scenę” rozumiem, że się cofa miejsce postoju do tego, co tam było zanim zaczęliśmy modyfikować. git rm z drugiej strony po prostu kopie plik całkowicie poza sceną, więc że nie jest to uwzględnione w następnym zatwierdzić migawkę, a tym samym skutecznie usuwając to.

Domyślnie a git rm file całkowicie usunie plik z obszaru przejściowego, a także z dysku> (katalog roboczy). Aby pozostawić plik w katalogu roboczym, możesz użyć git rm --cached.

Ale czym dokładnie jest różnica git rm --cached asd i git reset head -- asd?

Odpowiedzi:

168 za odpowiedź nr 1

Są trzy miejsca, w których plik może, na przykład, być - drzewo, indeks i kopia robocza. Po prostu dodajesz plik do folderu, dodajesz go do kopii roboczej.

Kiedy robisz coś takiego git add file dodajesz go do indeksu. A kiedy go popełniasz, dodajesz go również do drzewa.

Prawdopodobnie pomoże ci poznać trzy bardziej powszechne flagi w git reset:

git reset [-<mode>] [<commit>]

Ten formularz resetuje bieżącą gałąź do <commit> i ewentualnie aktualizuje indeks (resetując go do drzewa <commit>) i drzewo robocze w zależności od <mode>, który musi być jednym z następujący:
--miękki

W ogóle nie dotyka pliku indeksu ani drzewa roboczego (lecz resetuje się głowa do <commit>, podobnie jak wszystkie tryby). To pozostawia wszystko zmieniono pliki „Zmiany do zatwierdzenia”, jak ująłby to status git.

--mieszany

Resetuje indeks, ale nie działające drzewo (tj. Zmienione pliki są zachowane, ale nie są oznaczone do zatwierdzenia) i zgłasza to, czego nie było zaktualizowane. To jest akcja domyślna.

--ciężko

Resetuje indeks i działające drzewo. Wszelkie zmiany w śledzonych plikach w działające drzewo od <commit> są odrzucane.

Teraz, kiedy robisz coś takiego git reset HEAD - tak naprawdę to robisz git reset HEAD --mixed i „zresetuje” indeks do stanu sprzed rozpoczęcia dodawania plików / dodawania modyfikacji do indeksu (przez git add ) W takim przypadku kopia robocza i indeks (lub przemieszczanie) były zsynchronizowane, ale HEAD i indeks zostały zsynchronizowane po zresetowaniu.

git rm z drugiej strony usuwa plik z katalogu roboczego i indeksu, a po zatwierdzeniu plik jest również usuwany z drzewa. git rm --cached usuwa jednak sam plik z indeksu i zachowuje go w kopii roboczej. To jest dokładne przeciwieństwo git add file W takim przypadku indeks jest inny niżHEAD i działające, w tym, że HEAD ma wcześniej zatwierdzoną wersję pliku, kopia robocza miała modyfikację lasu, jeśli jakakolwiek lub zawartość HEAD pliku, a plik został usunięty z indeksu. Zatwierdzenie teraz zsynchronizuje indeks i drzewo, a plik zostanie usunięty.


63 dla odpowiedzi № 2

Być może przykład pomoże:

git rm --cached asd
git commit -m "the file asd is gone from the repository"

w porównaniu

git reset HEAD -- asd
git commit -m "the file asd remains in the repository"

Pamiętaj, że jeśli niczego nie zmieniłeś jeszcze, drugie zatwierdzenie nic nie zrobi.


28 dla odpowiedzi nr 3

git rm --cached file będzie usunąć plik ze sceny. Oznacza to, że po zatwierdzeniu plik zostanie usunięty. git reset HEAD -- file po prostu zresetuje plik w obszarze przemieszczania dookreśl, gdzie było w zatwierdzeniu HEAD, tzn. cofnie wszelkie zmiany, które wprowadziłeś od czasu ostatniego zatwierdzenia. Jeśli ta zmiana zdarzy się podczas dodawania pliku, będą one równoważne.