Eu escrevi a coisa errada em uma mensagem de confirmação.
Como posso mudar a mensagem? A confirmação ainda não foi enviada.
git
git-commit
git-rewrite-history
amend
Laurie Young
fonte
fonte
Respostas:
Alterando a mensagem de confirmação mais recente
abrirá seu editor, permitindo que você altere a mensagem de confirmação da confirmação mais recente. Além disso, você pode definir a mensagem de confirmação diretamente na linha de comando com:
… No entanto, isso pode tornar as mensagens de confirmação de várias linhas ou pequenas correções mais difíceis de inserir.
Certifique-se de não ter nenhuma alteração nas cópias de trabalho preparada antes de fazer isso ou elas serão confirmadas também. ( As alterações não faseadas não serão confirmadas.)
Alterando a mensagem de uma confirmação que você já enviou para sua filial remota
Se você já enviou seu commit até sua ramificação remota, depois de alterar o commit localmente (como descrito acima), também precisará forçar o push com:
Aviso: pressionar com força substituirá a ramificação remota pelo estado da sua ramificação local . Se houver commits no ramo remoto que você não tem em sua filial local, você vai perder os commits.
Aviso: tenha cuidado ao alterar confirmações que você já compartilhou com outras pessoas. As confirmações de alteração basicamente as reescrevem para ter IDs SHA diferentes , o que representa um problema se outras pessoas tiverem cópias da confirmação antiga que você reescreveu. Qualquer pessoa que possua uma cópia do commit antigo precisará sincronizar seu trabalho com o commit recém-reescrito, o que às vezes pode ser difícil; portanto, coordene-se com outras pessoas ao tentar reescrever o histórico de commit compartilhado ou evite reescrever commits compartilhados completamente.
Realizar uma nova análise interativa
Outra opção é usar o rebase interativo. Isso permite editar qualquer mensagem que você queira atualizar, mesmo que não seja a mensagem mais recente.
Para fazer uma abóbora Git, siga estas etapas:
Depois de compactar seus commits - escolha o
e/r
para editar a mensagem:Nota importante sobre o rebase interativo
Quando você usa
git rebase -i HEAD~n
, pode haver mais de n confirmações. O Git "coletará" todos os commits nos últimos n commits e, se houver uma mesclagem em algum lugar nesse intervalo, você também verá todos os commits, portanto o resultado será n +.Boa dica:
Se você precisar fazer isso por mais de um único ramo e poderá enfrentar conflitos ao alterar o conteúdo, configure
git rerere
e deixe o Git resolver esses conflitos automaticamente para você.Documentação
Página de manual do git-commit (1)
Página de manual do git-rebase (1)
Página de manual do git-push (1)
fonte
git commit --amend
não é tão poderoso quantogit rebase -i
.git commit --amend
pode corrigir o commit mestre (a?).git push -f origin branchname
git push -f
um pouco perigoso se outras pessoas estiverem usando o mesmo repositório?git commit --amend -c HEAD
. Isso abrirá o editor pré-preenchido com sua antiga mensagem de confirmação, para que você possa alterá-la.fonte
Se o commit que você deseja corrigir não for o mais recente:
git rebase --interactive $parent_of_flawed_commit
Se você deseja corrigir vários commits defeituosos, passe o pai do mais antigo deles.
Um editor será exibido, com uma lista de todos os commit desde o que você forneceu.
pick
parareword
(ou nas versões antigas do Git, paraedit
) na frente de quaisquer confirmações que você deseja corrigir.Para cada confirmação que você deseja reformular , o Git o levará de volta ao seu editor. Para cada confirmação que você deseja editar , o Git coloca você no shell. Se você estiver na concha:
git commit --amend
git rebase --continue
A maior parte dessa sequência será explicada a você pela saída dos vários comandos à medida que você avança. É muito fácil; você não precisa memorizá-lo - lembre-se de que
git rebase --interactive
permite corrigir confirmações, não importa quanto tempo elas foram.Observe que você não desejará alterar confirmações que você já enviou. Ou talvez sim, mas, nesse caso, você terá que tomar muito cuidado para se comunicar com todos que possam ter retirado seus commits e feito um trabalho em cima deles. Como recuperar / ressincronizar depois que alguém envia uma rebase ou redefinição para uma ramificação publicada?
fonte
reword
no lugar depick
para editar a mensagem de log.$parent_of_flawed_commit
é equivalente a$flawed_commit^
.-p
(--preserve-merges
) se houver uma mesclagem após o commit defeituoso.Para alterar a confirmação anterior, faça as alterações desejadas e encene essas alterações e, em seguida, execute
Isso abrirá um arquivo no seu editor de texto representando sua nova mensagem de confirmação. Ele começa preenchido com o texto da sua antiga mensagem de confirmação. Altere a mensagem de confirmação como desejar, salve o arquivo e feche o editor para concluir.
Para alterar a confirmação anterior e manter a mesma mensagem de log, execute
Para corrigir a consolidação anterior removendo-a completamente, execute
Se você deseja editar mais de uma mensagem de confirmação, execute
(Substitua commit_count pelo número de confirmações que você deseja editar.) Este comando inicia seu editor. Marque o primeiro commit (o que você deseja alterar) como "edit" em vez de "pick" e salve e saia do seu editor. Faça a alteração que deseja confirmar e depois execute
Nota: Você também pode "Fazer a alteração desejada" no editor aberto por
git commit --amend
fonte
git rebase -i HEAD~commit_count
também permitirá que você altere as mensagens de confirmação de quantas confirmações você escolher. Apenas marque os commits escolhidos como "reformular" em vez de "selecionar".git reset --hard
aniquila alterações não confirmadas. Substitua--hard
por--soft
.git reset --hard
é um comando perfeitamente legítimo, mas é enganoso dada a pergunta. Você usa--hard
se tiver confirmado alterações que deseja jogar fora, não se tiver digitado um erro de digitação na mensagem de confirmação!Como já mencionado,
git commit --amend
é a maneira de substituir o último commit. Uma observação: se você também deseja substituir os arquivos , o comando seráfonte
git add file.ext
-logit commit --amend
Você também pode usar
git filter-branch
para isso.Não é tão fácil quanto trivial
git commit --amend
, mas é especialmente útil, se você já tiver algumas mesclagens após sua mensagem de confirmação incorreta.Observe que isso tentará reescrever todos os commit entre
HEAD
e o commit defeituoso; portanto, você deve escolher seumsg-filter
comando com muita sabedoria ;-)fonte
$flawed_commit^..HEAD
, não$flawed_commit..HEAD
. como indicado na página de manual: « O comando só reescreverá as referências positivas mencionadas na linha de comando (por exemplo, se você passar a..b, apenas b será reescrito). »Eu prefiro assim:
Caso contrário, haverá uma nova confirmação com um novo ID de confirmação.
fonte
-c
faz algumas coisas. Ele usa a mensagem antiga por padrão, mas também copia informações de autoria (pessoa e hora).-C
faz a mesma coisa, exceto que não solicita que você edite a mensagem.fatal: Option -m cannot be combined with -c/-C/-F/--fixup.
Se você estiver usando a ferramenta Git GUI, há um botão chamado Alterar última confirmação . Clique nesse botão e ele exibirá seus últimos arquivos e mensagens de confirmação. Apenas edite essa mensagem e poderá confirmá-la com uma nova mensagem de confirmação.
Ou use este comando em um console / terminal:
fonte
Você pode usar o Git rebasing . Por exemplo, se você deseja modificar novamente para confirmar bbc643cd, execute
No editor padrão, modifique 'pick' para 'edit' na linha cujo commit você deseja modificar. Faça as alterações e depois prepare-as com
Agora você pode usar
para modificar o commit e depois disso
para retornar ao commit principal anterior.
fonte
git commit --amend
foram afetadas, use-ogit show
e ele exibirá a nova mensagem.Se você deseja modificar apenas sua última mensagem de confirmação, faça:
Isso o levará ao seu editor de texto e permitirá que você altere a última mensagem de confirmação.
Se você deseja alterar as três últimas mensagens de confirmação ou qualquer uma das mensagens de confirmação até esse ponto, forneça
HEAD~3
ogit rebase -i
comando:fonte
git commit --amend
, e também diz que você pode usargit rebase -i HEAD~commit_count
, tudo que você fez foi tomada em3
paracommit_count
.Se você precisar alterar uma mensagem de confirmação antiga em vários ramos (ou seja, o commit com a mensagem incorreta está presente em vários ramos), convém usar:
O Git criará um diretório temporário para reescrever e fazer backup adicional de referências antigas no
refs/original/
.-f
imporá a execução da operação. Isso é necessário se o diretório temporário já estiver presente ou se já houver referências armazenadasrefs/original
. Se não for esse o caso, você pode soltar esse sinalizador.--
separa as opções de ramificação do filtro das opções de revisão.--all
garantirá que todas as ramificações e tags sejam reescritas.Devido ao backup de suas referências antigas, você pode facilmente voltar ao estado antes de executar o comando.
Digamos, você deseja recuperar seu mestre e acessá-lo na ramificação
old_master
:fonte
git commit --amend
para arrumar comentários ou adicionar arquivos I esqueceu degit add
, mas apenas nunca antes eugit push
ed. Também usogit filter-branch
quando quero mexer totalmente com o histórico da versão, mas o OP não quer isso, então essa resposta precisa de um grande aviso de saúde - não tente fazer isso em casa, espreitadelas !!Usar
Para entender isso em detalhes, uma excelente postagem é 4. Reescrevendo o Git History . Ele também fala sobre quando não usar
git commit --amend
.fonte
git commit --amend
resposta já havia sido dada (várias vezes) antes de você escrever a sua. Por que você publicou novamente? Se você quiser adicionar um link para "Reescrevendo o histórico do Git", poderá ter editado uma das respostas existentes ou deixado um comentário.Alterar
Você tem algumas opções aqui. Você pode fazer
desde que seja seu último commit.
Rebase interativo
Caso contrário, se não for o seu último commit, você poderá fazer uma nova análise interativa,
Então, dentro da reestruturação interativa, você simplesmente adiciona edição a esse commit. Quando surgir, faça
git commit --amend
ae modifique a mensagem de confirmação. Se você deseja reverter antes desse ponto de confirmação, também pode usargit reflog
e excluir essa confirmação. Então você apenas fazgit commit
novamente.fonte
Se for o seu último commit, basta alterar o commit:
(Usando o sinalizador
-o
(--only
) para garantir que você altere apenas a mensagem de confirmação)Se for um commit oculto, use a incrível re-interativa interativa :
Encontre a confirmação que você deseja, altere
pick
parar
(reword
) e salve e feche o arquivo. Feito!Tutorial do Miniature Vim (ou, como fazer o rebase com apenas 8 pressionamentos de tecla
3j
cw
r
EscZZ
):vimtutor
se você tiver tempoh
j
k
l
correspondem às teclas de movimento ←↓↑→3j
desce três linhasi
para entrar no modo de inserção - o texto digitado aparecerá no arquivoc
para sair do modo de inserção e retornar ao modo "normal"u
desfazerr
para refazerdd
,dw
,dl
Para apagar uma linha, palavra ou letra, respectivamentecc
,cw
,cl
Para mudar uma linha, palavra ou letra, respectivamente (o mesmo quedd
i
)yy
,yw
,yl
Copiar ( "puxão") uma linha, palavra ou letra, respectivamentep
ouP
colar após ou antes da posição atual, respectivamente:w
Enter salvar (gravar) um arquivo:q!
Enter sair sem salvar:wq
EnterouZZ
para salvar e sairSe você editar muito o texto, mude para o layout do teclado Dvorak , aprenda a digitar e aprenda o Vim. Vale a pena o esforço? Sim.
ProTip ™: Não tenha medo de experimentar comandos "perigosos" que reescrevem o histórico * - O Git não exclui seus commits por 90 dias por padrão; você pode encontrá-los no reflog:
* Cuidado com opções como
--hard
e no--force
entanto - elas podem descartar dados. * Além disso, não reescreva o histórico nos ramos em que você está colaborando.fonte
nano
? Estamos falando de modificações triviais que precisam ser feitas em um arquivo de texto, não de codificação hardcore que geraria uma guerra de chamas sobre o "melhor" editor de texto.ddjjpZZ
move um commit 2 para baixo. Não há nada de misterioso no conhecimento básico do Vim; são necessários 10 minutos para ficar mais confortável com o Vim do que com o nano.Se você estiver usando a GUI do Git, poderá alterar o último commit que não foi enviado com:
fonte
Eu uso a GUI do Git o máximo que posso e isso oferece a opção de alterar o último commit:
Além disso,
git rebase -i origin/master
é um bom mantra que sempre apresentará os commits que você fez no topo do master e oferece a opção de alterar, excluir, reordenar ou squash. Não há necessidade de se apossar desse hash primeiro.fonte
Uau, então existem várias maneiras de fazer isso.
Outra maneira de fazer isso é excluir o último commit, mas mantenha as alterações para que você não perca seu trabalho. Você pode fazer outra confirmação com a mensagem corrigida. Isso seria algo como isto:
Eu sempre faço isso se esquecer de adicionar um arquivo ou fazer uma alteração.
Lembre - se de especificar em
--soft
vez de--hard
, caso contrário, você perderá totalmente o commit.fonte
git commit --amend
exceto que é um processo de duas etapas.--amend
manterá as informações do autor, mas a pergunta pede apenas para alterar a mensagem.Para quem procura uma GUI do Windows / Mac para ajudar na edição de mensagens antigas (ou seja, não apenas na última mensagem), recomendo o Sourcetree . Os passos a seguir estão abaixo.
Para confirmações que ainda não foram enviadas para um controle remoto:
Unable to create 'project_path/.git/index.lock': File exists.
ao tentar modificar várias mensagens de confirmação ao mesmo tempo. Não tenho certeza exatamente qual é o problema ou se será corrigido em uma versão futura do Sourcetree, mas se isso acontecer, recomendo refazê-lo um de cada vez (mais lento, mas parece mais confiável).... Ou ... para confirmações que já foram enviadas:
Siga as etapas nesta resposta , que são semelhantes às anteriores, mas exigem que um comando adicional seja executado a partir da linha de comando (
git push origin <branch> -f
) para forçar a ramificação forçada. Eu recomendo ler tudo e aplicar o cuidado necessário!fonte
Se você apenas deseja editar a confirmação mais recente, use:
ou
Mas se você deseja editar várias confirmações consecutivas, use rebasing:
Em um arquivo, como o acima, escreva
edit/e
ou uma das outras opções e clique em salvar e sair.Agora você estará no primeiro commit errado. Faça alterações nos arquivos, e eles serão testados automaticamente para você. Tipo
Salve e saia disso e digite
para passar para a próxima seleção até terminar todas as suas seleções.
Observe que essas coisas alteram todos os seus hashes SHA após esse commit específico.
fonte
Se você deseja alterar apenas sua última mensagem, use o
--only
sinalizador ou seu atalho-o
comcommit --amend
:Isso garante que você não aprimore acidentalmente seu commit com coisas em etapas. Claro que é melhor ter uma
$EDITOR
configuração adequada . Então você pode deixar a-m
opção de fora e o Git preencherá previamente a mensagem de confirmação com a antiga. Desta forma, pode ser facilmente editado.fonte
git commit --amend
. A questão era muito específica, portanto, mais longa! = Melhor. A menção decisiva da-o
bandeira provavelmente seria enterrada no restante das informações. Também não estou confortável em editar uma resposta que já tenha tantos votos.--only
opção com--amend
esteja disponível desde o git 1.3.0, ela não funcionou corretamente até que foi corrigida no 1.7.11.3 ( ea2d4ed35902ce15959965ab86d80527731a177c ). Portanto, a resposta de volta à direita em 2008 provavelmente teria sido algo como:git stash; git commit --amend; git stash pop
.Atualize sua última mensagem de confirmação incorreta com a nova mensagem de confirmação em uma linha:
Ou tente o Git reset como abaixo:
Usando reset para dividir confirmações em confirmações menores
git reset
também pode ajudá-lo a dividir uma confirmação em várias confirmações:Aqui você quebrou com êxito seu último commit em dois commits.
fonte
git commit --amend
, exatamente como diz a resposta votada no topo . Além disso,git reset --soft HEAD^
funciona de maneira idêntica à redefinição suave nesta resposta anterior , porque ambas são redefinidas para o primeiro commit pai.git reset
a solução apenas para ter uma idéia de dividir uma mensagem de confirmação em várias mensagens de confirmação. Porque, eu enfrentei esse problema quando, eu estava começando a usargit
. Às vezes, isso pode ser realmente útil. :)Nesta pergunta há muitas respostas, mas nenhuma delas explica em detalhes como alterar as mensagens de confirmação mais antigas usando o Vim . Eu mesmo estava tentando fazer isso, então aqui vou escrever em detalhes como fiz isso especialmente para pessoas que não têm experiência no Vim!
Eu queria alterar meus cinco últimos commits que já enviei para o servidor. Isso é bastante "perigoso", porque se alguém já se retirou disso, você pode estragar as coisas alterando as mensagens de confirmação. No entanto, quando você estiver trabalhando em seu próprio ramo e tiver certeza de que ninguém o puxou, poderá alterá-lo assim:
Digamos que você queira alterar seus cinco últimos commits e digite isso no terminal:
* Onde 5 é o número de mensagens de confirmação que você deseja alterar (por isso, se você deseja alterar a décima para a última confirmação, digite 10).
Este comando o levará ao Vim, onde você pode 'editar' seu histórico de confirmação. Você verá seus cinco últimos commits no topo desta maneira:
Em vez de
pick
você precisar escreverreword
. Você pode fazer isso no Vim digitandoi
. Isso faz você entrar no modo de inserção . (Você vê que está no modo de inserção com a palavra INSERIR na parte inferior.) Para as confirmações que deseja alterar, digite emreword
vez depick
.Então você precisa salvar e sair desta tela. Você faz isso entrando primeiro no 'modo de comando' pressionando o Escbotão (você pode verificar se está no modo de comando se a palavra INSERIR na parte inferior desapareceu). Então você pode digitar um comando digitando
:
. O comando para salvar e sair éwq
. Então, se você digitar,:wq
está no caminho certo.Em seguida, o Vim examinará todas as mensagens de confirmação que você deseja reformular e aqui você poderá alterar as mensagens de confirmação. Você fará isso entrando no modo de inserção, alterando a mensagem de confirmação, entrando no modo de comando e salvando e saindo. Faça isso cinco vezes e você estará fora do Vim!
Então, se você já enviou suas confirmações erradas, precisa
git push --force
substituí-las. Lembre-se de quegit push --force
é uma coisa muito perigosa a se fazer, portanto, certifique-se de que ninguém retirou do servidor desde que você enviou suas confirmações erradas!Agora você mudou suas mensagens de confirmação!
(Como você vê, eu não sou tão experiente no Vim, por isso, se eu usei o 'jargão' errado para explicar o que está acontecendo, fique à vontade para me corrigir!)
fonte
<nitpick>
Não há "threads" no Stack Overflow, porque não é um fórum de discussão, existem apenas "perguntas", "respostas" e "postagens".</nitpick>
. Além disso, nem todas as versões do Vim são iguais, nem todas permitem excluir caracteres no modo de inserção (faz sentido de certa forma, certo?). Se você quer sempre ser capaz de excluir caracteres no Vim,X
ex
vai fazer isso (pequenosx
apaga os caracteres na frente do cursor,X
irá eliminar para trás). Se você cometer erros, poderá usaru
várias vezes para desfazer. Finalmente,r
é uma abreviação dereword
no editor de rebase interativo.cw
digitado no início (embora a pergunta não seja sobre o vim, eu concordo).nano
o mcedit do Midnight Commander.Você pode usar git-rebase-reword
Ele foi projetado para editar qualquer confirmação (e não apenas a última) da mesma maneira que
commit --amend
É nomeado após a ação de rebase interativa para alterar uma confirmação: "reformulação". Veja este post e o modo interativo man- section-
Exemplos:
fonte
g c; g rb -i @~9
(commit e rebase), movo o novo commit para onde eu quero, mudecommit
paraf
(fixup
) e salve. Se você queria algo mais rápido do que isso, você poderia apelidogit commit --fixup=<commit>; git rebase -i --autosquash <commit>^
Eu adicionei os aliases
reci
erecm
pararecommit (amend)
isso. Agora eu posso fazer isso comgit recm
ougit recm -m
:fonte
Percebi que havia enviado um commit com um erro de digitação. Para desfazer, fiz o seguinte:
Aviso: forçar o envio de suas alterações substituirá o ramo remoto pelo local. Certifique-se de não substituir o que deseja manter. Também seja cauteloso ao forçar o envio de uma confirmação alterada (reescrita) se alguém compartilhar o ramo com você, pois precisará reescrever seu próprio histórico se tiver a cópia antiga da confirmação que você acabou de reescrever.
fonte
Eu gosto de usar o seguinte:
git status
git add --all
git commit -am "message goes here about the change"
git pull <origin master>
git push <origin master>
fonte
Se você não enviou o código para sua ramificação remota ( GitHub / Bitbucket ), você pode alterar a mensagem de confirmação na linha de comando, como abaixo.
Se você estiver trabalhando em uma ramificação específica, faça o seguinte:
Se você já inseriu o código com a mensagem errada e precisa ter cuidado ao alterar a mensagem. Ou seja, depois de alterar a mensagem de confirmação e tentar enviá-la novamente, você acaba tendo problemas. Para facilitar, siga estas etapas.
Por favor, leia toda a minha resposta antes de fazê-lo.
Nota importante: Ao usar o push forçado diretamente, você pode acabar com problemas de código nos quais outros desenvolvedores estão trabalhando no mesmo ramo. Portanto, para evitar esses conflitos, você precisa extrair o código de sua ramificação antes de fazer a força forçar :
Essa é a melhor prática ao alterar a mensagem de confirmação, se já tiver sido enviada.
fonte