Przeczytałem podobne posty na ten temat i przez całe życie nie mogę wymyślić, jak to zrobić poprawnie.
Zalogowałem około 1000 plików, których nie chcę i wolałbym nie przechodzić przez 1by1 i usuwać je wszystkie z repozytorium.
- Mam zdalny
master
oddział. - Mam lokalny
master
oddział.
Oba są w tej samej wersji.
Chcę cofnąć mojego pilota o 1 zatwierdzenie.
Powiedz, że moja historia master
jest A--B--C--D--E
.
Chcę wycofać mój lokalny do D
.
Następnie przesuń go na zdalny, aby mój bieżący skrót był zarówno zdalny, jak i lokalny.
Mam problemy z robieniem tego.
Korzystam z Git Tower, ale czuję się swobodnie z linii poleceń. Jakaś pomoc?
AKTUALIZACJA: Świetne komentarze poniżej. Wydaje się, że korzystanie z resetowania jest częściowo odradzane, zwłaszcza jeśli repozytorium jest udostępniane innym użytkownikom. Jaki jest najlepszy sposób na cofnięcie zmian poprzedniego zatwierdzenia bez twardego resetu ? Czy jest jakiś sposób?
git revert
do robienia bez twardego resetu i bez przeszkadzania użytkownikom.Odpowiedzi:
Jeśli nikt jeszcze nie wyciągnął twojego zdalnego repo, możesz zmienić oddział HEAD i zmusić go do przekazania do wspomnianego repozytorium:
(lub, jeśli masz bezpośredni dostęp do zdalnego repozytorium, możesz zmienić jego odniesienie do HEAD, nawet jeśli jest to repozytorium od samego początku )
Pamiętaj, jak skomentował Alien-Technology w komentarzach poniżej , w systemie Windows (sesja CMD) potrzebujesz
^^
:Aktualizacja od 2011 roku:
Używanie
git push --force-with-lease
( które tutaj przedstawiam , wprowadzonego w 2013 roku wraz z Git 1.8.5) jest bezpieczniejsze.Zobacz Schwern jest odpowiedź na ilustracji.
Następnie zasugerowałbym coś, co nie przepisuje historii:
git revert
lokalnie twoje ostatnie zatwierdzenie (tworzenie nowego zatwierdzenia, które odwraca to, co zrobiło poprzednie zatwierdzenie)git revert
.źródło
reset --hard HEAD^
i niereset --hard HEAD^^
resetować ostatniego zatwierdzenia.Ustaw oddział lokalny o jedną wersję wstecz (
HEAD^
oznacza jedną wersję wstecz):Wciśnij zmiany do źródła:
Będziesz musiał wymusić pchanie, ponieważ w przeciwnym razie git rozpoznałby cię za
origin
jednym zatwierdzeniem i nic się nie zmieni.Robiąc to
--force
poleca gitowi nadpisanieHEAD
w zdalnym repozytorium bez respektowania jakichkolwiek postępów.źródło
git push origin master
, Git jest w stanie utworzyć nowe zatwierdzenie zdalnie, ponieważ lokalny oddział wyprzedza przynajmniej raz zatwierdzenie? Co więcej, ta ostatnia musi zasadniczo różnić się od tego, na co wskazuje szef w zdalnym repo?Jeśli chcesz cofnąć ostatnie zatwierdzenie, słuchaj:
Krok 1:
Sprawdź swoje lokalne zobowiązania za pomocą wiadomości
Krok 2:
Usuń ostatni zatwierdzenie bez resetowania zmian z oddziału lokalnego (lub głównego)
LUB jeśli nie chcesz, aby pliki ostatnich zatwierdzeń i aktualizacji były nasłuchiwane
Krok 3:
Możemy zaktualizować pliki i kody i ponownie musimy naciskać z siłą, aby usunąć poprzednie zatwierdzenie. Zachowa nowe zatwierdzenie.
Otóż to!
źródło
Wpisując poniżej polecenie, możesz zobaczyć historię git commit -
$ git log
Powiedzmy, że twoja historia w tej gałęzi jest podobna do - commit_A, commit_B, commit_C, commit_D. Gdzie, zatwierdzenie_D jest ostatnim zatwierdzeniem i tutaj pozostaje HEAD. Teraz, aby usunąć ostatnie zatwierdzenie z lokalnego i zdalnego, musisz wykonać następujące czynności:
Krok 1: Usuń ostatnie zatwierdzenie lokalnie przez -
$ git reset - hard HEAD ~
Spowoduje to zmianę HEAD zatwierdzenia na commit_C
Krok 2: Wciśnij swoją zmianę dla nowego zatwierdzenia HEAD do zdalnego
$ git push origin + HEAD
To polecenie spowoduje usunięcie ostatniego zatwierdzenia ze zdalnego.
PS to polecenie jest testowane na Mac OSX i powinno działać również na innych systemach operacyjnych (nie twierdząc jednak o innym systemie operacyjnym)
źródło
W przypadku komputerów z systemem Windows użyj:
źródło
Oto zaktualizowana wersja procedury, która jest bezpieczniejsza.
git push -f
bezkrytycznie zastąpi zdalne repozytorium własnymi zmianami. Jeśli ktoś wprowadził zmiany, zostaną utracone.git push --force-with-lease
wypchnie twój rebase tylko wtedy, gdy repozytorium będzie zgodne z oczekiwaniami. Jeśli ktoś już naciskał, twój push nie powiedzie się.Zobacz - siła uważana za szkodliwą; zrozumienie git-force-with-leasing .
Polecam aliasing to jako
repush = push --force-with-lease
.Powiedz im, aby
git pull --rebase=merges
. Zamiast agit fetch origin
igit merge origin/master
będziegit fetch origin
igit rebase -r origin/master
. Spowoduje to przepisanie wszelkich lokalnych zmianmaster
na nowe na podstawie zmianyorigin/master
.-r
zachowa wszelkie połączenia, które mogły zostać dokonane.Polecam ustawienie tego jako domyślnego zachowania podczas ciągnięcia. Jest bezpieczny, poradzi sobie z ponownym bazowaniem na innych i spowoduje mniej niepotrzebnych połączeń.
źródło
--force-with-lease
opcji.Rozwiązałem problem podobny do twojego za pomocą następujących poleceń:
źródło
Jeśli masz bezpośredni dostęp do zdalnego repozytorium, zawsze możesz użyć:
Działa to, ponieważ nie ma próby modyfikacji nieistniejącego katalogu roboczego. Aby uzyskać więcej informacji, zobacz oryginalną odpowiedź:
Jak mogę anulować ostatnie zatwierdzenie w repozytorium git bare?
źródło
Chciałem tylko usunąć ostatnie zatwierdzenie ze zdalnej i wyczyścić również historię zatwierdzeń. Poniższe działało jak urok
źródło
Sposób zresetowania głowicy i przywrócenia poprzedniego zatwierdzenia jest zakończony
Ale czasami może nie zostać zaakceptowany w zdalnej gałęzi:
to innym sposobem jest
To działa dobrze.
UWAGA: pamiętaj, jeśli
git push -f <force>
nie powiodło się, a następnie spróbuj przywrócić. Zrób togit pull
wcześniej, aby zdalne i lokalne były zsynchronizowane, a następnie spróbujgit revert
.Sprawdź,
git log
aby upewnić się, że zdalny i lokalny są w tym samym punkcie zatwierdzenia z tym samym SHA1 ..źródło
na lokalnym mistrzu
Nie musisz się martwić, czy ktoś pociągnął, czy nie.
Gotowe!
źródło
Jeśli chcesz tylko usunąć ostatnie zatwierdzenie ze zdalnego repozytorium bez bałaganu w lokalnym repozytorium, oto jedna linijka:
Używa następującej składni:
Tutaj
<remote>
jestorigin
i<refspec>
ma następującą strukturę:Szczegóły można znaleźć w
git-push(1)
. Powyższe+
oznacza „force push this ref”, a druga część oznacza „odorigin/master~
domaster
(zdalnegoorigin
)”. Nietrudno wiedzieć, żeorigin/master~
to ostatnie zatwierdzenie wcześniejorigin/master
, prawda?źródło
dla mnie działa to dwa polecenia:
źródło
Możesz także to zrobić:
i niech wszyscy inni, którzy otrzymali najnowsze złe zatwierdzenia, resetują:
źródło