Git: edytuj tylko wiadomości poprzednich zatwierdzeń

12

Z leniwych powodów wprowadziłem kilka zatwierdzeń z domyślnymi wiadomościami, a teraz stało się to uciążliwe, ponieważ tak naprawdę nie wiem, co zmieniłem w każdym zatwierdzeniu.

Jak mogę edytować tylko komunikaty poprzednich zatwierdzeń i (jeśli to możliwe) zachować drzewo zmian?

Tuyen Pham
źródło
10
Uważaj na zmieniającą się historię publiczną!
D. Ben Knoble,
2
obawiam się, że odpowiedzi tutaj nie dają ci wystarczająco strasznych ostrzeżeń. to będzie stworzyć ogromny bałagan, czy ktoś wyciągnął swoją historię w międzyczasie - wszystkie moreso jeśli oni popełnione nową pracę na wierzchu!
Eevee,
Użyję go z powodu, mam tutaj prostszą obudowę, jestem jedynym, który korzysta z tego repozytorium.
Tuyen Pham,
3
Informacja: To pytanie jest już (prawdopodobnie wielokrotnie) związane z przepełnieniem stosu .
user202729,

Odpowiedzi:

20

Aby edytować komunikaty zatwierdzania serii zatwierdzeń, uruchamiam

git rebase -i firstsha

gdzie firstshajest identyfikatorem zatwierdzenia nadrzędnego pierwszego zatwierdzenia, które chcę edytować. (Możesz tutaj użyć dowolnego ważnego odwołania, więc git rebase -i HEAD~4pokażą cztery ostatnie zatwierdzenia.)

W edytorze, który zostanie otwarty, zmień wszystkie wpisy „wybierz” na „przeredaguj” przy zatwierdzeniach, które chcesz zmodyfikować, a następnie zamknij edytor; następnie zostaniesz poproszony o wprowadzenie komunikatów zatwierdzenia dla wszystkich wybranych przez siebie zatwierdzeń.

Zauważ, że spowoduje to zmianę drzewa zatwierdzeń, ponieważ zmieni się skrót mieszania zatwierdzeń. Będziesz musiał naciskać nowe drzewo na siłę lub na nową gałąź. Będzie to również popsuć scalenia, więc unikaj edycji zatwierdzeń scalania.

Aby szybko edytować tylko ostatnie zatwierdzenie, uruchom

git commit --amend

(ale uważaj na wszystko, co wystawiono na zatwierdzenie).

Stephen Kitt
źródło
Jak wpłynie to na drzewo zatwierdzeń, czy utworzy ono pośrednią pionową linię w drzewie zatwierdzeń? Miałem teraz tylko jedno drzewo zatwierdzania linii pionowej i trzeba zmienić ponad 100 wiadomości.
Tuyen Pham,
3
Nie utworzy nowej „linii” w drzewie zatwierdzeń, zmieni wszystkie zatwierdzenia. Jeśli twoja historia jest obecnie liniowa, pozostanie liniowa.
Stephen Kitt
To zależy. Czy używasz go sam, a nie wypychasz na serwer? Więc nie, tylko jedna „linia”. Ale w przeciwnym razie mogą być dwa i na podstawie twoich odpowiedzi na pierwsze dwa możemy pomóc ci pozbyć się starej „linii”.
Captain Man,
1
Rebase ma flagę do obsługi scalania (myślę, że tak preserve-merges)
D. Ben Knoble
6

To czego szukasz git rebase.

Jeśli chcesz tylko zmienić poprzednią git commitwiadomość, musisz użyć tylko:

git commit --amend

I wprowadź żądane zmiany w poprzednim zatwierdzeniu, a następnie zapisz zmiany.

Jednak jeśli chcesz zmienić starsze zatwierdzenia, musisz ich użyć rebase.

git rebase -i HEAD~N 

gdzie N jest równe liczbie zatwierdzeń, do których chcesz wrócić, np. 2 lub 12 lub 6 itd. itd.

Tutaj powinieneś dostać edytor tekstu ze swoimi zobowiązaniami. Zmień opcję z pickna, rewordaby zmienić wiadomość.

Po zidentyfikowaniu wszystkich zmian, które chcesz zmienić i odpowiedniej zmianie ich opcji, zapisz i zamknij edytor. Następnie wprowadź zmiany w każdym komunikacie zatwierdzenia. Gdy będziesz zadowolony, możesz uruchomić:

git push --force

I powinieneś zachować swoją historię git, choć z różnymi wartościami skrótu, ponieważ dokonałeś niezbędnych zmian, które chcesz. Oto kilka dodatkowych linków, które powinieneś sprawdzić:

7.6 Narzędzia Git - Przepisywanie historii
Pomoc GitHub - Zmienianie
komunikatu zatwierdzenia StackOverflow - Pytanie na temat zmiany starych komunikatów zatwierdzania

kemotep
źródło
Jeśli „przeredagujesz”, nie musisz „ commit --amend”, chyba że w jakiś sposób zakłócisz proces zatwierdzania.
Stephen Kitt
Dzięki, tutaj kroki, które zrobię jak moje zrozumienie z Twojego postu: 1. Czy git rebase -i firstshato firstshajest rodzic popełnić znajduje hash z popełnić, że chciałbym, aby zmienić treść wiadomości, a następnie w edytorze, zmian pickdo reword, enternowej wiadomości, a następnie wydaj git rebase --continuei zrobić git push --force?
Tuyen Pham,
@StephenKitt, właśnie zauważyłem twoją odpowiedź, robiłem moją, kiedy przesłałeś swoją. Postępuję zgodnie z twoją radą i szukam tych zmian. Jeśli jest to bardziej odpowiednie, mogę scalić moją odpowiedź z twoją, dodając linki do twojej, jeśli uważasz, że lepiej by pasowało do tego pytania niż posiadanie wielu podobnych odpowiedzi.
kemotep
@TuyenPham, musisz zrobić tylko git rebase -i HEAD~Nz N, czyli liczbą zatwierdzeń z powrotem, którą chcesz wykonać. Zmień każdy popełnić opcję, którą chcesz edytować wiadomość od pickcelu reword, zapisać ten plik, wprowadzić zmiany do każdego z tych popełnić plików i zapisać te. Gdy masz pewność, że jesteś skończony, potrzebujesz tylko git push --force [Name of git branch you are were working on]. Zawsze możesz wrócić i zrobić to ponownie lub zrobić to etapami.
kemotep