Czy istnieje sposób edycji komunikatu zatwierdzenia w GitHub?

129

Czy istnieje sposób edycji komunikatu zatwierdzenia po zatwierdzeniu i wypchnięciu do GitHub? Widzę, że istnieje „dodaj notatkę”, a także wbudowane komentarze, ale nie ma rzeczywistej edycji wiadomości zatwierdzenia. W rozszerzeniach git znajduje się również „zmień zatwierdzenie”, ale to nie edytuje istniejącej wiadomości.

Matthew Peters
źródło
Możesz spróbować cofnąć zatwierdzenie (zobacz kilka opcji w tym pytaniu SO: stackoverflow.com/questions/4114095/... ) - upewnij się tylko, że najpierw wykonałeś kopię zapasową zmian kodu, aby nie stracić ich ze względu na komentarz!
Podróżujący facet techniczny
Zobacz także Jak edytować niepoprawną wiadomość zatwierdzenia w Git? na przepełnienie stosu.
Arjan

Odpowiedzi:

180
  1. git rebase -i <commit hash you want to change>^

    Spowoduje to otwarcie domyślnego edytora (zwykle ) z listą zatwierdzeń i działań dla każdego z nich. Domyślnie akcja jest pick.

  2. Dla każdego zatwierdzenia, które chcesz zmienić wiadomość, zmień pickna reword.

  3. Zapisz i wyjdź (w vi:) :wq.

  4. Dla każdego takiego zatwierdzenia otrzymasz edytor do edycji komunikatu zatwierdzenia. Zmień go według własnego uznania, zapisz i wyjdź.

    Po zakończeniu edycji wszystkich komunikatów zatwierdzenia powrócisz do wiersza polecenia i uzyskasz nowe drzewo ze zaktualizowanymi wiadomościami.

  5. Możesz teraz przesłać je do github za pomocą git push origin --force.

Jeśli potrzebujesz tylko naprawić ostatnie zatwierdzenie, możesz zastąpić kroki 1-4 git commit --amend.

Mureinik
źródło
3
@MatthewPeters Zakładam, że powinien istnieć sposób, ale nie wiem - używam bezpośrednio wiersza poleceń.
Mureinik
4
Nie wydaje się, że możesz określić <wartość skrótu zatwierdzenia, którą chcesz zmienić>, raczej musisz określić skrót skrótu poprzedzającego ten, który chcesz zmienić lub użyć HEAD ~ x gdzie x jest liczbą zatwierdzeń z HEAD gdzie element, który chcesz zmienić, znajduje się.
ssc327,
2
@ ssc327 Pamiętaj, że ja ^tam jestem - naprawdę zasugerowałem bazowanie na nadrzędnym zatwierdzeniu, które chcesz zmienić.
Mureinik,
2
@Murenik masz rację, jakoś przegapiłem zobaczenie ^
ssc327
1
@deadfish Korzystając z wiersza polecenia systemu Windows, należy wpisać, ^^aby zakończyć polecenie dosłownie, ^ np .: git rebase -i 2c747b32^^
Wyck
33

W Intellij Idea możesz to zrobić tak łatwo.

  1. Otwórz kontrolę wersji (historia)
  2. Wybierz zakładkę dziennika
  3. Wybierz zatwierdzenie, aby zmienić komentarz
  4. naciśnij F2 (Mac fn + F2) i zaktualizuj komunikat zatwierdzenia
fedrbodr
źródło
1
Nie działa, jeśli zostałeś już przekazany do pilota.
paynd
7
Musisz wykonać git push origin --forcepóźniej, jak sugeruje odpowiedź @ Mureinik.
Dan Macák
1
Opcja „reword” jest wyłączona, jeśli zatwierdzenie zostało już wypchnięte.
huyz
1
Aby zrobić to z Intellij IDEA dla wypychanego zatwierdzenia, musisz najpierw zacząć od interaktywnego bazowania (tak jak zrobiłbyś to z linii poleceń Git). Aby wykonać rebase, kliknij prawym przyciskiem myszy swój projekt -> element menu „Git” -> „Repository” -> „rebase ...” (ostatni element menu). Wstaw SHA zatwierdzenia przed tym, który chcesz zmodyfikować, w polu „Onto” i kliknij „Rebase”. Otrzymasz wtedy interaktywny monit o zmianę bazy. Wybierz „reword” w polu akcji obok zatwierdzeń, które chcesz zmodyfikować, i kliknij przycisk „Rozpocznij rebasing” (ciąg dalszy w następnym komentarzu)
jplandrain
1
(ciąg dalszy) Zostanie wyświetlony monit tekstowy dla każdego zatwierdzenia, które chcesz zmodyfikować. Po zmodyfikowaniu komunikatów w dzienniku możesz zastosować dalsze modyfikacje (pamiętaj, że teraz opcja „przeredaguj” nie jest już wyszarzona). Po zakończeniu możesz wymusić modyfikacje w celu wypchnięcia interaktywnej bazy. Cały proces jest dokładnie taki sam, jak w odpowiedzi @Mureinik, który zamiast tego robi to z wiersza poleceń.
jplandrain
3

jeśli twój wykres git wygląda jak ...

O   target-commit that you want to change its message [df9c192]
|
O   parent-commit [b7ec061]
|
O

( df9c192i b7ec061osobno hashe zatwierdzania celu i zatwierdzenia nadrzędnego)

możesz po prostu wpisać następujące instrukcje ...

git reset --soft b7ec061
git commit -m "your_new_description"
git push -f

Wyjaśnienie:

  1. git reset --soft b7ec061 zachowa zmiany plików i zresetuje do nadrzędnego zatwierdzenia (tj. b7ec061)
  2. git commit -m "..." utworzy lokalnie nowy zatwierdzenie
  3. git push -f wypchnie twój nowy commit na serwer i zastąpi stary (tj. df9c192)
Alumi Lu
źródło
2

Inną opcją jest utworzenie dodatkowego „zatwierdzenia erraty” (i wypychania), który odwołuje się do obiektu zatwierdzenia zawierającego błąd - nowe zatwierdzenie erraty również zapewnia korektę. Zatwierdzenie errata jest zatwierdzeniem bez istotnych zmian kodu, ale ważnym komunikatem zatwierdzenia - na przykład dodaj jeden znak spacji do pliku readme i zatwierdź tę zmianę ważnym komunikatem zatwierdzenia lub użyj opcji git --allow-empty. Jest to z pewnością łatwiejsze i bezpieczniejsze niż ponowne bazowanie, nie modyfikuje prawdziwej historii i utrzymuje drzewo gałęzi w czystości (używającamendjest również dobrym wyborem, jeśli poprawiasz ostatnie zatwierdzenie, ale zatwierdzenie errata może być dobrym wyborem dla starszych zatwierdzeń). Tego rodzaju rzeczy zdarzają się tak rzadko, że wystarczy udokumentować błąd. W przyszłości, jeśli będziesz musiał przeszukać dziennik git w poszukiwaniu słowa kluczowego funkcji, oryginalne (błędne) zatwierdzenie może się nie pojawić, ponieważ w tym oryginalnym zatwierdzeniu użyto niewłaściwego słowa kluczowego (oryginalnej literówki) - pojawi się jednak słowo kluczowe w erracie commit, która następnie wskaże ci oryginalne zatwierdzenie, które zawierało literówkę. Oto przykład:

$ git log
zatwierdzić 0c28141c68adae276840f17ccd4766542c33cf1d
Autor: pierwszy ostatni 
Data: śr. 8 sierpnia 15:55:52 2018 -0600

    Errata commit:
    To zatwierdzenie nie ma istotnej zmiany kodu.
    To zatwierdzenie służy jedynie do udokumentowania korekty poprzedniego komunikatu zatwierdzenia.
    Dotyczy to zatwierdzenia obiektu e083a7abd8deb5776cb304fa13731a4182a24be1
    Oryginalny niepoprawny komunikat zatwierdzenia:
        Zmieniono kolor tła na czerwony
    Korekta (* podświetlona zmiana *):
        Zmieniono kolor tła na * niebieski *

zatwierdzić 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4
Autor: pierwszy ostatni 
Data: śr. 8 sierpnia 15:43:16 2018 -0600

    Niektóre komunikaty tymczasowego zatwierdzenia

zatwierdzić e083a7abd8deb5776cb304fa13731a4182a24be1
Autor: pierwszy ostatni 
Data: śr. 8 sierpnia 13:31:32 2018 -0600

    Zmieniono kolor tła na czerwony
rob_7cc
źródło
Na pewno jest to bezpieczne, ale dużo tekstu do przeczytania. Wolę przepisać historię :)
pkalinow
0

Odpowiedź @Mureinik jest dobra, ale dla początkującego niezrozumiała.

Pierwsza metoda:

  1. Jeśli chcesz tylko edytować najnowszą wiadomość zatwierdzenia, potrzebujesz tylko git commit --amend, zobaczysz:
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# On branch is up to date with 'origin/master'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. Jak widać, zatwierdzanie wiadomości u góry bez żadnego prefiksu polecenia, np. pickJest to już strona edycji i można bezpośrednio edytować górną wiadomość oraz zapisać i wyjść , np .:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. Następnie zrób git push -u origin master --forcelub <how you push normally> --force. Kluczem jest tutaj --force.

Druga metoda:

  1. Możesz zobaczyć skrót zatwierdzenia przez git loglub wyciąg z adresu URL repozytorium, w moim przypadku jest to przykład881129d771219cfa29e6f6c2205851a2994a8835

  2. Następnie możesz zrobić git rebase --interactive 881129d771219cfa29e6f6c2205851a2994a8835lub git rebase -i HEAD^(jeśli najnowsza)

  3. Zobaczyłbyś:

pick <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#  d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
  1. Ale jeśli widzisz noop, to prawdopodobnie źle wpisujesz, np. Jeśli robisz to, git rebase -i 881129d771219cfa29e6f6c2205851a2994a88czego brakuje ^na końcu, lepiej zamknij edytor bez zapisywania i znajdź przyczynę:
noop

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
...
  1. Jeśli nie ma noopproblemu, po prostu zmień słowo pickna reword, inne po prostu pozostają (w tym momencie nie edytujesz komunikatu zatwierdzenia), np .:
reword <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
...
  1. Zapisz i wyjdź, zobaczy stronę edycji podobną do metody nr 1:
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# interactive rebase in progress; onto b057371
# Last command done (1 command done):
#    reword d996ffb <existing commit message foo bar>
# No commands remaining.
# You are currently editing a commit while rebasing branch 'master' on 'b057371'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. Edytuj wiadomość na górze, tak samo jak metoda nr 1 i zapisz i wyjdź, np .:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. Ponownie, tak samo jak metoda nr 1, wykonaj git push -u origin master --forcelub <how you push normally> --force. Kluczem jest tutaj --force.

Aby uzyskać więcej informacji, przeczytaj dokument .

林果 皞
źródło