Chcę cofnąć się do poprzedniego zatwierdzenia, a następnie opublikować ten kod, a następnie wrócić do ostatniego zatwierdzenia.
tzn. mój mistrz wskazuje na starszą wersję commita tylko po to, abym mógł ją skasować, a potem chcę wrócić do ostatniej rewizji, którą byłem na początku.
Jak mogę to zrobić?
Twoje pytanie jest niejasne. Myślę, że o to prosisz:
Co to zrobi? Będzie nacisnąć
$old_commit_id
zobowiązać sięorigin
jako nowy szeforigin
„smaster
oddziału.Jeśli tego chciałeś, nie musisz w ogóle dotykać lokalnego
master
oddziału.źródło
master (non-fast-forward)
dla mnie porażkę. Rozwiązanie @jtdubs zadziałało.-f
aby to wymusić - chociaż zdalne repozytorium może być skonfigurowane tak, aby tego zabronić. Zaktualizowałem odpowiedź.posługiwać się
git reset --hard <old commit number>
zresetuje HEAD do tego starego zatwierdzenia.
dodatkowo musisz użyć go
git push -f origin
do zmiany zdalnego repozytorium.źródło
Jeśli chcesz uniknąć forsowania siły, oto jak przywrócić swoje repozytorium do starszego zatwierdzenia i zachować wszystkie interwencje:
git checkout 307a5cd # check out the commit that you want to reset to git checkout -b fixy # create a branch named fixy to do the work git merge -s ours master # merge master's history without changing any files git checkout master # switch back to master git merge fixy # and merge in the fixed branch git push # done, no need to force push!
Gotowe! Zastąp 307a5cd dowolnym zatwierdzeniem, które chcesz w swoim repozytorium.
(Wiem, że pierwsze dwie linie można łączyć, ale myślę, że to sprawia, że mniej jasne jest, co się dzieje)
Tutaj jest graficznie:
Skutecznie usuwasz c3 i c4 i ustawiasz projekt z powrotem na c2. Jednak c3 i c4 są nadal dostępne w historii twojego projektu, jeśli kiedykolwiek zechcesz je ponownie zobaczyć.
źródło
Zakładając taki wykres zatwierdzenia:
Chcesz najpierw zapłacić
master
i utworzyć gałąź, która wskazuje, gdziemaster
obecnie jest:Powinien teraz wyglądać tak:
Teraz, gdy już jesteś włączony
master
, powiemymaster
gałęzi, aby cofnęła się o jedno zatwierdzenie:Teraz
master
powinno zostać cofnięte o jedno miejsce, alepointer
gałąź nadal znajduje się na ostatnim zatwierdzeniu:W tym momencie możesz naciskać
master
do pilota lub gdziekolwiek, a następnie szybko do przodu scalić go z powrotem dopointer
gałęzi. Wpointer
tym momencie możesz zabić gałąź:Finał:
źródło
git push origin master
zakończy się niepowodzeniem, a końcówka bieżącej gałęzi znajduje się za jej zdalnym odpowiednikiem . Powinieneś także przekazać flagę -f.Możesz po prostu
git checkout <commit-id>
zrobić wszystko, co musisz, a następniegit checkout master
wrócić do nowego kodu.Jeśli faktycznie potrzebujesz zmodyfikować stary kod, aby go wydać, prawdopodobnie powinieneś:
Nie mogę też wystarczająco polecić Git Flow . To sprawia, że wszystko to jest dość łatwe.
źródło
Aby przejść do poprzedniej wersji:
git checkout <version hash>
wykonaj swoją pracę tutaj i poświęć ją
git commit --amend
Aby wrócić do mastera :
git checkout master
źródło
git reset --hard
wskazał swoją gałąź master z powrotem na stary commit, więcgit checkout master
nic nie zrobi.commit --amend
krok jest wystarczająco przydatny--amend
?