"git RM --cached x "vs"Git reset head - x"?
git rm
usunie wpisy z miejsce postoju. To jest trochę inne fromgit reset HEAD
which " unstages" pliki. Przez "unstage" mam na myśli, że powraca miejsce postoju do tego, co tam było zanim zaczęliśmy coś modyfikować.git rm
z drugiej strony po prostu kopie plik w całości ze sceny, więc że nie jest zawarte w następnym Zatwierdź migawkę, a tym samym skutecznie usuwam.Domyślnie, a
git rm file
usunie Plik z miejsca postoju w całości, a także z dysku > (katalogu roboczego). Aby pozostawić plik w katalogu roboczym, możesz użyćgit rm --cached
.
Ale jaka dokładnie jest różnica między git rm --cached asd
a git reset head -- asd
?
3 answers
Są trzy miejsca, gdzie plik, powiedzmy, może być-drzewo, indeks i kopia robocza. Gdy po prostu dodajesz plik do folderu, dodajesz go do kopii roboczej.
Kiedy robisz coś takiego jak git add file
dodajesz to do indeksu. A kiedy je popełniasz, dodajesz je również do drzewa.
Prawdopodobnie pomoże Ci poznać trzy bardziej popularne flagi w git reset:
Git reset [--
<mode>
] [<commit>
]Ten formularz resetuje obecny kierownik oddziału do
<commit>
i ewentualnie aktualizuje indeks (resetuje go do drzewa<commit>
) i drzewo robocze w zależności od<mode>
, które musi być jednym z po:
--softW ogóle nie dotyka pliku indeksu ani drzewa roboczego (ale resetuje głowa do
<commit>
, tak jak wszystkie tryby). To pozostawia wszystkie Twoje changed files "zmiany do zatwierdzenia" , jak to określiłby git status.--mieszane
Resetuje indeks, ale nie drzewo robocze (np. zmienione pliki są zachowane, ale nie oznaczone dla commit) i zgłasza to, co nie zostało aktualizacja. Jest to domyślna akcja.
--hard
Resetuje indeks i drzewo robocze. Wszelkie zmiany w śledzonych plikach w drzewa robocze od {[2] } są odrzucane.
Teraz, gdy zrobisz coś takiego git reset HEAD
- to, co robisz, jest git reset HEAD --mixed
i "zresetuje" indeks do stanu, który był przed tobą rozpoczęto dodawanie plików / dodawanie modyfikacji do indeksu (poprzez git add
) w tym przypadku kopia robocza i indeks (lub staging) były zsynchronizowane, ale po resecie nastąpiła synchronizacja głowicy i indeksu.
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 przechowuje go w kopii roboczej. Jest to dokładne przeciwieństwo git add file
w tym przypadku, wykonane indeks być różne od głowicy i pracy, w tym, że głowica ma wcześniej zatwierdzoną wersję pliku, kopia robocza miał modyfikację las, jeśli w ogóle lub zawartość z głowicy pliku i Usunięto plik z indeksu. Commit teraz zsynchronizuje indeks i drzewo, a plik zostanie usunięty.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-29 23:21:16
Być może przykład pomoże:
git rm --cached asd
git commit -m "the file asd is gone from the repository"
Kontra
git reset HEAD -- asd
git commit -m "the file asd remains in the repository"
Zauważ, że jeśli nic nie zmieniłeś else , drugi commit nic nie zrobi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-27 03:19:44
git rm --cached file
usunie Plik ze sceny. Oznacza to, że po zatwierdzeniu plik zostanie usunięty. git reset HEAD -- file
spowoduje po prostu zresetowanie pliku w obszarze przejściowym do stanu, w którym znajdował się commit główny, tzn. cofnie wszelkie zmiany, które zrobiłeś od ostatniego commitowania. Jeśli ta zmiana będzie nowym dodaniem pliku, to będą one równoważne.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-27 03:18:48