Chcę zmodyfikować komunikat o zmianach głębiej w historii i wypchnąłem wiele nowych zatwierdzeń.
Jak zmienić wiadomość dotyczącą zatwierdzenia? Czy to możliwe?
Chcę zmodyfikować komunikat o zmianach głębiej w historii i wypchnąłem wiele nowych zatwierdzeń.
Jak zmienić wiadomość dotyczącą zatwierdzenia? Czy to możliwe?
Odpowiedzi:
Wiadomość od Linusa Torvaldsa może odpowiedzieć na Twoje pytanie:
Zmodyfikuj / edytuj stare komunikaty o zatwierdzeniach
Krótka odpowiedź: nie możesz (jeśli jest popchnięty).
ekstrakt (Linus odnosi się do BitKeepera jako BK):
Na marginesie, tylko ze względów historycznych: w BK można.
A jeśli byłeś do tego przyzwyczajony (tak jak ja), było to bardzo praktyczne. Zastosowałbym bombę łatkową od Andrew, zauważyłem, że coś jest nie tak i po prostu wyedytowałem to przed wypchnięciem.
Mogłem zrobić to samo z git. Byłoby dość łatwo, gdyby tylko komunikat o zatwierdzeniu nie był częścią nazwy, a mimo to gwarantował, że historia pozostała nietknięta, i pozwolił na „późniejsze naprawienie komentarzy”.
Ale tego nie zrobiłem.
Po części jest to czysto „wewnętrzna spójność”. Git jest po prostu czystszym systemem dzięki temu, że wszystko jest chronione SHA1, a wszystkie obiekty są traktowane tak samo, niezależnie od typu obiektu. Tak, istnieją cztery różne rodzaje obiektów i wszystkie są naprawdę różne i nie można ich używać w ten sam sposób, ale w tym samym czasie, nawet jeśli ich kodowanie może być inne na dysku, koncepcyjnie wszystkie działają dokładnie to samo.
Jednak wewnętrzna spójność nie jest tak naprawdę wymówką dla bycia nieelastycznym i oczywiście byłoby bardzo elastyczne, gdybyśmy mogli po prostu naprawić błędy po ich wystąpieniu. Więc to nie jest naprawdę mocny argument.
Prawdziwy powód git nie pozwalają na zmianę zatwierdzenia końce wiadomość UP jest bardzo prosta: w ten sposób można zaufać wiadomości. Jeśli później pozwoliłeś ludziom je zmieniać, wiadomości z natury nie są zbyt godne zaufania.
Aby być kompletny, to mógłby przepisać z lokalnym popełnienia historii, aby odzwierciedlić to, co chcesz, jak sugeruje Sykora (z pewnym rebase i zresetować --hard, ciężko oddychać!)
Jednak po opublikowaniu poprawioną historią ponownie (z git push origin +master:master
The +
znak zmuszając push występuje, nawet jeśli to nie skutkuje w „fast-forward” commit) ... ty może dostać się w kłopoty .
Wyciąg z tego innego pytania SO:
Właściwie raz przepchnąłem się z --force do repozytorium git.git i zostałem zbesztany przez Linusa BIG TIME. Stworzy to wiele problemów innym ludziom. Prosta odpowiedź brzmi „nie rób tego”.
Obecnie zastąpienie gita może załatwić sprawę.
Szczegóły: Utwórz tymczasową gałąź pracy
git checkout -b temp
Przywróć zobowiązanie do zastąpienia
git reset --hard <sha1>
Zmień zmianę, dodając odpowiednią wiadomość
git commit --amend -m "<right message>"
Zastąp stary commit nowym
git replace <old commit sha1> <new commit sha1>
wróć do oddziału, w którym byłeś
git checkout <branch>
usuń gałąź tymczasową
git branch -D temp
Pchać
guess
Gotowe.
Możesz użyć git rebase -i
(w stosunku do gałęzi, z której się rozgałęziłeś) „i” do interakcji.
Zastąp pick
następny komentarz do zatwierdzenia, który chcesz zmienić, r
(lub reword
), zapisz i zakończ, a po wykonaniu tej czynności będziesz mógł dokonać edycji.
git push
jeszcze raz i gotowe!
-p
argumentu, rebase
który p
rezerwy łączy.
Załóżmy, że masz takie drzewo:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
Najpierw checkout
gałąź tymczasowa:
git checkout -b temp
W temp
gałęzi, reset --hard
do zatwierdzenia, którego treść chcesz zmienić (na przykład, zatwierdzenie to 946992
):
git reset --hard 946992
Użyj, amend
aby zmienić wiadomość:
git commit --amend -m "<new_message>"
Po tym drzewo będzie wyglądać następująco:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
\
b886a0 [temp]
Następnie cherry-pick
wszystkie zatwierdzenie, które wyprzedza 946992
od master
do temp
i zatwierdza je, użyj, amend
jeśli chcesz również zmienić ich komunikaty:
git cherry-pick 9143a9
git commit --amend -m "<new_message>
...
git cherry-pick 5a6057
git commit --amend -m "<new_message>
Drzewo wygląda teraz następująco:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
\
b886a0 - 41ab2c - 6c2a3s - 7c88c9 [temp]
Teraz wymuś wypchnięcie gałęzi temp do zdalnego:
git push --force origin temp:master
Ostatni krok, usuń gałąź master
lokalną, git fetch origin
aby pobrać gałąź master
z serwera, a następnie przełącz się na gałąź master
i usuń gałąź temp
.
Teraz zarówno twój lokalny, jak i zdalny będą mieć zaktualizowane wszystkie wiadomości.
W naszym sklepie wprowadziłem konwencję dodawania rozpoznawalnie nazwanych tagów z adnotacjami do zatwierdzeń z niepoprawnymi wiadomościami i używania adnotacji jako zamiennika.
Mimo że nie pomaga to ludziom, którzy uruchamiają zwykłe polecenia „git log”, zapewnia nam sposób na naprawienie nieprawidłowych odniesień do śledzenia błędów w komentarzach, a wszystkie moje narzędzia do kompilacji i wydania rozumieją konwencję.
Oczywiście nie jest to ogólna odpowiedź, ale może to być coś, co ludzie mogą zastosować w określonych społecznościach. Jestem pewien, że jeśli zostanie użyty na większą skalę, może pojawić się jakiś rodzaj porcelanowego podłoża, w końcu ...
(Z http://git.or.cz/gitwiki/GitTips#head-9f87cd21bcdf081a61c29985604ff4be35a5e6c0 )
Jak zmienić zobowiązania głębiej w historii
Ponieważ historia w Git jest niezmienna, naprawienie czegokolwiek poza najnowszym zatwierdzeniem (zatwierdzeniem, które nie jest nagłówkiem gałęzi) wymaga przepisania historii ze zmienionego zatwierdzenia i do przodu.
Możesz użyć do tego StGIT, zainicjować gałąź, jeśli to konieczne, cofnąć zatwierdzenie do zatwierdzenia, które chcesz zmienić, pop do niego, jeśli to konieczne, dokonać zmiany, a następnie odświeżyć łatkę (z opcją -e, jeśli chcesz poprawić komunikat o zatwierdzeniu), a następnie wciśnij wszystko i zobowiązanie stg.
Możesz też użyć do tego rebase. Utwórz nową tymczasową gałąź, przewiń ją do zatwierdzenia, który chcesz zmienić, używając git reset --hard, zmień to zatwierdzenie (będzie to początek aktualnej głowy), a następnie ponownie wykonaj gałąź na podstawie zmienionego zatwierdzenia, używając git rebase --onto.
Lub możesz użyć git rebase --interactive, który umożliwia różne modyfikacje, takie jak zmiana kolejności poprawek, zwijanie, ...
Myślę, że to powinno odpowiedzieć na twoje pytanie. Należy jednak pamiętać, że jeśli wypchnąłeś kod do zdalnego repozytorium i ludzie z niego wyciągnęli, to zepsuje to ich historię kodu, a także pracę, którą wykonali. Więc rób to ostrożnie.