Chciałbym usunąć wybrane wpisy dziennika zatwierdzeń z liniowego drzewa zatwierdzeń, aby wpisy nie były wyświetlane w dzienniku zatwierdzeń.
Moje drzewo zmian wygląda mniej więcej tak:
R--A--B--C--D--E--HEAD
Chciałbym usunąć wpisy B i C, aby nie były wyświetlane w dzienniku zatwierdzeń, ale zmiany z A na D powinny zostać zachowane. Może przez wprowadzenie pojedynczego zatwierdzenia, aby B i C stały się BC, a drzewo wygląda.
R--A--BC--D--E--HEAD
Lub, idealnie, po A następuje D bezpośrednio. D 'reprezentujące zmiany z A na B, B na C i C na D.
R--A--D'--E--HEAD
czy to możliwe? jeśli tak to jak?
Jest to dość nowy projekt, więc na razie nie ma oddziałów, dlatego też nie łączy się.
rebase
może usunąć stare / utworzyć nowe zatwierdzenia. Nie wiem, co oznaczają „wpisy dziennika zatwierdzania”.git log
pokazuje „dziennik zatwierdzenia” git-scm.com/docs/git-log . I chciałem pozbyć się dwóch wpisów z tego dziennika - nie zmian.Odpowiedzi:
git-rebase (1) robi dokładnie to.
git awsome-ness [git rebase --interactive] zawiera przykład.
git-rebase
w publicznych (zdalnych) zatwierdzeniach.commit
lubstash
bieżące zmiany).$EDITOR
.pick
przedC
iD
przezsquash
. Połączy C i D z B. Jeśli chcesz usunąć zatwierdzenie, po prostu usuń jego linię.Jeśli się zgubiłeś, wpisz:
źródło
git rebase -i D [A]
?push -f
twoje zmiany. Nie rób tego, jeśli nie pracujesz sam.git-rebase
instrukcji obsługi punktu i maszyny powrotnej do posta na blogu.źródło
Oto sposób na usunięcie określonego identyfikatora zatwierdzenia, znając tylko identyfikator zatwierdzenia, który chcesz usunąć.
Zauważ, że faktycznie usuwa to zmianę wprowadzoną przez zatwierdzenie.
źródło
Aby rozwinąć odpowiedź JF Sebastiana:
Możesz użyć git-rebase, aby łatwo wprowadzać wszelkiego rodzaju zmiany w historii zmian.
Po uruchomieniu git rebase --interactive w edytorze $ pojawi się:
Możesz przenosić wiersze, aby zmienić kolejność zatwierdzeń, i usuwać wiersze, aby usunąć to zatwierdzenie. Możesz też dodać polecenie, aby połączyć (zgnieść) dwa zatwierdzenia w jeden zatwierdzenie (poprzednie zatwierdzenie jest powyższym zatwierdzeniem), edytować zatwierdzenia (co zostało zmienione) lub zmienić komunikaty zatwierdzenia.
Myślę, że pick oznacza po prostu, że chcesz zostawić to zatwierdzenie w spokoju.
(Przykład pochodzi stąd )
źródło
Możesz nieinteraktywnie usunąć B i C w swoim przykładzie za pomocą:
lub symbolicznie
Zauważ, że zmiany w B i C nie będą w D; będą one zniknął .
źródło
Jeszcze jeden sposób
wybierz skrót, którego chcesz użyć jako podstawy, a powyższe polecenie powinno uczynić go interaktywnym, abyś mógł zgnieść wszystkie najważniejsze wiadomości (musisz zostawić najstarszy)
źródło
Uważam ten proces za znacznie bezpieczniejszy i łatwiejszy do zrozumienia, tworząc kolejną gałąź z SHA1 A i wybierając pożądane zmiany, aby upewnić się, że jestem zadowolony z wyglądu tej nowej gałęzi. Następnie łatwo jest usunąć starą gałąź i zmienić jej nazwę na nową.
źródło
Właśnie zebrałem odpowiedzi wszystkich ludzi: (m new to git plz użyj go tylko w celach informacyjnych)
git rebase, aby usunąć wszelkie zatwierdzenia
git log
git rebase -i HEAD ~ 1
Wtedy ekran będzie wyglądał mniej więcej tak:
Tutaj zmień pierwszy wiersz zgodnie z potrzebami (używając komend wymienionych powyżej, tj. „Upuść”, aby usunąć zatwierdzenie itp.) Po zakończeniu edycji naciśnij „: x”, aby zapisać i wyjść z edytora (dotyczy tylko edytora vim)
I wtedy
git push
Jeśli występuje problem z wyświetlaniem, musisz na siłę przesuwać zmiany do pilota (JEST BARDZO KRYTYCZNY: nie zmuszaj do popychania, jeśli pracujesz w zespole)
git push -f origin
źródło
Możesz do tego użyć git cherry-pick. „cherry-pick” zastosuje zatwierdzenie do gałęzi, na której jesteś teraz.
to zrób
następnie zastosuj zatwierdzenia D i E.
Spowoduje to pominięcie zatwierdzenia B i C. Powiedziawszy, że zastosowanie D zatwierdzenia do gałęzi bez B może być niemożliwe, więc YMMV.
źródło
reset --hard
, że nierebase --hard
(co nie istnieje)