git reset --soft HEAD~1
powinien robić co chcesz. Następnie będziesz mieć pierwsze zmiany w indeksie (widoczne za pomocą git diff --cached
), a najnowsze zmiany nie zostaną wprowadzone. git status
będzie wyglądać następująco:
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: foo.java
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: foo.java
#
Następnie możesz wykonać git add foo.java
i zatwierdzić obie zmiany jednocześnie.
git commit --amend
robi; ale przy znacznie bardziej skomplikowanym przepływie pracy. To nie odpowiada na zadane pytanie OP, pomimo podania dobrego kierunku (git reset
).git reset --soft HEAD~
Posługiwać się:
Spowoduje to domyślny reset „mieszany”, co spowoduje wykonanie żądanego zadania; wstaw foo.java w scenę, usuwając najnowsze zatwierdzenie.
źródło
git reset --soft
nie działa, alegit reset HEAD^
nieDla mnie, następujący sposób jest bardziej czytelny (a zatem preferowany) sposób:
Zamiast tego
1
może istnieć dowolna liczba zatwierdzeń, które chcesz wycofać.źródło
git reset --soft
jest po prostu do tego: jest jakgit reset --hard
, ale nie dotyka plików.źródło
git reset
„jest jak,git reset --hard
ale nie dotyka plików.”. Niegit reset --soft
.git reset --soft
wprowadzi zmiany, więc nie będziesz musiał dodawać ich do inscenizacji na wypadek, gdybyś chciał je zatwierdzić, ale będziesz musiałgit reset
je wprowadzić (tak, po raz drugi i bez--soft
) na wypadek, gdybyś tego nie zrobił. Ta odpowiedź jest krótka, ale niepoprawna.Aby cofnąć wyświetlanie wszystkich plików w ostatnim zatwierdzeniu -
git reset HEAD~
źródło
„Reset” to lokalny sposób cofania zmian. Podczas zatwierdzania najpierw wybierasz zmiany, które chcesz uwzględnić w „ git add ” - to się nazywa „inscenizacja”. A kiedy zmiany zostaną wprowadzone, wtedy „ zatwierdzasz ” je.
Aby wycofać się z inscenizacji lub zatwierdzenia, „resetujesz” HEAD. W gałęzi HEAD jest zmienną git, która wskazuje na ostatnie zatwierdzenie. Więc jeśli wystawiłeś inscenizację, ale się nie zaangażowałeś, „ resetujesz HEAD ”. Jest to zgodne z obecnym HEAD, usuwając zmiany ze sceny. To skrót od „ git reset - mixed HEAD ~ 0 ”.
Jeśli już zatwierdziłeś, HEAD już się posunął, więc musisz wykonać kopię zapasową do poprzedniego zatwierdzenia. Tutaj „ resetujesz HEAD ~ 1 ” lub „ resetujesz HEAD ^ 1 ” lub „ resetujesz HEAD ~ ” lub „ reset HEAD ^ ” - wszystkie odniesienia HEAD minus jeden.
Który lepszy symbol ~ lub ^? Pomyśl o tyldy ~ jako o pojedynczym strumieniu - gdy każde zatwierdzenie ma pojedynczego rodzica i jest to po prostu seria zmian w sekwencji, możesz odwoływać się do strumienia za pomocą tyldy, jako HEAD ~ 1, HEAD ~ 2, HEAD ~ 3, dla rodzica, dziadka, pradziadka itp. (Technicznie jest to znalezienie pierwszego rodzica we wcześniejszych pokoleniach).
Kiedy następuje scalenie, zatwierdzenia mają więcej niż jednego rodzica. Wtedy pojawia się ^ caret - pamiętasz, ponieważ pokazuje gałęzie, które się ze sobą łączą. Korzystając z karetki, HEAD ^ 1 byłby pierwszym rodzicem, a HEAD ^ 2 byłby drugim rodzicem pojedynczego zatwierdzenia - na przykład matki i ojca.
Więc jeśli cofasz się tylko o jeden skok w zatwierdzeniu przez jednego rodzica, HEAD ~ i HEAD ^ są równoważne - możesz użyć jednego z nich.
Również reset może być --soft , --mixed lub --hard . Miękki reset po prostu wycofuje zatwierdzenie - resetuje HEAD, ale nie pobiera plików z wcześniejszego zatwierdzenia, więc wszystkie zmiany w katalogu roboczym zostają zachowane. I --soft reset nie kasuje nawet sceny (znanej również jako indeks) ), więc wszystkie pliki, które zostały wyreżyserowane, nadal będą na scenie.
--Mixed resetu (domyślnie) również nie sprawdza się pliki z wcześniej popełnić, więc wszystkie zmiany zostaną zachowane, ale scena jest wyczyszczone. Właśnie dlatego prosty „ GIT reset HEAD ” ze sceny.
- - twardy reset resetuje HEAD i czyści scenę, ale także sprawdza wszystkie pliki z wcześniejszego zatwierdzenia, więc zastępuje wszelkie zmiany.
Jeśli przekazałeś zatwierdzenie do zdalnego repozytorium, reset nie działa tak dobrze. Możesz zresetować lokalnie, ale kiedy spróbujesz pchnąć do pilota, git zobaczy, że twój lokalny HEAD znajduje się za HEAD w zdalnej gałęzi i odmówi pchnięcia. Możesz być w stanie wymusić push, ale git naprawdę nie lubi tego robić.
Alternatywnie możesz ukryć swoje zmiany, jeśli chcesz je zachować, sprawdzić wcześniejsze zatwierdzenie, cofnąć ukrywanie zmian, wprowadzić je w etap, utworzyć nowe zatwierdzenie, a następnie je przesłać.
źródło
Powiedzmy, że chcesz wprowadzić zmiany do n zatwierdzeń,
Skróty zatwierdzania są następujące:
Następnie uruchom następujące polecenie:
git reset hn
Teraz HEAD będzie w hn + 1. Zmiany z h1 na hn zostaną wycofane ze sceny.
źródło