2013-05-14 12 views
23

Zatwierdziłem kod testowy przed scaleniem w zdalnej gałęzi. To połączenie miało wiele konfliktów i zajęło sporo czasu, aby go naprawić. Tak więc moja historia wygląda mniej więcej tak:Zmiana komunikatu zatwierdzenia Git przed scaleniem

7ab562c Merge from remote branch 
... whole load of commits brought across from the remote branch... 
f3e71c2 Temporary TESTING COMMIT 

Kod testowy jest w porządku, naprawdę chcę tylko zmienić komunikat zatwierdzenia. Normalnie idę z wyprzedzeniem z git rebase -i f3e71c2^ (ponieważ nic z tego nie zostało jeszcze zepchnięte), ale kolega powiedział mi, że to zepsułoby scalenie. Naprawdę nie chcę zepsuć scalenia :)

Czy mój współpracownik jest poprawny? A jeśli tak, czy jest coś, co mogę zrobić, czy po prostu muszę żyć z tą historią?

+2

'git commit --amend'? – kan

+2

@kan: działa tylko w celu zmiany ostatniego zatwierdzenia, co nie ma tu miejsca. – kampu

+4

Mniej strachu zalecane! Jeśli się zepsułeś, po prostu 'git reset --hard 7ab562c', aby powrócić do stanu post-merge i spróbuj ponownie. Sprawdź także 'git rerere', aby git pamiętał jak rozwiązać konflikt scalania. – chrisk

Odpowiedz

31

można spróbować git rebase --preserve-merges --interactive z:

-p 
--preserve-merges 

Zamiast ignorowania scala, spróbuj je odtworzyć.

Sekcja BUG strony człowieka obejmuje:

na liście spraw przedstawionych przez --preserve-merges --interactive nie reprezentuje topologii wykresu rewizji.
Edycja zatwierdzeń i przeformułowanie komunikatów o zatwierdzeniach powinna działać dobrze, ale próby zmiany kolejności zatwierdzeń zwykle prowadzą do sprzecznych z intuicją wyników.


Jak opisuje jthill „s comment (od -p będzie lepiej zachować scala jeśli rozwiązywania konfliktów były rejestrator):

Można wstecznie światło rerere do scalenia:

git config rerere.enabled true 
git checkout $merge^1 
git merge $merge^2 
git read-tree --reset -u $merge 
git commit -m- 
git checkout @{-1} 
+0

Dziękuję @VonC, ale niestety to nie zadziałało. I 'reword'ed the test commit,' pick'ed the merge, a rebase nadal dusił się podczas scalania, wyrzucając 11 konfliktowych plików. Użyłem sugestii @ chrisk 'git reset', aby wrócić do miejsca, w którym byłem, i myślę, że zostawię to tam: zainwestowany czas nie jest wart naprawienia w tym przypadku. – ChrisWard

+0

@ChrisWard Oznacza to, że musisz aktywować 'rerere' (http://git-scm.com/docs/git-rerere) w celu zapisania rozdzielczości scalania, która * wtedy * zezwoli na ponowne zbieranie' --preserve -merge' bez konfliktu. – VonC

+0

Włączyłem 'rerere' i ponownie spróbowałem' rebase'. Kiedy 'rebase' dostaje się do zatwierdzenia scalenia, widzę' rerere' rejestrujące wstępne obrazy, a następnie konflikty scalania padają. Zgaduję, że to robi, ponieważ nie miałem włączonego 'rerere' kiedy przygotował oryginalne rozwiązania konfliktów, więc nie jest świadomy, w jaki sposób rozwiązałem problemy. Czy 'rerere' powinien być w stanie zebrać te dane z już zatwierdzonego zatwierdzenia? – ChrisWard

-3

Jeśli i tylko, jeśli twoi koledzy nie pchnęli/wyciągnęli zmiany w stosunku do f3e71c2 gdzie indziej, to zadziała. W przeciwnym razie nie wiem, co się stanie. Zmiana komunikatu zatwierdzenia jest całkowicie kosmetyczna (== zmiana metadanych), ponieważ nie masz jeszcze push wydania zatwierdzenia, które chcesz jeszcze poprawić, ale może to spowodować błąd w historii, jeśli twoi koledzy pchnęli/wyciągnęli jakąkolwiek część historii który jest na szczycie.

(dzięki Abizern za wskazanie tego błędu-mode)

+2

Komunikat jest częścią obiektu commit, który jest niezmienny.Jeśli zmienisz wiadomość, zmieniłeś zatwierdzenie, które zmienia historię. – Abizern

+0

@Abizern: To prawda. Jest to jednak istotne tylko wtedy, gdy zatwierdzenia zostały już wypchnięte gdzie indziej (nie zostały wprowadzone). Lokalnie zweryfikowałem, że ta strategia działa w tej sytuacji. – kampu

+0

@Abizern: Przypuszczam jednak, że nie sądziłem, że inni mogli już w międzyczasie przeforsować polecenie na szczycie. To prawdopodobnie spowodowałoby zamieszanie w błąd/historii, więc odpowiednio zredagowałem. – kampu