Przypadkowo wciśnięty commit: Zmień komunikat git commit
W moim lokalnym repo mam jeden commit z nieprawidłowym Komunikatem commit.
Opublikowałem już niepoprawny komunikat commit z git push
.
Teraz zdalne repo (które jest hostowane na GitHub) ma również niepoprawny komunikat commit.
Próbowałem już git commit --amend
, ale okazało się, że to nie zadziała dla mnie w tej sytuacji, ponieważ zrobiłem dodatkowe commity od niepoprawnego.
4 answers
Najprostsze rozwiązanie ( ale proszę przeczytać całą odpowiedź przed zrobieniem tego):
git rebase -i <hash-of-commit-preceding-the-incorrect-one>
- w edytorze, który się otworzy, zmień
pick
nareword
w wierszu dla nieprawidłowego zatwierdzenia. - Zapisz plik i zamknij Edytor.
- edytor otworzy się ponownie z błędnym Komunikatem o zatwierdzeniu. Napraw to.
- Zapisz plik i zamknij Edytor.
-
git push --force
aby zaktualizować GitHub.
Oznacza to, że będziesz publikować zmodyfikowaną wersję wcześniej opublikowane repozytorium. Jeśli ktoś wyciągnął lub pobrał z twojego repo między popełnieniem błędu z nieprawidłowym Komunikatem o zatwierdzeniu, a poprawieniem go, wtedy doświadczy pewnych trudności później. Więc upewnij się, że możesz zaakceptować tę konsekwencję, zanim spróbujesz tego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-07 11:31:29
Zamiast przejść całą trasę rebase dla jednego commita:
git reset --soft head~
git commit -m "The message you wanted to use"
git push -f
Możesz zobaczyć opcje na stronie Man Git-reset.
W przypadku projektu, nad którym pracujesz tylko Ty, zmieniona historia nie powinna stanowić problemu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-11 13:25:42
Jeśli musisz zmienić starą wiadomość zatwierdzającą w wielu gałęziach (np. commit z błędną wiadomością jest obecny w wielu gałęziach), możesz użyć
git filter-branch -f --msg-filter 'sed "s/<old message>/<new message>/g"' -- --all
Aby zastąpić komunikat commit.
Git utworzy tymczasowy katalog do przepisywania i dodatkowo utworzy kopię zapasową starych referencji w refs / original/.
-f
wymusi wykonanie operacji. Jest to konieczne, jeśli katalog tymczasowy jest już obecny lub jeśli istnieją już referencje przechowywane pod refs / original . Jeśli tak nie jest, możesz opuścić tę flagę.
--
oddziela opcje filter-branch od opcji rewizji
--all
upewni się, że wszystkie gałęzie i znaczniki zostaną przepisane.
Dzięki kopii zapasowej starych referencji, możesz łatwo wrócić do stanu przed wykonaniem polecenia.
Powiedzmy, że chcesz odzyskać swój master i uzyskać do niego dostęp w gałęzi old_master:
git checkout -b old_master refs/original/refs/heads/master
Po zadowoleniu ze zmian użyj git push-f aby przesunąć zmiany do publicznego repo.
Zauważ, że powinieneś poinformować o tym swoich współpracowników, ponieważ wszystkie skróty commitów zaczynające się od pierwszego zmodyfikowanego zostały zmienione.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-15 09:46:17
Jeśli kod nie zostanie wysłany do zdalnej gałęzi (Github / Bitbucket), możesz zmienić komunikat commit w wierszu poleceń, jak poniżej.
git commit --amend -m "Your new message"
Jeśli pracujesz nad konkretną gałęzią, zrób to.
git commit --amend -m "BRANCH-NAME: new message"
Jeśli już wypchnąłeś kod z błędną wiadomością, musisz być ostrożny przy zmianie wiadomości. np. po zmianie komunikatu commit i ponownym naciśnięciu go, pojawią się problemy. Aby uczynić go płynnym, wykonaj następujące kroki. [[9]}proszę przeczytać całość odpowiedz przed zrobieniem
git commit --amend -m "BRANCH-NAME : your new message"
git push -f origin BRANCH-NAME # Not a best practice. Read below why?
Ważna uwaga: Kiedy używasz force push bezpośrednio, możesz skończyć z problemami z kodem, które inni programiści pracują nad tą samą gałęzią. Aby uniknąć tego konfliktu, musisz pobrać kod ze swojej gałęzi przed wykonaniem force push
git commit --amend -m "BRANCH-NAME : your new message"
git pull origin BRANCH-NAME
git push -f origin BRANCH-NAME
Jest to najlepsza praktyka przy zmianie komunikatu commit, jeśli został on już wypchnięty.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-13 07:08:36