Załóżmy, że masz historię zawierającą trzy zatwierdzenia A, B i C :
A-B-C
Chciałbym połączyć dwa zatwierdzenia A i B z jednym zatwierdzeniem AB :
AB-C
próbowałem
git rebase -i A
co otwiera mój edytor z następującą zawartością:
pick e97a17b B
pick asd314f C
Zmieniam to na
squash e97a17b B
pick asd314f C
Następnie Git 1.6.0.4 mówi:
Cannot 'squash' without a previous commit
Czy istnieje sposób, czy jest to po prostu niemożliwe?
git
rebase
git-rebase
git-rewrite-history
chrześcijanin
źródło
źródło
Odpowiedzi:
Używaj
git rebase -i --root
od wersji Git 1.7.12 .W interaktywnym pliku rebase zmień drugą linię zatwierdzenia B na squash i pozostaw pozostałe linie do wyboru :
To połączy dwa zatwierdzenia A i B z jednym zatwierdzeniem AB .
Znaleziono w tej odpowiedzi .
źródło
Próbowałeś:
Możesz zacząć w ten sposób, jeśli będziesz kontynuować,
edit
zamiastsquash
:następnie uruchomić
Gotowe.
źródło
git rebase --abort
zacząć od nowa i zrobić to we właściwy sposób (nie zgniatając pierwszego zatwierdzenia w edytorze)A
było początkowym zatwierdzeniem, ale teraz chceszB
być początkowym zatwierdzeniem. git commity są całymi drzewami, a nie różnicami, nawet jeśli są normalnie opisane i postrzegane w kategoriach wprowadzanych różnic.Ten przepis działa, nawet jeśli istnieje wiele zatwierdzeń między A i B oraz B i C.
źródło
git rebase --onto tmp <sha1_for_B>
W przypadku interaktywnego rebase, musisz to zrobić przed A, aby lista była:
zostać:
Jeśli A jest początkowym zatwierdzeniem, musisz mieć inne wstępne zatwierdzenie, zanim A. Git pomyśli o różnicach, zadziała na różnicy między (A i B) i (B i C). Stąd squash nie działa w twoim przykładzie.
źródło
W przypadku, gdy masz setki lub tysiące zatwierdzeń, skorzystaj z odpowiedzi kostmo z
może być niepraktyczne i powolne, tylko ze względu na dużą liczbę zatwierdzeń, które skrypt rebase musi przetworzyć dwa razy , raz, aby wygenerować listę interaktywnego edytora rebase (gdzie wybierasz, jaką akcję podjąć dla każdego zatwierdzenia), a raz, aby faktycznie wykonać ponowne zastosowanie zobowiązań.
Oto alternatywne rozwiązanie, które pozwoli uniknąć kosztów czasowych generowania listy edytorów interaktywnych baz danych , nie wykorzystując w pierwszej kolejności interaktywnej bazy danych. W ten sposób jest podobny do rozwiązania Charlesa Baileya . Po prostu tworzysz gałąź osieroconą z drugiego zatwierdzenia, a następnie bazujesz na niej wszystkie zatwierdzenia potomków:
Dokumentacja
źródło
W pokrewnym pytaniu udało mi się wymyślić inne podejście do potrzeby przeciwstawiania się pierwszemu zatwierdzeniu, co w gruncie rzeczy czyni go drugim.
Jeśli jesteś zainteresowany: git: jak wstawić zatwierdzenie jako pierwsze, zmieniając wszystkie pozostałe?
źródło
Polecenie git dla drużyny: git rebase -i HEAD ~ [liczba zatwierdzeń]
Powiedzmy, że masz poniżej historię zatwierdzeń git:
wybierz 5152061 feat: Dodano obsługę zapisywania obrazu. (A)
Wybierz 39c5a04 Poprawka: poprawki błędów. (B)
Wybierz poprawkę 839c6b3: konflikt rozwiązany. (DO)
Teraz chcesz zgnieść A i B do AB, wykonaj poniższe czynności:
wybierz 5152061 feat: Dodano obsługę zapisywania obrazu. (A)
s 39c5a04 Poprawka: poprawki błędów. (B)
Wybierz poprawkę 839c6b3: konflikt rozwiązany. (DO)
Uwaga: do zatwierdzenia squasha możemy użyć squasha lub s. Końcowy wynik to:
wybierz 5152061 wyczyn: Dodano obsługę zapisywania obrazu. (AB)
wybierz poprawkę 839c6b3: konflikt rozwiązany. (DO)
źródło
Musisz wykonać trochę magii z wiersza poleceń.
To powinno dać ci oddział, który ma AB i C jako zatwierdzenia.
źródło