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.

Jak byś to naprawił?
Author: Dan Dascalescu, 2011-02-17

4 answers

Najprostsze rozwiązanie ( ale proszę przeczytać całą odpowiedź przed zrobieniem tego):

  1. git rebase -i <hash-of-commit-preceding-the-incorrect-one>
  2. w edytorze, który się otworzy, zmień pick na reword w wierszu dla nieprawidłowego zatwierdzenia.
  3. Zapisz plik i zamknij Edytor.
  4. edytor otworzy się ponownie z błędnym Komunikatem o zatwierdzeniu. Napraw to.
  5. Zapisz plik i zamknij Edytor.
  6. 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.

 89
Author: Dan Moulding,
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.

 33
Author: Abizern,
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.

 5
Author: sebers,
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.

 2
Author: Prabhakar,
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