Chciałbym wiedzieć, jak usunąć zatwierdzenie.
Przez delete
, mam na myśli to tak jakby nie sprawiają, że zobowiązują się, a kiedy zrobić push w przyszłości, moje zmiany nie będą naciskać na pilocie zdalnego oddziału.
Czytam git help i myślę, że powinienem użyć tego polecenia git reset --hard HEAD
. Czy to jest poprawne?
git
git-rebase
git-reset
hap497
źródło
źródło
cherry-pick
a niedelete
pojedyncze zatwierdzenie, które może nastąpić jakiś czas temu.git rebase -i HEAD~10
zawiera odpowiedź na pytanie, ponieważ pozwala ci dowolnie wybierać zatwierdzenia do usunięcia. Git stosuje zatwierdzenia w zakresie, który określisz jeden po drugim, ignorując zatwierdzenia usunięte z dziennika. Użyłem tego polecenia dzisiaj, aby pozbyć się drugiego i trzeciego ostatniego zatwierdzenia mojego repozytorium, zachowując najwyższy. Zgadzam się, że żadna z pozostałych odpowiedzi nie jest zadowalająca.Odpowiedzi:
Ostrożnie:
git reset --hard
USUNIĘCIE ZMIANY W KATALOGU PRACY . Przed uruchomieniem tego polecenia pamiętaj o ukryciu wszelkich zmian lokalnych, które chcesz zachować .Zakładając, że siedzisz na tym zatwierdzeniu, to polecenie go zwali ...
W
HEAD~1
oznacza popełnić zanim głowę.Możesz też spojrzeć na dane wyjściowe
git log
, znaleźć identyfikator zatwierdzenia zatwierdzenia, dla którego chcesz utworzyć kopię zapasową, a następnie wykonaj następujące czynności:Jeśli już go nacisnąłeś, będziesz musiał użyć siły, aby się go pozbyć ...
Jeśli jednak inni go wyciągnęli, lepiej byłoby założyć nową gałąź. Ponieważ kiedy pociągną, po prostu połączy to w swoją pracę, a ty ponownie ją wypchniesz.
Jeśli już wypchnąłeś, może być lepiej użyć
git revert
, aby utworzyć zatwierdzenie „obrazu lustrzanego”, które cofnie zmiany. Oba zatwierdzenia będą jednak znajdować się w dzienniku.FYI -
git reset --hard HEAD
jest świetny, jeśli chcesz się pozbyć PRACY W TRAKCIE. Zresetuje cię z powrotem do ostatniego zatwierdzenia i usunie wszystkie zmiany w twoim drzewie roboczym i indeksie.Na koniec, jeśli musisz znaleźć zatwierdzenie, które „usunąłeś”, zwykle jest ono obecne,
git reflog
chyba że śmieci zostały zebrane w repozytorium.źródło
HEAD~1
lub po prostuHEAD^
. Jeśli naciskałeś, powinieneś użyćgit revert
zamiast tego.HEAD~n
do „cofnięcia”n
zatwierdzeń z głowy. Być może od tego momentu można interpretować... --hard HEAD
również jakoHEAD~0
=> usuwanie trwającej pracy.reset --hard
i sprawdziszlog --oneline --all
, zatwierdzenia nadal pozostają w drzewie. Jak usuwamy te zatwierdzenia z drzewa? Dzięki.reset --soft
do usuwania zatwierdzenia lokalnego BEZ cofania trwającej pracy!Jeśli jeszcze nigdzie nie wysłałeś zatwierdzenia, możesz użyć go
git rebase -i
do usunięcia. Najpierw dowiedz się, jak daleko wstecz jest to zatwierdzenie (w przybliżeniu). Następnie wykonaj:Te
~N
środki rebase ostatnieN
rewizje (N
musi być liczbą, na przykładHEAD~10
). Następnie możesz edytować plik, który przedstawia ci Git, aby usunąć niepoprawne zatwierdzenie. Po zapisaniu tego pliku Git przepisze wszystkie poniższe zatwierdzenia, tak jakby usunięty nie istniał.Git Book ma dobrą sekcję na temat rebasingu ze zdjęciami i przykładami.
Bądź ostrożny z tym jednak, bo jeśli coś zmienić, że są popychane gdzie indziej, inne podejście będzie potrzebna, chyba że planujesz zrobić push force.
źródło
push -f
aby wymusić wypchnięcie i zastąpić zdalną gałąź lokalną. Jeśli to tylko Twoje zdalne repozytorium, nie ma problemu. Kłopoty zaczynają się, jeśli ktoś tymczasem się udało.git rebase -i HEAD~5
Polecenie było dokładnie to, co potrzebne, aby całkowicie usunąć to commit z mojego lokalnego repo! Dzięki!rebase -i
pomocą zmiany odpowiadające usuniętemu zatwierdzeniu nie są zachowywane.Inną możliwością jest jedno z moich ulubionych ulubionych poleceń:
Spowoduje to uruchomienie bazy w trybie interaktywnym
-i
w punkcie tuż przed zatwierdzeniem, które chcesz bić. Edytor uruchomi listę wszystkich zatwierdzeń od tego czasu. Usuń wiersz zawierający zatwierdzenie, które chcesz zatrzeć i zapisz plik. Rebase wykona resztę pracy, usuwając tylko to zatwierdzenie i odtwarzając wszystkie pozostałe z powrotem do dziennika.źródło
git rebase --continue
git rebase -i HEAD~1
git rebase -i HEAD~1
naprawdę wyczyściłem repo! Trudno powiedzieć dokładnie, co się stało, ale całość wygląda znacznie ładniej. Właściwie to trochę niepokojące.Dołączam tę odpowiedź, ponieważ nie rozumiem, dlaczego ktokolwiek, kto właśnie próbował zlecić pracę, chciałby usunąć całą tę pracę z powodu błędu przy użyciu Git!
Jeśli chcesz kontynuować pracę i po prostu „cofnij” to polecenie zatwierdzenia (złapałeś przed wypychaniem repo):
Nie używaj flagi --hard, chyba że chcesz zniszczyć trwające prace od ostatniego zatwierdzenia.
źródło
git reset --hard HEAD~1
poprzednie ostatnie zatwierdzenie będzie dostępne poprzez reflog (aż do jego wygaśnięcia); patrz również tutaj: gitready.com/intermediate/2009/02/09/…Usuwanie całego zatwierdzenia
Oczywiście zastąp „SHA” odniesieniem, którego chcesz się pozbyć. „^” W tym poleceniu jest dosłowne.
http://sethrobertson.github.io/GitFixUm/fixup.html#change_deep
źródło
-p, --preserve-merges
Odtwarzaj zatwierdzenia scalania zamiast spłaszczać historię, odtwarzając zatwierdzenia wprowadzone przez zatwierdzenie scalania. Scal konflikty lub ręczne zmiany w celu scalenia zatwierdzeń nie są zachowywane.Jeśli nie opublikowałeś zmian, możesz usunąć najnowsze zatwierdzenie, możesz to zrobić
(pamiętaj, że spowoduje to również usunięcie wszystkich niezaangażowanych zmian; używaj ostrożnie).
Jeśli już opublikowałeś zatwierdzenie do usunięcia, użyj git revert
źródło
tree = log --all --graph --format=format:'%C(bold blue)%h%C(reset) %C(dim black)%s%C(reset)%C(bold red)%d%C(reset) %C(green)by %an, %ar%C(reset)'
Powiedzmy, że chcemy usunąć zatwierdzenia 2 i 4 z repozytorium.
Uwaga: Musisz mieć uprawnienia administratora do repozytorium, ponieważ używasz
--hard
i-f
.git checkout b3d92c5
Kasa z ostatniego użytecznego zatwierdzenia.git checkout -b repair
Utwórz nowy oddział do pracy.git cherry-pick 77b9b82
Uruchom przez zatwierdzenie 3.git cherry-pick 2c6a45b
Uruchom przez zatwierdzenie 1.git checkout master
Mistrz kasy.git reset --hard b3d92c5
Resetuj master do ostatniego użytecznego zatwierdzenia.git merge repair
Połącz nasz nowy oddział w master.git push -f origin master
Wciśnij master do zdalnego repozytorium.źródło
git push -f origin master
to, że nie ma opcji--hard
commit 0
jest starszy niżcommit 1
. Czy mógłbyś mi powiedzieć, dlaczego najpierw biegnieszcommit 3
(przez cherry-pick), a potem przezcommit 1
? Po wymeldowaniu zb3d92cd
(commit 0
) spodziewałbym cherry-pickcommit 1
, a następniecommit 3
. Dzięki.PS: CommitId odnosi się do tego, do którego chcesz przywrócić
źródło
Wymuszaj zmianę historii
Zakładając, że nie chcesz tylko usunąć ostatniego zatwierdzenia, ale chcesz usunąć określone zatwierdzenia z ostatnich n zatwierdzeń, użyj:
git rebase -i HEAD~<number of commits to go back>
, więcgit rebase -i HEAD~5
jeśli chcesz zobaczyć ostatnie pięć zatwierdzeń.Następnie w edytorze tekstowym zmienić słowo
pick
abydrop
obok każdego popełnić chciałbyś usunąć. Zapisz i zamknij edytor. Voila!Dodatkowa zmiana historii
Spróbować
git revert <commit hash>
. Cofnij utworzy nowe zatwierdzenie, które cofnie określone zatwierdzenie.źródło
drop
słowo kluczowe nie jest zdefiniowane. Aby usunąć zatwierdzenie, po prostu usuń całą linię.Jeśli chcesz naprawić swój ostatni zatwierdzenie, możesz cofnąć zatwierdzenie i wycofać z niego pliki, wykonując:
Spowoduje to przywrócenie repozytorium do stanu przed poleceniami git add, które przygotowały pliki. Twoje zmiany będą w twoim katalogu roboczym. HEAD ~ 1 odnosi się do zatwierdzenia poniżej bieżącego wierzchołka gałęzi.
Jeśli chcesz anulować zatwierdzenie N, ale zachowaj zmiany kodu w katalogu roboczym:
Jeśli chcesz pozbyć się ostatniego zatwierdzenia i nie chcesz zachować zmian w kodzie, możesz wykonać „twardy” reset.
Podobnie, jeśli chcesz odrzucić ostatnie N zatwierdzeń i nie chcesz zachować zmian w kodzie:
źródło
W tym przypadku „2” oznacza liczbę zatwierdzeń, które chcesz zmienić.
jeśli chcesz zmienić podstawę wszystkich zatwierdzeń.
Następnie będziesz mógł wybrać jedną z tych opcji.
p, pick = use commit
r, reword = use commit, but edit the commit message
e, edit = use commit, but stop for amending
s, squash = use commit, but meld into previous commit
f, fixup = like "squash", but discard this commit's log message
x, exec = run command (the rest of the line) using shell
d, drop = remove commit
Linie te można ponownie zamówić; są wykonywane od góry do dołu. Jeśli usuniesz tutaj linię, KTÓRE ZOBOWIĄZANIE ZOSTANĄ UTRACONE. Jeśli jednak usuniesz wszystko, zmiana bazy zostanie przerwana. Zauważ, że puste zatwierdzenia są komentowane
Możesz po prostu usunąć ten zatwierdzenie, używając opcji „d” lub Usuwając wiersz z twoim zatwierdzeniem.
źródło
Aby usunąć w oddziale lokalnym, użyj
Aby usunąć w zdalnej gałęzi, użyj
źródło
[Szybka odpowiedź]
Masz wiele alternatyw, na przykład:
Alternatywa 1:
Alternatywa 2:
Alternatywa 3:
źródło
Źródło: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8
Usuń ostatni zatwierdzenie
Na przykład twój ostatni zatwierdzenie
git push origin + aa61ab32 ^: master
Teraz chcesz usunąć to zatwierdzenie, a następnie łatwy sposób na wykonanie następujących czynności
Kroki
Najpierw zresetuj gałąź do elementu nadrzędnego bieżącego zatwierdzenia
Wciśnij go do pilota.
Dla konkretnego zatwierdzenia, którego chcesz zresetować, następuje
źródło
Oto inny sposób, aby to zrobić:
Przejdź do gałęzi, którą chcesz przywrócić, a następnie zresetuj lokalną kopię roboczą z powrotem do zatwierdzenia, które chcesz być najnowszym na zdalnym serwerze (wszystko po nim przejdzie do widzenia). Aby to zrobić, w SourceTree kliknąłem prawym przyciskiem myszy i wybrałem „Resetuj BRANCHNAME do tego zatwierdzenia”. Myślę, że wiersz poleceń to:
Ponieważ właśnie zdalnie wyewidencjonowałeś swój oddział, nie będziesz musiał wprowadzać żadnych lokalnych zmian, aby martwić się utratą. Ale to by ich straciło, gdybyś to zrobił.
Następnie przejdź do lokalnego katalogu swojego repozytorium i uruchom następującą komendę:
Spowoduje to usunięcie wszystkich zatwierdzeń po bieżącym w lokalnym repozytorium, ale tylko dla tego jednego oddziału.
źródło
Błąd, pomyłka:
I
git rebase -i --root
„ed mój oddział, nieświadomie myśli mogłem przeredagować pierwszym popełnienia różniące się od mistrza (na GitHub for Windows widok domyślny jest porównanie do opanowania, ukrywając go w całości).Zapuściłem brodę z Doliny Krzemowej, podczas gdy ponad 900 zobowiązań załadowało się do Wzniosłości. Wychodząc bez żadnych zmian, naładowałem akumulator, a następnie przystąpiłem do golenia, ponieważ wszystkie ponad 900 pojedynczych osób nonszalancko wycofuje się - resetując teraz swoje czasy zatwierdzania.
Zdeterminowany, aby pokonać Gita i zachować oryginalne czasy, usunąłem to lokalne repozytorium i ponownie sklonowałem ze zdalnego.
Teraz dodano ponownie ostatnie niepotrzebne zatwierdzenie master, które chciałem usunąć, więc postępowałem tak.
Wyczerpanie opcji:
Nie chciałem
git revert
- stworzyłoby to dodatkowe zatwierdzenie, dając Git przewagę.git reset --hard HEAD
nic nie zrobił, po sprawdzeniureflog
ostatniego i jedynegoHEAD
był klon - Git wygrywa.Aby uzyskać najnowszą SHA, sprawdziłem zdalne repozytorium na github.com - niewielka wygrana.
Po zastanowieniu
git reset --hard <SHA>
zadziałało, zaktualizowałem kolejną gałąź do opanowania i 1 ... 2 ... puf! zatwierdzenie wróciło - Git wygrywa.Sprawdzanie z powrotem do mistrza, czas spróbować
git rebase -i <SHA>
, a następnie usuń linię ... bezskutecznie, przykro mi to mówić. „ Jeśli usuniesz tutaj linię, KTÓRE ZOBOWIĄZANIE ZOSTANĄ UTRACONE ”. Ach ... przeświecał nad nową funkcją trollowania n00b w informacjach o wersji 2.8.3 .Rozwiązanie:
git rebase -i <SHA>
następnied, drop = remove commit
.Aby to sprawdzić, wymeldowałem się do innej gałęzi i voila - brak ukrywania zatwierdzenia pobierania / ściągania z mastera.
https://twitter.com/holman/status/706006896273063936
Miłego dnia.
źródło
Wszystkie powyższe polecenia przywracają stan twojego drzewa roboczego i indeksu, jakie były przed dokonaniem zatwierdzenia, ale nie przywracają stanu repozytorium. Jeśli na to spojrzysz, zatwierdzenie „usunięte” nie jest faktycznie usuwane, po prostu nie znajduje się na końcu bieżącej gałęzi.
Myślę, że nie ma sposobu na usunięcie zatwierdzenia za pomocą porcelanowych poleceń . Jedynym sposobem jest usunięcie go z dziennika i ponowne zalogowanie, a następnie wykonanie
git prune --expire -now
.źródło
git prune
jest właściwie jednym z poleceń „porcelany” . Ponadto rzadko zdarza się, że chcesz całkowicie wyczyścić swój dziennik logowania (jednym z przypadków użycia jest usunięcie poufnych informacji z repozytorium, ale jak powiedziałem, jest to rzadki przypadek użycia). Częściej niż nie, będziesz chciał zachować stare zatwierdzenia w rejestrze, na wypadek, gdybyś musiał odzyskać dane. Zobacz Pro Git: 9.7 Git Internal - Konserwacja i odzyskiwanie danych .Jeśli chcesz zachować historię, pokazując zatwierdzenie i cofnięcie, powinieneś użyć:
wprowadź komunikat wyjaśniający, dlaczego cofasz, a następnie:
Podczas wydawania
git log
pojawi się zarówno „zły” komunikat zatwierdzenia, jak i cofnięcie dziennika.źródło
Jeśli właśnie pomieszałeś swój ostatni zatwierdzenie (zły komunikat, zapomniałeś dodać kilka zmian) i chcesz go naprawić przed przekazaniem go do publicznego repozytorium, dlaczego nie użyć:
Jeśli masz nowo wprowadzone zmiany, zostaną one połączone z ostatnim zatwierdzeniem (którego próbujesz się pozbyć) i zastąpią to zatwierdzenie.
Oczywiście, jeśli zmienisz zatwierdzenie po jego wypchnięciu, przepisujesz historię, więc jeśli to zrobisz, pamiętaj o konsekwencjach.
Możesz również przekazać opcję „--no-edit” zamiast „-m”, jeśli wolisz użyć wiadomości z poprzedniego zatwierdzenia.
Dokumenty: http://git-scm.com/docs/git-commit.html
źródło
Jeśli już wypchnąłeś, najpierw znajdź zatwierdzenie, które chcesz mieć w HEAD ($ GIT_COMMIT_HASH_HERE) , a następnie uruchom następujące polecenie:
Następnie każde miejsce, w którym repo zostało sklonowane, uruchom:
źródło
Co zwykle robię, gdy zatwierdzam i wypycham (jeśli ktoś popchnie jego zatwierdzenie, rozwiąże to problem):
Mam nadzieję, że to pomoże
źródło
Już naciskałem. Musisz zwrócić niektóre zobowiązania zdalnie. Próbowałem wielu odmian, ale tylko to od Justina przez git bush działa dla mnie dobrze:
źródło
Zresetuj w lokalnym oddziale
Siła push to origin
źródło
Wykonaj kopię zapasową kodu w folderze tymczasowym. Następujące polecenie zresetuje się tak samo jak serwer.
Jeśli chcesz zachować zmiany i usunąć ostatnie zatwierdzenia
źródło
Odniesienia: Jak usunąć zatwierdzenie w git, lokalnym i zdalnym
źródło
Jak widać na powyższym obrazku, chcę usunąć przywróć „zatwierdzenie zmiany testowej 2” (identyfikator SHA1: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 (identyfikator SHA1 można uzyskać za pomocą
gitk
polecenia w git bash)).Do tego mogę użyć (wszystkie poniższe polecenia działają tylko lokalnie. Musisz nacisnąć po usunięciu):
git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2
// tworzy kopię zapasową tego zatwierdzenia (SHA1 ID zmiany testowej 4 zatwierdzenie to 515b5220c50e3dfbb1063f23789d92ae1d3481a2 )git reset --hard HEAD~1
// tworzy kopię zapasową przed jednym zatwierdzeniem.git reset --hard HEAD^
// Aby usunąć ostatni zatwierdzenie z gitpo usunięciu:
źródło
git reset --hard HEAD~1
Będziesz teraz na poprzednim stanowisku. Pociągnij gałąź. Wciśnij nowy kod. Zatwierdzenie zostanie usunięte z git
źródło
git reset --hard
git push origin HEAD --force
Jeśli jedno lub więcej zatwierdzeń jest oznaczonych, najpierw usuń znaczniki. W przeciwnym razie oznaczone zatwierdzenie nie zostanie usunięte.
źródło
użyj git revert https://git-scm.com/docs/git-revert . Cofnie cały kod, a następnie będziesz mógł wykonać następne zatwierdzenie. Następnie głowa wskaże ostatnie zatwierdzenie. cofnięte zatwierdzenia nigdy nie usuwają, ale nie wpłynie to na ostatnie zatwierdzenie.
źródło
W moim przypadku mój magiczny kod dla tego szczenięcia jest następujący:
Przetestuj to i powiedz mi. Próbowałem kilku różnych, ale ten był jedyny, który mi pomógł.
źródło