Popełniłem błąd i nie wiem, jak usunąć mój ostatni push w repozytorium. Pobieram najnowsze aktualizacje aplikacji, ale występują konflikty i wysyłam ją do repozytorium.
Jak usunąć moje ostatnie zatwierdzenie? Albo jak to naprawić?
Odpowiedzi:
Po pierwsze, jeśli pracujesz z innymi osobami na tym samym repozytorium kodu, nie powinieneś usuwać zatwierdzenia, ponieważ wymuszenie aktualizacji repozytorium pozostawi lokalne repozytoria Twoich współpracowników w nielegalnym stanie (np. dokonane zatwierdzenia po usuniętym, te zatwierdzenia będą nieprawidłowe, ponieważ były oparte na nieistniejącym zatwierdzeniu).
Powiedział, że możesz cofnąć zatwierdzenie. Ta procedura jest wykonywana inaczej (różne polecenia) w zależności od używanego CVS:
Na git :
git revert <commit>
Na mercurial :
hg backout <REV>
EDYCJA: Operacja przywracania tworzy nowe zatwierdzenie, które robi odwrotnie niż przywrócone zatwierdzenie (np. Jeśli oryginalne zatwierdzenie dodało linię, zatwierdzenie cofnięcia usuwa tę linię), skutecznie usuwając zmiany w niepożądanym zatwierdzeniu bez przepisywania historii repozytorium.
git backout <REV>
? Albo hg backout <REV>
:?
Jeśli nie pracujesz z innymi (lub z przyjemnością sprawiasz im znaczną irytację) , możesz usunąć commity z gałęzi bitbucket.
git reset HEAD^ # remove the last commit from the branch history
git push origin :branch_name # delete the branch from bitbucket
git push origin branch_name # push the branch back up again, without the last commit
Generalnie w gicie gałąź główna nie jest wyjątkowa - to tylko konwencja. Jednak bitbucket, github i podobne strony zwykle wymagają, aby istniała główna gałąź (prawdopodobnie dlatego, że jest to łatwiejsze niż pisanie większej ilości kodu do obsługi zdarzenia, w którym repozytorium nie ma gałęzi - nie jestem pewien). Musisz więc utworzyć nową gałąź i ustawić ją jako główną:
# on master:
git checkout -b master_temp
git reset HEAD^ # undo the bad commit on master_temp
git push origin master_temp # push the new master to Bitbucket
W Bitbucket przejdź do ustawień repozytorium i zmień „gałąź główną” na master_temp
(na Github zmień „gałąź domyślną”).
git push origin :master # delete the original master branch from Bitbucket
git checkout master
git reset master_temp # reset master to master_temp (removing the bad commit)
git push origin master # re-upload master to bitbucket
Teraz przejdź do Bitbucket i powinieneś zobaczyć żądaną historię. Możesz teraz przejść do strony ustawień i zmienić gałąź główną z powrotem na master
.
Ten proces będzie również działał z innymi zmianami historii (np git filter-branch
.). Musisz tylko upewnić się, że zresetowałeś do odpowiednich zatwierdzeń, zanim nowa historia oddzieli się od starej.
edycja : najwyraźniej nie musisz przechodzić do tych wszystkich kłopotów na githubie, ponieważ możesz wymusić reset gałęzi .
Następnym razem, gdy ktoś spróbuje pobrać z twojego repozytorium (jeśli już ściągnął złe zatwierdzenie), ściąganie zakończy się niepowodzeniem. Będą musieli ręcznie zresetować do zatwierdzenia przed zmianą historii, a następnie ponownie pociągnąć.
git reset HEAD^
git pull
Jeśli wyciągnęli złe zatwierdzenie i popełnili po nim , to będą musieli zresetować, a następnie git cherry-pick
dobre zatwierdzenia, które chcą utworzyć, skutecznie odtwarzając całą gałąź bez złego zatwierdzenia.
Jeśli nigdy nie popełnili złego zobowiązania, cały ten proces nie wpłynie na nich i będą mogli zrobić to normalnie.
możesz zresetować, HEAD^
a następnie wymusić wciśnięcie.
git reset HEAD^
git push -u origin master --force
Spowoduje to usunięcie ostatniego zatwierdzenia i zostanie odzwierciedlone w bitbuckecie jako usunięte zatwierdzenie, ale nadal pozostanie na ich serwerze.
Oto proste podejście w maksymalnie 4 krokach:
0 - Poinformuj zespół, że zamierzasz naprawić repozytorium
Połącz się z zespołem i poinformuj ich o nadchodzących zmianach.
1 - Usuń ostatnie zatwierdzenie
Zakładając, że Twoja gałąź docelowa to master
:
$ git checkout master # move to the target branch
$ git reset --hard HEAD^ # remove the last commit
$ git push -f # push to fix the remote
W tym momencie jesteś skończony, jeśli pracujesz sam.
2 - Napraw lokalne repozytoria swojego kolegi z drużyny
Na kolegach z drużyny:
$ git checkout master # move to the target branch
$ git fetch # update the local references but do not merge
$ git reset --hard origin/master # match the newly fetched remote state
Jeśli twój kolega z drużyny nie miał nowych zatwierdzeń, w tym momencie jesteś skończony i powinieneś być zsynchronizowany.
3 - Przywracanie utraconych zatwierdzeń
Powiedzmy, że kolega z zespołu ma nowe i nieopublikowane zatwierdzenie, które zostało utracone w tym procesie.
$ git reflog # find the new commit hash
$ git cherry-pick <commit_hash>
Zrób to dla tylu zatwierdzeń, ile potrzeba.
Wielokrotnie z powodzeniem stosowałem to podejście. Zapewnienie synchronizacji wszystkiego wymaga pracy zespołowej.
W przeszłości miałem problemy z przywracaniem git (głównie dlatego, że nie jestem do końca pewien, jak to działa). Miałem problemy z przywróceniem z powodu problemów ze scalaniem.
Moje proste rozwiązanie jest takie.
Krok 1.
git clone <your repos URL> .
Twój projekt w innym folderze, a następnie:
Krok 2.
git reset --hard <the commit you wanna go to>
następnie Krok 3.
w swoim najnowszym (i głównym) katalogu projektu (tym, który ma problematyczne ostatnie zatwierdzenie) wklej pliki z kroku 2
Krok 4.
git commit -m "Fixing the previous messy commit"
Krok 5.
Cieszyć się
git revert
jest proste: tworzy nowe zatwierdzenie, które odwraca zmiany w poprzednim zatwierdzeniu (lub wielu zatwierdzeniach). Nie usuwa zatwierdzeń, więc nie ma znaczenia dla tego pytania. Ponadto krok klonowania tutaj nie jest naprawdę konieczny.
Jak powiedzieli inni, zwykle chcesz użyć hg backout
lub git revert
. Jednak czasami naprawdę chcesz pozbyć się zatwierdzenia.
Najpierw będziesz chciał przejść do ustawień repozytorium. Kliknij Strip commits
łącze.
Wprowadź identyfikator zestawu zmian, który chcesz zniszczyć, i kliknij Preview strip
. Dzięki temu zobaczysz, jakie szkody zamierzasz wyrządzić, zanim to zrobisz. Następnie kliknij, Confirm
a Twoje zatwierdzenie nie jest już historią. Upewnij się, że powiedziałeś wszystkim swoim współpracownikom, co zrobiłeś, aby przypadkowo nie odepchnęli naruszającego commita z powrotem.
Po zatwierdzeniu zmian nie będzie można ich usunąć. ponieważ podstawową naturą commita nie jest usuwanie.
Co możesz zrobić (łatwa i bezpieczna metoda),
Interaktywny Rebase:
1) git rebase -i HEAD~2
# pokaże ostatnie 2 zatwierdzenia
2) Twoje zatwierdzenie wyświetli się w następujący sposób, Ostatnie pojawi się na dole strony LILO (ostatnie w Last Out)
Całkowicie usuń ostatni wiersz zatwierdzenia
3) zapisz go przez ctrl+X
lubESC:wq
teraz twoja gałąź zostanie zaktualizowana bez twojego ostatniego zatwierdzenia.
W tej chwili bitbucket w chmurze (nie jestem pewien, która wersja) pozwala na przywrócenie zatwierdzenia z systemu plików w następujący sposób (nie widzę, jak cofnąć się z interfejsu Bitbucket w przeglądarce Chrome).
- wykonaj kopię zapasową całego katalogu, aby zabezpieczyć zmiany, które zostały nieumyślnie wprowadzone
-wybierz wyewidencjonowany katalog
- prawy przycisk myszy: menu git żółwia
-repo-browser (opcja menu „revert” cofa tylko niezatwierdzone zmiany)
-naciśnij przycisk HEAD
-wybierz najwyższą linię (ostatnie zatwierdzenie)
- prawy przycisk myszy: cofnij zmianę przez to zatwierdzenie
- po cofnięciu zmian w systemie plików naciśnij commit
-To aktualizuje GIT z komunikatem „Przywróć (poprzednia wiadomość). To przywraca popełnienie takiego a takiego ''
-wybierz „Zatwierdź i wypchnij”.