Existe uma maneira de editar uma mensagem de confirmação no GitHub?

129

Existe uma maneira de editar uma mensagem de confirmação após confirmar e enviar para o GitHub? Vejo que há um 'adicionar uma nota', bem como comentários embutidos, mas nenhuma edição real de uma mensagem de confirmação. Também há 'alterar confirmação' nas extensões git, mas isso não edita a mensagem existente.

Matthew Peters
fonte
Você pode tentar reverter o commit (consulte algumas opções nesta pergunta do SO: stackoverflow.com/questions/4114095/… ) - apenas certifique-se de fazer o backup de todas as alterações de código para não perdê-las apenas por um comentário!
Traveling Tech Guy
Consulte também Como edito uma mensagem de confirmação incorreta no Git? no estouro de pilha.
Arjan #

Respostas:

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

    Isso abrirá seu editor padrão (geralmente ) com uma lista de confirmações e ações para cada uma. Por padrão, a ação é pick.

  2. Para qualquer confirmação que você deseja alterar a mensagem, altere pickpara reword.

  3. Salve e saia (no vi:) :wq.

  4. Para cada confirmação, você receberá um editor para editar a mensagem de confirmação. Altere-o como achar melhor, salve e saia.

    Quando terminar de editar todas as mensagens de confirmação, você retornará ao prompt de comando e terá uma nova árvore com as mensagens atualizadas.

  5. Agora você pode enviá-los para o github usando git push origin --force.

Se você apenas precisar corrigir seu último commit, poderá substituir as etapas de 1 a 4 por git commit --amend.

Mureinik
fonte
3
@ MatthewPeters Suponho que deve haver uma maneira, mas eu não sei - eu uso a linha de comando diretamente.
Mureinik
4
Parece que você não pode especificar <commit hash que deseja alterar>, mas precisa especificar o hash do commit anterior ao que deseja alterar ou usar o HEAD ~ x em que x é o número de confirmações de HEAD em que o item que você deseja alterar reside.
ssc327
3
@ ssc327 Observe que eu estou ^lá - eu realmente sugeri uma nova alteração no pai do commit que você deseja alterar.
Mureinik
2
@Murenik você está correto, de alguma forma eu perdi vendo o ^
ssc327
11
@deadfish Usando a linha de comando do Windows, você deve digitar ^^para finalizar o comando com um literal, ^ por exemplo: git rebase -i 2c747b32^^
Wyck
35

No Intellij Idea, você pode fazer isso com muita facilidade.

  1. Controle de versão aberta (histórico)
  2. Selecionar guia de log
  3. Selecione confirmar para alterar o comentário
  4. pressione F2 (Mac fn + F2) e atualize sua mensagem de confirmação
fedrbodr
fonte
11
Não está funcionando se você já empurrou para o controle remoto.
paynd
8
Você deve executar git push origin --forceposteriormente, conforme sugerido na resposta do @ Mureinik.
Dan Macák
11
A opção "reformular" está desativada se a confirmação já tiver sido enviada.
huyz 10/01
11
Para fazer isso com o Intellij IDEA para uma confirmação que foi enviada, você deve começar com uma nova rebase interativa (como faria na linha de comando do Git). Para fazer a rebase, clique com o botão direito do mouse em seu projeto -> item de menu "Git" -> "Repositório" -> "rebase ..." (último item de menu). Insira o SHA do commit antes do que você deseja modificar no campo "Onto" e clique em "Rebase". Você receberá o prompt de rebase interativo. Selecione "reformular" na caixa de ação ao lado dos commit que você deseja modificar e clique no botão "Start rebasing" (continuação no próximo comentário)
jplandrain
11
(continuação) Você receberá um prompt de texto para cada confirmação que deseja modificar. Após a modificação das mensagens de log, você poderá aplicar outras modificações (observe que agora a opção "reformular" não fica mais acinzentada). Quando terminar, você poderá forçar o envio de suas modificações para concluir o rebase interativo. Na verdade, todo o processo é exatamente o mesmo da resposta de @Mureinik, que está fazendo isso na linha de comando.
jplandrain 11/04
3

Premissa:

se o seu gráfico git se parecer com ...

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

( df9c192e b7ec061são os hashes de confirmação de destino e confirmação de pai, separadamente)

Solução:

basta digitar as seguintes instruções ...

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

Explicação:

  1. git reset --soft b7ec061 manterá suas alterações de arquivos e redefinirá para commit-parent (ou seja, b7ec061)
  2. git commit -m "..." criará localmente um novo commit
  3. git push -f enviará seu novo commit ao servidor e substituirá o antigo (por exemplo, df9c192)
Alumi Lu
fonte
2

Outra opção é criar uma "confirmação de errata" adicional (e push) que faça referência ao objeto de confirmação que contém o erro - a nova confirmação de errata também fornece a correção. Uma confirmação de errata é uma confirmação sem alterações substanciais no código, mas com uma mensagem importante de confirmação - por exemplo, adicione um caractere de espaço ao seu arquivo leia-me e confirme essa alteração com a importante mensagem de confirmação ou use a opção git --allow-empty. É certamente mais fácil e seguro do que refazer a nova versão, não modifica o histórico verdadeiro e mantém a árvore do ramo limpa (usandoamendtambém é uma boa opção se você estiver corrigindo a confirmação mais recente, mas uma confirmação de errata pode ser uma boa opção para confirmações mais antigas). Esse tipo de coisa ocorre tão raramente que simplesmente documentar o erro é bom o suficiente. No futuro, se você precisar pesquisar em um log git uma palavra-chave de recurso, a confirmação original (incorreta) poderá não aparecer porque a palavra-chave errada foi usada nessa confirmação original (o erro de digitação original) - no entanto, a palavra-chave aparecerá na confirmação da errata, que apontará para o commit original que teve o erro de digitação. Aqui está um exemplo:

$ git log
confirmar 0c28141c68adae276840f17ccd4766542c33cf1d
Autor: Primeiro Último 
Data: Qua 8 de agosto 15:55:52 2018 -0600

    Confirmação de errata:
    Este commit não tem alteração substantiva no código.
    Essa confirmação é fornecida apenas para documentar uma correção em uma mensagem de confirmação anterior.
    Isso pertence ao objeto de confirmação e083a7abd8deb5776cb304fa13731a4182a24be1
    Mensagem de confirmação incorreta original:
        Cor do plano de fundo alterada para vermelho
    Correção (* alteração destacada *):
        Cor do plano de fundo alterada para * azul *

confirmar 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4
Autor: Primeiro Último 
Data: Wed 8 de agosto 15:43:16 2018 -0600

    Alguma mensagem de confirmação provisória

confirmar e083a7abd8deb5776cb304fa13731a4182a24be1
Autor: Primeiro Último 
Data: Wed 8 de agosto 13:31:32 2018 -0600

    Cor do plano de fundo alterada para vermelho
rob_7cc
fonte
Com certeza é seguro, mas há muito texto para ler. Eu prefiro reescrever a história :)
pkalinow
0

A resposta de @Mureinik é boa, mas não é compreensível para iniciantes.

Primeiro método:

  1. Se você quiser editar apenas a mensagem de confirmação mais recente, precisará apenas git commit --amend:
<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. Como você pode ver, confirme a mensagem na parte superior sem nenhum prefixo de comando, como pick, esta já é a página de edição e você pode editar diretamente a mensagem principal e salvar e sair , por exemplo:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. Então faça git push -u origin master --forceou <how you push normally> --force. A chave aqui é --force.

Segundo método:

  1. Você pode ver o hash de confirmação git logou extrair do URL do repositório, o exemplo no meu caso é881129d771219cfa29e6f6c2205851a2994a8835

  2. Então você pode fazer git rebase --interactive 881129d771219cfa29e6f6c2205851a2994a8835ou git rebase -i HEAD^(se for o mais recente)

  3. Você veria:

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. Mas se você vir noop, provavelmente está digitando errado, por exemplo, se você fizer alguma git rebase -i 881129d771219cfa29e6f6c2205851a2994a88falta ^no final, é melhor sair do editor sem salvar e descobrir o motivo:
noop

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
...
  1. Se não houver noopproblema, simplesmente altere a palavra pickpara reword, restará apenas outro (você não edita a mensagem de confirmação neste momento), por exemplo:
reword <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
...
  1. Salvar e sair verá a página de edição semelhante ao método nº 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. Edite a mensagem no topo, da mesma forma que o método nº 1, e salve e saia, por exemplo:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. Novamente, igual ao método nº 1, faça git push -u origin master --forceou <how you push normally> --force. A chave aqui é --force.

Para mais informações, leia o documento .

林果 皞
fonte