Pytanie Usuń zatwierdzenia z oddziału w Git


Chciałbym wiedzieć, jak usunąć commit.

Przez deleteMam na myśli to, że nie popełniłem tego zobowiązania, a kiedy pchnę w przyszłość, moje zmiany nie popchną do odległej gałęzi.

Czytam pomoc git i myślę, że polecenie, którego powinienem użyć, jest git reset --hard HEAD. Czy to jest poprawne?


2582
2017-08-27 03:39


pochodzenie


Myślę że to nie duplikat Git cofnij ostatnie zatwierdzenie gdy prosi o usunięcie każdy zatwierdzić z oddziału. Sądzę również, że żadna z odpowiedzi w rzeczywistości nie odnosi się do tego pytania. Wszyscy oni cofają ostatnie poprawki, nie cherry-pick i delete pojedyncze zatwierdzenie, które mogło pojawić się jakiś czas temu. - Chris
@ Chris, odpowiedź z git rebase -i HEAD~10 odpowiada na pytanie, ponieważ pozwala ci dowolnie wybierać zatwierdzenia do usunięcia. Git stosuje zatwierdzenia w zakresie określonym indywidualnie, ignorując zatwierdzenia usunięte z dziennika. Użyłem tego polecenia dzisiaj, aby pozbyć się drugiego i trzeciego ostatniego zatwierdzenia do mojego repozytu, zachowując jednocześnie najwyższy. Zgadzam się, że żadna z pozostałych odpowiedzi nie jest satysfakcjonująca. - MST
@MST tak, powinienem był powiedzieć, że nie ma opcji w zaakceptowanej odpowiedzi adres ten pytanie, ale masz absolutną rację - to polecenie wydaje się działać - Chris


Odpowiedzi:


Ostrożny:  git reset --hard  ZMNIEJSZY ZMIANY W KATALOGU PRACY. Upewnij się, że przechowuj wszelkie lokalne zmiany, które chcesz zachować przed uruchomieniem tego polecenia.

Zakładając, że siedzisz na tym zatwierdzeniu, to polecenie rozwiąże to ...

git reset --hard HEAD~1

The HEAD~1 oznacza commit przed głową.

Lub możesz spojrzeć na wynik git log, znajdź identyfikator zatwierdzenia zatwierdzenia, do którego chcesz utworzyć kopię zapasową, a następnie wykonaj to:

git reset --hard <sha1-commit-id>

Jeśli już to zrobiłeś, będziesz musiał użyć siły, by się go pozbyć ...

git push origin HEAD --force

jednak, jeśli inni mogliby to wyciągnąć, lepiej byłoby zacząć nowy oddział. Ponieważ kiedy się zatrzymają, po prostu połączą go w swojej pracy, a ty znowu go popchniesz.

Jeśli już pchnąłeś, może lepiej użyć git revert, aby utworzyć zatwierdzenie "lustrzane odbicie", które spowoduje cofnięcie zmian. Jednak oba zatwierdzenia będą w dzienniku.


FYI - git reset --hard HEAD jest świetny, jeśli chcesz pozbyć się WORK IN PROGRESS. Przywróci cię do ostatniego zatwierdzenia i usunie wszystkie zmiany w drzewie pracy i indeksie.


Na koniec, jeśli chcesz znaleźć zatwierdzenie, które "usunąłeś", jest ono zwykle obecne w git reflog chyba że masz śmieci zebrane swoje repozytorium.


3311
2017-08-27 03:44



HEAD~1 Lub tylko HEAD^. Jeśli popchnąłeś, powinieneś użyć git revert zamiast. - Jakub Narębski
pamiętaj, aby zachować wszystkie lokalne zmiany, które chcesz zachować, zanim uruchomisz to polecenie ... - William Denniss
Oczywiście możesz również użyć HEAD~n wrócić" n popełnia z twojej głowy. Może od tego momentu możesz zinterpretować ... --hard HEADrównież jak HEAD~0 => usuwanie pracy w toku. - yoshi
@ beamrider9 imho git rebase prawie zawsze jest lepszym sposobem na usunięcie commitów (jak opisano w odpowiedzi Grega Hewgilla) - nie tylko dlatego, że rebase faktycznie zawiera duże ostrzeżenie, że usuniesz rzeczy 4realz. - Noah Sussman
nie usuwa to jednak zmian z drzewa zatwierdzenia. OP poprosił o już dokonane zatwierdzenie. Jeśli ty reset --hardi sprawdź log --oneline --all, zatwierdzenia nadal pozostają w drzewie. Jak usunąć te zatwierdzenia z drzewa? Dzięki. - iGbanam


Jeśli jeszcze nie naciśniesz komendy nigdzie, możesz użyć git rebase -i aby usunąć to zatwierdzenie. Najpierw sprawdź, jak daleko wstecz jest to zatwierdzenie (w przybliżeniu). Następnie wykonaj:

git rebase -i HEAD~N

The ~N oznacza rebase the last N popełnia (N musi być na przykład liczbą HEAD~10). Następnie możesz edytować plik, który Git przedstawia, aby usunąć naruszające zatwierdzenie. Po zapisaniu tego pliku, Git będzie przepisywać wszystkie kolejne zatwierdzenia, tak jakby usunięty nie istniał.

Księga Git ma coś dobrego Sekcja o przeklasyfikowaniu ze zdjęciami i przykładami.

Bądź jednak ostrożny, ponieważ jeśli coś zmienisz mieć wypchnięte gdzie indziej, potrzebne będzie inne podejście, chyba że planujecie pchnąć życie.


603
2017-08-27 03:51



Uwaga: Jeśli zdarzy ci się, że w ostatniej partii zatwierdzeń znajduje się dowolne --no-ff, to rebase ich zmiażdży :( Jest to wspomniane pod -p na ta strona. Problem polega na tym, że jeśli zamienisz -i na -p, nie będziesz już otrzymywać wyskakujących okienek z opcjami "edytuj to zatwierdzenie, pomiń ten", itd. Itp. Ktoś zna rozwiązanie? - Bukov
Co jeśli go popchnąłeś? (tylko ja używam zdalnego repozytorium) - Costa
@Costa, której możesz użyć push -f wymusić wypchnięcie i zastąpienie oddziału zdalnego lokalną. Jeśli to tylko własne zdalne repozytorium, nie ma problemu. Kłopoty zaczynają się, jeśli ktoś inny przyniósł w międzyczasie. - Greg Hewgill
Dodałem i zatwierdziłem plik danych, który był zbyt duży dla GitHub (tak, prawdopodobnie nie powinien być w repozytorium źródłowym, no dobrze). Kiedy próbowałem naciskać, GitHub odmówił z powodu zbyt dużego pliku. Wszystko, co chciałem zrobić, to cofnąć to jedno zatwierdzenie, a jednocześnie zapisać kilka innych niepowiązanych zatwierdzeń, które nastąpiły później. The git rebase -i HEAD~5 polecenie było dokładnie co było mi potrzebne, aby całkowicie usunąć to zatwierdzenie z mojego lokalnego repo! Dzięki! - aldo
@dumbledad: With rebase -i, zmiany odpowiadające usuniętemu zatwierdzeniu nie są zachowywane. - Greg Hewgill


Inną możliwością jest jedno z moich ulubionych poleceń:

git rebase -i <commit>~1

Spowoduje to uruchomienie bazy rebase w trybie interaktywnym -i w punkcie tuż przed zatwierdzeniem, które chcesz uderzyć. Od tego czasu edytor rozpocznie wyświetlanie wszystkich zatwierdzeń. Usuń wiersz zawierający zatwierdzenie, które chcesz usunąć, i zapisz plik. Rebase wykona resztę pracy, usuwając tylko ten commit i odtwarzając wszystkie pozostałe z powrotem do logu.


416
2017-08-27 03:49



thx, btw, jeśli napotkasz jakiekolwiek problemy (takie jak puste zatwierdzenia) możesz użyć git rebase --continue - realgt
Jeszcze łatwiej: git rebase -i HEAD~1 - mmell
Wowzers. git rebase -i HEAD~1 Naprawdę bardzo wyczyściłem repozytorium! Trudno dokładnie powiedzieć, co się stało, ale cała sprawa wygląda dużo ładniej. Trochę niepokojące. - Charles Wood
Myślę, że warto zauważyć, że zatwierdzenie nie jest zatarte, a jedynie usunięte z listy. Jeśli się zepsułeś, możesz odzyskać zatwierdzenie za pomocą reflog. - Zaz
Czy usunięcie linii jest takie samo jak d / drop? - Leo


Dołączam tę odpowiedź, ponieważ nie widzę powodu, dla którego ktoś, kto próbowałby popełnić czynność, chciałby usunąć całą tę pracę z powodu jakiegoś błędu przy użyciu Git!

Jeśli chcesz zachować swoją pracę i po prostu "cofnąć" polecenie commit (zostaniesz przyłapany przed naciśnięciem przycisku, aby wykonać ponownie):

git reset --soft HEAD~1

Nie używaj - flagę, chyba że chcesz zniszczyć swoją pracę w toku od ostatniego zatwierdzenia.


281
2017-10-15 18:17



Oto przykład, dlaczego: wykonujesz małą pracę na serwerze programistycznym, który zatwierdzasz. Wtedy okazuje się, że ten serwer nie ma dostępu wychodzącego HTTPS, więc nie możesz przekazać zatwierdzenia w dowolnym miejscu. Najprościej, aby udawać, że nigdy się nie wydarzyło, i przerób łatę z lokalnej maszyny. - Steve Bennett
reset --soft był zbawicielem życia, aby nie stracić obecnej pracy. - RaphaelDDL
Dzięki. Ta odpowiedź powinna być wyższa lub uwzględniona w zaakceptowanej odpowiedzi. Usuwanie zatwierdzenia! = Cofnięcie zatwierdzenia. - Alsciende
@RandolphCarter: mimo to utracisz wszelkie niezatwierdzone zmiany. - naught101
@Rob, jednym z przykładów jest przypadkowe zatwierdzenie pliku zawierającego tajne hasło (np. Hasło), które nigdy nie powinno być pod kontrolą źródła. Lokalne zatwierdzenie musi być zniszczony, nie tylko cofnięte, więc nigdy nie zostanie wypchnięte na serwer. - Bob Meyers


Jeśli nie opublikowałeś zmian, możesz usunąć ostatnie zatwierdzenie

$ git reset --hard HEAD^

(należy pamiętać, że usunie to również wszystkie niezatwierdzone zmiany, należy zachować ostrożność).

Jeśli opublikowałeś już zatwierdzenie, które ma zostać usunięte, użyj git przywrócić

$ git revert HEAD

47
2017-08-27 10:47



To nie zadziałało. Kiedy git log, wszystko jest nadal tam, bez względu na to, dlaczego robię to po prostu dodaje więcej zatwierdzeń. Chcę uporządkować historię. - Costa
@Costa: Co nie działało (tzn. Z której wersji korzystałeś) i jak udało Ci się zalogować? - Jakub Narębski
Próbowałem prawie wszystkiego na temat tego pytania i odpowiedzi. (Próbowałem git przywrócić HEAD, ostatnio) Mój dziennik git: 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)' - Costa
Chcę tylko usunąć zatwierdzenia (jak gdyby nigdy nie istniały). Wyruszyłem w jakąś dziwną przygodę z kodowaniem, z kilkoma nowymi zatwierdzeniami, i wszystko skończyło się na tym, że wyrzucono śmieci. Jak mogę po prostu usunąć te z mojego logu git? - Costa
Holy crap coś magicznie zrobił dokładnie to, co chciałem .... który z tych poleceń to zrobił? !!?! - Costa


Usuwanie całego zatwierdzenia

git rebase -p --onto SHA^ SHA

Oczywiście zastąp "SHA" odnośnikiem, którego chcesz się pozbyć. "^" W tym poleceniu jest dosłowne.

http://sethrobertson.github.io/GitFixUm/fixup.html


43
2017-08-31 19:36



jak mogę zdobyć więcej tej odpowiedzi? inne rozwiązania pokazują, jak to zrobić interaktywnie lub usunąć najlepsze zatwierdzenia. - ribamar
Dziękuję za ten link! Zastanawiam się, po uruchomieniu tego, dlaczego nadal widzę commit SHA w moim reflonie git? - bapors
Dlaczego potrzebujemy -p tutaj? - Serge Roussak
-p, --preserve-merges            Odtwarzaj scalenia, zamiast spłaszczać historię, powtarzając zatwierdzenia, które wprowadza wprowadzenie scalające. Scalone rezolucje dotyczące konfliktu lub ręczne poprawki do scalania zatwierdzeń nie są zachowywane. - raittes


git reset --hard commitId

git push <origin> <branch> --force

PS: CommitId odnosi się do tego, z którego chcesz powrócić


33
2017-10-16 09:51



git push --force <origin> <nazwa oddziału>. as bez podania nazwy oddziału może zmienić wszystkie pliki na zdalnym. - sheelpriy


Jeśli chcesz naprawić swój najnowszy commit, możesz cofnąć zatwierdzenie i otworzyć pliki w nim, wykonując:

git reset HEAD~1

Spowoduje to przywrócenie stanu twojego repozytorium przed poleceniami git add, które rozmieściły pliki. Twoje zmiany będą w twoim katalogu roboczym. HEAD ~ 1 odnosi się do commit poniżej bieżącego wierzchołka gałęzi.

Jeśli chcesz anulować zatwierdzanie N, ale zachowaj zmiany kodu w katalogu roboczym:

git reset HEAD~N

Jeśli chcesz pozbyć się ostatniego zatwierdzenia i nie chcesz, aby zmiany w nim zachodziły, możesz wykonać "twardy" reset.

git reset --hard HEAD~1

Podobnie, jeśli chcesz odrzucić ostatnie N commitów i nie chcesz, aby kod się zmieniał:

git reset --hard HEAD~N

29
2018-05-31 07:19





Wymuś zmianę historii

Zakładając, że nie chcesz usuwać ostatniego zatwierdzenia, ale chcesz usunąć konkretne zatwierdzenia z ostatnich n commitów, wykonaj:

git rebase -i HEAD~<number of commits to go back>, więc git rebase -i HEAD~5 jeśli chcesz zobaczyć ostatnie pięć zatwierdzeń.

Następnie w edytorze tekstu zmień słowo pick do drop obok każdego zatwierdzenia, które chcesz usunąć. Zapisz i wyjdź z edytora. Voila!

Additively Zmień historię

Próbować git revert <commit hash>. Odwracać utworzy a Nowy commit, który cofa określone zatwierdzenie.


20
2018-06-15 23:01