Eu escrevi a coisa errada em uma mensagem de confirmação.
Como posso mudar a mensagem? A confirmação ainda não foi enviada.
Eu escrevi a coisa errada em uma mensagem de confirmação.
Como posso mudar a mensagem? A confirmação ainda não foi enviada.
Respostas:
git commit --amend
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:
git commit --amend -m "New commit message"
… 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.)
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:
git push <remote> <branch> --force
# Or
git push <remote> <branch> -f
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.
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:
// n is the number of commits up to the last commit you want to be able to edit
git rebase -i HEAD~n
Depois de compactar seus commits - escolha o e/r
para editar a mensagem:
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 +.
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ê.
git commit --amend
não é tão poderoso quanto git 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.
git commit --amend -m "your new message"
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
para reword
(ou nas versões antigas do Git, para edit
) 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?
reword
no lugar de pick
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
git commit --amend
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
git commit --amend -C HEAD
Para corrigir a consolidação anterior removendo-a completamente, execute
git reset --hard HEAD^
Se você deseja editar mais de uma mensagem de confirmação, execute
git rebase -i HEAD~commit_count
(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
git commit --amend
git rebase --continue
Nota: Você também pode "Fazer a alteração desejada" no editor aberto por git commit --amend
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á
git commit -a --amend -m "My new commit message"
git add file.ext
-logit commit --amend
Você também pode usar git filter-branch
para isso.
git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD
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 seu msg-filter
comando com muita sabedoria ;-)
$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:
git commit --amend -c <commit ID>
Caso contrário, haverá uma nova confirmação com um novo ID de confirmação.
-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:
git commit -a --amend -m "My new commit message"
Você pode usar o Git rebasing . Por exemplo, se você deseja modificar novamente para confirmar bbc643cd, execute
$ git rebase bbc643cd^ --interactive
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
$ git add <filepattern>
Agora você pode usar
$ git commit --amend
para modificar o commit e depois disso
$ git rebase --continue
para retornar ao commit principal anterior.
git commit --amend
foram afetadas, use-o git show
e ele exibirá a nova mensagem.
Se você deseja modificar apenas sua última mensagem de confirmação, faça:
git commit --amend
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
o git rebase -i
comando:
git rebase -i HEAD~3
git commit --amend
, e também diz que você pode usar git rebase -i HEAD~commit_count
, tudo que você fez foi tomada em 3
para commit_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:
git filter-branch -f --msg-filter \
'sed "s/<old message>/<new message>/g"' -- --all
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 armazenadas refs/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
:
git checkout -b old_master refs/original/refs/heads/master
git commit --amend
para arrumar comentários ou adicionar arquivos I esqueceu de git add
, mas apenas nunca antes eu git push
ed. Também uso git 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
git commit --amend
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
.
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.
Você tem algumas opções aqui. Você pode fazer
git commit --amend
desde que seja seu último commit.
Caso contrário, se não for o seu último commit, você poderá fazer uma nova análise interativa,
git rebase -i [branched_from] [hash before commit]
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 usar git reflog
e excluir essa confirmação. Então você apenas faz git commit
novamente.
Se for o seu último commit, basta alterar o commit:
git commit --amend -o -m "New commit message"
(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 :
git rebase -i @~9 # Show the last 9 commits in a text editor
Encontre a confirmação que você deseja, altere pick
para r
( 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
ou P
colar após ou antes da posição atual, respectivamente:w
Enter salvar (gravar) um arquivo:q!
Enter sair sem salvar:wq
Enterou ZZ
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:
$ git reset @~3 # Go back three commits
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~3
2c52489 HEAD@{1}: commit: more changes
4a5246d HEAD@{2}: commit: make important changes
e8571e4 HEAD@{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started
* 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.
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:
Commit/Amend Last Commit
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.
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:
git reset --soft HEAD~1
git commit -m 'New and corrected commit message'
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.
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!
Se você apenas deseja editar a confirmação mais recente, use:
git commit --amend
ou
git commit --amend -m 'one line message'
Mas se você deseja editar várias confirmações consecutivas, use rebasing:
git rebase -i <hash of one commit before the wrong commit>
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
git commit --amend
Salve e saia disso e digite
git rebase --continue
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.
Se você deseja alterar apenas sua última mensagem, use o --only
sinalizador ou seu atalho -o
com commit --amend
:
git commit --amend -o -m "New commit message"
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.
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:
git commit --amend -m "your new commit message"
Ou tente o Git reset como abaixo:
# You can reset your head to n number of commit
# NOT a good idea for changing last commit message,
# but you can get an idea to split commit into multiple commits
git reset --soft HEAD^
# It will reset you last commit. Now, you
# can re-commit it with new commit message.
git reset
também pode ajudá-lo a dividir uma confirmação em várias confirmações:
# Reset your head. I am resetting to last commits:
git reset --soft HEAD^
# (You can reset multiple commit by doing HEAD~2(no. of commits)
# Now, reset your head for splitting it to multiple commits
git reset HEAD
# Add and commit your files separately to make multiple commits: e.g
git add app/
git commit -m "add all files in app directory"
git add config/
git commit -m "add all files in config directory"
Aqui você quebrou com êxito seu último commit em dois commits.
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 usar git
. À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:
git rebase -i HEAD~5
* 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:
pick <commit hash> commit message
Em vez de pick
você precisar escrever reword
. Você pode fazer isso no Vim digitando i
. 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 em reword
vez de pick
.
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 que git 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!)
<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
e x
vai fazer isso (pequenos x
apaga os caracteres na frente do cursor, X
irá eliminar para trás). Se você cometer erros, poderá usar u
várias vezes para desfazer. Finalmente, r
é uma abreviação de reword
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
$ git rebase-reword <commit-or-refname>
É 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:
$ git rebase-reword b68f560
$ git rebase-reword HEAD^
g c; g rb -i @~9
(commit e rebase), movo o novo commit para onde eu quero, mude commit
para f
( fixup
) e salve. Se você queria algo mais rápido do que isso, você poderia apelido git commit --fixup=<commit>; git rebase -i --autosquash <commit>^
Eu adicionei os aliases reci
e recm
para recommit (amend)
isso. Agora eu posso fazer isso com git recm
ou git recm -m
:
$ vim ~/.gitconfig
[alias]
......
cm = commit
reci = commit --amend
recm = commit --amend
......
Percebi que havia enviado um commit com um erro de digitação. Para desfazer, fiz o seguinte:
git commit --amend -m "T-1000, advanced prototype"
git push --force
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.
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>
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.
git commit --amend -m "Your new message"
Se você estiver trabalhando em uma ramificação específica, faça o seguinte:
git commit --amend -m "BRANCH-NAME: new message"
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.
git commit --amend -m "BRANCH-NAME : your new message"
git push -f origin BRANCH-NAME # Not a best practice. Read below why?
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 :
git commit --amend -m "BRANCH-NAME : your new message"
git pull origin BRANCH-NAME
git push -f origin BRANCH-NAME
Essa é a melhor prática ao alterar a mensagem de confirmação, se já tiver sido enviada.