Jak mogę połączyć dwa zatwierdzenia w jeden?

102

Mam gałąź „firstproject” z 2 zatwierdzeniami. Chcę się pozbyć tych zatwierdzeń i sprawić, by pojawiały się jako pojedyncze zatwierdzenie.

Polecenie git merge --squashbrzmi obiecująco, ale kiedy uruchamiam git merge --squashmój terminal, po prostu wyświetla opcje polecenia. Jaka jest poprawna komenda?

Commit 1:
Added 'homepage.html'
Added 'contacts.html'

Commit 2:
Added 'homepage.php'
Added 'homepage.php'
Deleted 'homepage.html'
Deleted 'contacts.html'
Don P.
źródło
Myślę, że to nie jest właściwe polecenie. Wątpię też, czy w ogóle możesz zmienić takie zmiany.
BSull
Nie, możesz zmienić wiele zatwierdzeń w jedno zatwierdzenie: git-scm.com/book/en/Git-Tools-Rewriting-History moje pytanie dotyczy tylko konkretnego polecenia dla niego.
Don P
@BSull Możesz absolutnie zmieniać commity w dowolny sposób. Można je całkowicie edytować dosłownie w dowolnym momencie. Jeśli dzielisz się kodem z innymi, spowoduje to przepisanie historii i efektywnie będziesz pracować z inną gałęzią niż wszyscy inni.
meagar
To nigdy nie powinno być oszukane. W rzeczywistości ten drugi powinien zostać zamknięty jako zbyt szeroki. Druga kwestia, która jest oznaczona jako oszustwo, jest niepotrzebnie złożona, ponieważ wiąże się z porzuceniem wcześniejszej rebase.
Evan Carroll

Odpowiedzi:

145

Chcesz git rebase -iprzeprowadzić interaktywną rebase .

Jeśli aktualnie jesteś na swoim "zatwierdzeniu 1", a zatwierdzenie, które chcesz scalić, "zatwierdzenie 2" jest poprzednim zatwierdzeniem, możesz uruchomić git rebase -i HEAD~2, co spowoduje pojawienie się edytora z listą wszystkich zatwierdzeń, które przejdzie rebase. Powinieneś zobaczyć dwie linie zaczynające się od „wybierz”. Aby kontynuować zgniatanie, zmień pierwsze słowo drugiego wiersza z „wybierz” na „zgniataj”. Następnie zapisz plik i zakończ. Git zmniejszy twoje pierwsze zatwierdzenie do przedostatniego zatwierdzenia.

Zauważ, że ten proces przepisuje historię twojej gałęzi. Jeśli gdzieś wypychasz swój kod, będziesz musiał, git push -fa każdy, kto udostępni Twój kod, będzie musiał przeskoczyć przez kilka kółek, aby pobrać zmiany.

Zwróć uwagę, że jeśli dwa rozpatrywane zatwierdzenia nie są ostatnimi dwoma zatwierdzeniami w gałęzi, proces będzie nieco inny.

meagar
źródło
2
Jak to zrobić Then write your file, and quit? Używam terminala Android Studio, samej konsoli git lub nawet otworzyłem konsolę git przez oprogramowanie SourceTree. Ale jak zapisać i wyjść?
Dr Jacky,
1
Jak połączyć 2 commity, które nie są ostatnimi dwoma rewizjami w gałęzi?
Weishi Zeng
1
@meagar Myślę, że to ma sens ... jeśli sprawdzisz ten problem (jego duplikat), zgniatanie `` kierunku '' zrobiło dużą różnicę i było źródłem całego problemu (zobacz pierwszy komentarz z około 200 pozytywnymi głosami na temat ' zgniatanie w niewłaściwy sposób ') - stackoverflow.com/a/2568581/43453
PandaWood
1
@PandaWood Źle odczytujesz odpowiedź. Pierwszy sposób był po prostu zły , a nie inny . Możesz zgniatać tylko do tyłu, nie ma sensu myśleć o zmiażdżeniu starszego zatwierdzenia do nowszego, ale gdybyś mógł , byłaby to ta sama operacja.
meagar
1
Zrozumiałem, że „zmień pierwsze słowo drugiej linii” - druga linijka czego?
Andrew Torr,
75

Leniwa prosta wersja dla zapominalskich takich jak ja:

git rebase -i HEAD~3 lub jednak wiele zatwierdzeń zamiast 3.

Włącz to

pick YourCommitMessageWhatever
pick YouGetThePoint
pick IdkManItsACommitMessage

zaangażowany w to

pick YourCommitMessageWhatever
s YouGetThePoint
s IdkManItsACommitMessage

i zrobić jakąś akcję, gdzie trafisz escnastępnie enterzapisać zmiany. [1]

Kiedy pojawi się następny ekran, pozbądź się tych śmieci # lines [2] i utwórz nową wiadomość o zatwierdzeniu lub coś w tym rodzaju, i wykonaj tę samą escape enterakcję. [1]

Wowee, masz mniej zatwierdzeń. Albo po prostu wszystko zepsułeś.


[1] - lub cokolwiek działa z twoją konfiguracją git. To tylko sekwencja, która jest wydajna przy mojej konfiguracji.

[2] - zobaczysz kilka rzeczy, takich jak # this is your n'th commitkilka razy, z oryginalnymi zatwierdzeniami tuż pod tą wiadomością. Chcesz usunąć te wiersze i utworzyć komunikat o zatwierdzeniu, aby odzwierciedlić intencje n zatwierdzeń, które łączysz w 1.

Stachu
źródło
1
Bardzo zwięzłe rozwiązanie - dziękuję. Przydałoby się zarysowanie, że sużyte tutaj oznacza squash. Aby użyć zatwierdzenia, ale połącz go z poprzednim zatwierdzeniem
UrbanConor
Jeśli masz tylko 2zatwierdzenia i chcesz połączyć to samo 2zatwierdzenie, musisz uruchomić git reset --soft HEAD~i git commit --amend.
scrutari
@Stachu Kiedy po tym wydam polecenie push, zapyta o ściągnięcie i scalenie. Co mogę zrobić, aby tego uniknąć?
Abhay Koradiya
Dlaczego nie chcesz ciągnąć i scalać?
Stachu
23
  1. Sprawdź swój oddział i policz ilość wszystkich swoich zatwierdzeń.
  2. Otwórz git bash i napisz: git rebase -i HEAD~<quantity of your commits>(tj. git rebase -i HEAD~5)
  3. W otwartym txtpliku zmień picksłowo kluczowe na squashdla wszystkich zatwierdzeń, z wyjątkiem pierwszego zatwierdzenia (który znajduje się na górze). W przypadku pierwszego zmień go na reword(co oznacza, że ​​w następnym kroku dodasz nowy komentarz do tego zatwierdzenia) i kliknij ZAPISZ! W vimie naciśnij, esca następnie zapisz, wpisując wq!i naciśnij enter.
  4. Prześlij komentarz.
  5. Otwórz Git i wybierz „Pobierz wszystko”, aby zobaczyć nowe zmiany.

Gotowe

user5820972
źródło
Pierwsza mówi mi, jak używać w vimie. Wielkie dzięki
Ho Luong