Istnieją trzy miejsca, w których może znajdować się plik - powiedzmy, drzewo, indeks i kopia robocza. Kiedy dodajesz plik do folderu, dodajesz go do kopii roboczej.
Kiedy robisz coś takiego git add file
, dodajesz to do indeksu. A kiedy to zatwierdzasz, dodajesz to również do drzewa.
Prawdopodobnie pomoże ci to poznać trzy bardziej powszechne flagi w resetowaniu git:
reset git [- <mode>
] [ <commit>
]
Ten formularz resetuje nagłówek bieżącej gałęzi do <commit>
i prawdopodobnie aktualizuje indeks (resetując go do drzewa <commit>
) i drzewo robocze w zależności od tego <mode>
, które musi być jednym z następujących:
--soft
W ogóle nie dotyka pliku indeksu ani drzewa roboczego (ale resetuje głowicę do <commit>
, tak jak robią to wszystkie tryby). To pozostawia wszystkie zmienione pliki jako „Zmiany do zatwierdzenia”, jak określiłby to status git.
--mieszany
Resetuje indeks, ale nie drzewo robocze (tj. Zmienione pliki są zachowane, ale nie są oznaczone do zatwierdzenia) i informuje, co nie zostało zaktualizowane. To jest akcja domyślna.
--ciężko
Resetuje indeks i drzewo robocze. Wszelkie zmiany w śledzonych plikach w drzewie roboczym <commit>
są odrzucane.
Teraz, gdy zrobisz coś takiego git reset HEAD
- to, co faktycznie robisz, git reset HEAD --mixed
to „zresetuje” indeks do stanu, w jakim był przed rozpoczęciem dodawania plików / dodawania modyfikacji do indeksu (przez git add
). W tym przypadku kopia robocza i plik index (lub staging) 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
jednak usuwa plik z samego indeksu i zachowuje go w kopii roboczej. Jest to dokładne przeciwieństwo git add file
W tym przypadku, utworzyłeś indeks różniący się od HEAD i działającego, w którym HEAD ma wcześniej zatwierdzoną wersję pliku, kopia robocza miała ostatnią modyfikację, jeśli w ogóle, lub zawartość z HEAD plik i usunąłeś plik z indeksu. Zatwierdzenie teraz zsynchronizuje indeks i drzewo, a plik zostanie usunięty.
git rm --cached
git diff
git diff --cached
git status
Untracked
git reset --mixed
. Byłem trochę zdezorientowany stwierdzeniem, któregit rm --cached
jest przeciwieństwemgit add
. Dosłownie jest to nieprawidłowe i może spowodować szkody. W moim przypadkugit add
dodawałem zmodyfikowany plik do obszaru przemieszczania i chciałem mieć przeciwieństwo „tego dodania”, a nie początkowego dodania pliku. + Odpowiedź Grega Hewgilla pomogła mi uzyskać jaśniejszy obraz.git rm --cached
„jest dokładnym przeciwieństwemgit add file
” jest mylące.git reset file
jest bliżej bycia przeciwieństwemgit add file
.Może przykład pomoże:
przeciw
Zauważ, że jeśli nie zmieniłeś niczego innego , drugie zatwierdzenie tak naprawdę nic nie da.
źródło
--
służy do oddzielania opcji poleceń od nazw plików. Gdyby istniała zarówno gałąź, jak i plik o nazwieasd
,git reset HEAD asd
byłoby to niejednoznaczne.--
Mówi „wszystko po to nazwa pliku”.git reset HEAD <file>
dokładnie to samo cogit rm --cached <file>
i wtedygit add --intent-to-add <file>
?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 pomostowym do stanu, w którym znajdował się w zatwierdzeniu HEAD, tj. cofnie wszelkie zmiany, które zrobiłeś od ostatniego zatwierdzenia. Jeśli ta zmiana dotyczy nowego dodania pliku, będą one równoważne.źródło
git rm --cached file
jest czymś przeciwnymgit add
, odpowiedź ta miała dla mnie dużo sensu i była dość zwięzła. Prawie tak krótki, jak ten komentarz;)git rm --cached file
nie jest przeciwieństwemgit add file
. Zachowanie jest odwrotne niżgit add file
w konkretnym przypadku, gdy dodano nowy, wcześniej nieśledzony plik. W każdym innym przypadku przeciwieństwemgit add file
jestgit reset HEAD file
.git reset HEAD file
również odwracagit add file
w pierwszym przypadku (dodając nieśledzony plik) i w każdym przypadku, dlatego właśnie to sugeruje git, jeśli chcesz odwrócić git add.