Istnieje wiele odpowiedzi z błędnym przekonaniem na temat git reset --soft. Chociaż istnieje określony warunek, w którym git reset --softzmieni 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 --softsię 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ę masterwymeldował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 resetpoleceniem.
Zmień też swój indeks
git reset --mixed <ref>
lub równoważnie
git reset <ref>:
Robi to, co --softrobi i również resetuje wskaźnik do meczu commit w określonym odniesienia. Chociaż git reset --soft HEADnic nie robi (ponieważ mówi o przeniesieniu gałęzi wyrejestrowanej do gałęzi wyrejestrowanej), git reset --mixed HEADlub 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 --mixedrobi 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 resetruchu, na które HEADwskazuje 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ś. HEADto ty , i tak się przeprowadzisz, kiedy to zrobisz.