Istnieje wiele odpowiedzi z błędnym przekonaniem na temat git reset --soft
. Chociaż istnieje określony warunek, w którym git reset --soft
zmieni się tylko HEAD
(zaczynając od odłączonego stanu głowy), zwykle (i zgodnie z przeznaczeniem), przenosi odniesienie do gałęzi, które obecnie sprawdziłeś. Oczywiście nie może tego zrobić, jeśli nie masz wyewidencjonowanego oddziału (stąd szczególny warunek, w którym git reset --soft
się tylko zmieni HEAD
).
Uważam, że jest to najlepszy sposób myślenia git reset
. Nie tylko się poruszasz HEAD
( wszystko to robi ), ale także przenosisz ref gałąź , np master
. Jest to podobne do tego, co dzieje się po uruchomieniu git commit
(bieżąca gałąź porusza się wraz z HEAD
), z tym wyjątkiem, że zamiast tworzyć (i przechodzić do) nowego zatwierdzenia, przechodzisz do wcześniejszego zatwierdzenia.
Chodzi o to reset
, żeby zmienić gałąź na coś innego niż nowy zatwierdzenie, nie zmieniać HEAD
. Możesz to zobaczyć w przykładzie dokumentacji:
Cofnij zatwierdzenie, czyniąc go gałęzią tematów
$ git branch topic/wip (1)
$ git reset --hard HEAD~3 (2)
$ git checkout topic/wip (3)
- Podjęliście pewne zobowiązania, ale zdajcie sobie sprawę, że przedwcześnie byli w gałęzi „master”. Chcesz kontynuować polerowanie ich w gałęzi tematów, więc utwórz gałąź „topic / wip” z bieżącego HEAD.
- Przewiń gałąź master, aby pozbyć się tych trzech zmian.
- Przejdź do gałęzi „topic / wip” i kontynuuj pracę.
Jaki jest sens tej serii poleceń? Chcesz przenieść gałąź tutaj master
, więc kiedy się master
wymeldowałeś, biegniesz git reset
.
Najczęściej głosowana odpowiedź tutaj jest ogólnie dobra, ale pomyślałem, że dodam to, aby poprawić kilka odpowiedzi z błędnymi przekonaniami.
Zmień swój oddział
git reset --soft <ref>
: Resetuje wskaźnik oddział dla aktualnie wyrejestrowany oddziału do zatwierdzenia w określonym odniesienia, <ref>
. Pliki w katalogu roboczym i indeksie nie są zmieniane. Przyjęcie z tego etapu zabierze Cię z powrotem do miejsca, w którym byłeś przed git reset
poleceniem.
Zmień też swój indeks
git reset --mixed <ref>
lub równoważnie
git reset <ref>
:
Robi to, co --soft
robi i również resetuje wskaźnik do meczu commit w określonym odniesienia. Chociaż git reset --soft HEAD
nic nie robi (ponieważ mówi o przeniesieniu gałęzi wyrejestrowanej do gałęzi wyrejestrowanej), git reset --mixed HEAD
lub równoważnie git reset HEAD
, jest popularnym i użytecznym poleceniem, ponieważ resetuje indeks do stanu ostatniego zatwierdzenia.
Zmień również katalog roboczy
git reset --hard <ref>
: Robi to, co --mixed
robi i również nadpisuje katalog roboczy. Ta komenda jest podobna do tej git checkout <ref>
, z tą różnicą, że (i to jest najważniejszy punkt reset
) wszystkie formy git reset
ruchu, na które HEAD
wskazuje gałąź odniesienia .
Uwaga na temat „takie i takie polecenie porusza GŁOWĘ”:
Nie jest użyteczne stwierdzenie, że polecenie porusza HEAD
. Każde polecenie, które zmienia się w historii zatwierdzeń, przenosi HEAD
. Właśnie o to HEAD
chodzi , wskaźnik do gdziekolwiek jesteś. HEAD
to ty , i tak się przeprowadzisz, kiedy to zrobisz.