Quero modificar uma mensagem de confirmação mais profunda na história e enviei muitas novas confirmações.
Como altero a mensagem de confirmação? É possível?
Quero modificar uma mensagem de confirmação mais profunda na história e enviei muitas novas confirmações.
Como altero a mensagem de confirmação? É possível?
Respostas:
A mensagem de Linus Torvalds pode responder à sua pergunta:
Modificar / editar mensagens de confirmação antigas
Resposta curta: você não pode (se pressionado).
extrato (Linus se refere ao BitKeeper como BK):
Nota lateral, apenas por interesse histórico: em BK você poderia.
E se você está acostumado (como eu), foi realmente bastante prático. Eu aplicaria uma bomba de remendo de Andrew, notaria que algo estava errado e a editaria antes de empurrá-la para fora.
Eu poderia ter feito o mesmo com o git. Teria sido fácil o suficiente fazer com que apenas a mensagem de confirmação não fizesse parte do nome e ainda assim garantir que o histórico não foi tocado e permitir a coisa "corrigir comentários mais tarde".
Mas eu não fiz.
Parte disso é puramente "consistência interna". O Git é simplesmente um sistema mais limpo , graças a tudo ser protegido por SHA1 e a todos os objetos serem tratados da mesma forma, independentemente do tipo de objeto. Sim, existem quatro tipos diferentes de objetos, e todos são realmente diferentes, e não podem ser usados da mesma maneira, mas ao mesmo tempo, mesmo que sua codificação possa ser diferente no disco, conceitualmente todos funcionam exatamente o mesmo.
Mas a consistência interna não é realmente uma desculpa para ser inflexível, e claramente seria muito flexível se pudéssemos corrigir os erros depois que eles acontecessem. Portanto, esse não é um argumento muito forte.
A verdadeira razão pela qual o git não permite alterar a mensagem de confirmação acaba sendo muito simples: dessa forma, você pode confiar nas mensagens. Se você permitir que as pessoas as alterem posteriormente, as mensagens não são inerentemente muito confiáveis.
Para concluir, você pode reescrever o histórico de consolidação local para refletir o que deseja, conforme sugerido por sykora (com algumas alterações e redefinições --hard, gasp!)
No entanto, depois de publicar seu histórico revisado novamente (com a git push origin +master:master
, o +
sinal forçando a ocorrência do envio, mesmo que não resulte em uma confirmação "de avanço rápido") ... você pode ter problemas .
Extraia desta outra questão SO:
Na verdade, uma vez empurrei o --force para o repositório git.git e fui repreendido por Linus BIG TIME. Isso criará muitos problemas para outras pessoas. Uma resposta simples é "não faça".
Atualmente, uma substituição do git pode fazer o truque.
Em detalhes: criar uma ramificação de trabalho temporária
git checkout -b temp
Redefinir para confirmar para substituir
git reset --hard <sha1>
Alterar o commit com a mensagem certa
git commit --amend -m "<right message>"
Substitua o antigo commit pelo novo
git replace <old commit sha1> <new commit sha1>
volte para o ramo onde você estava
git checkout <branch>
remover ramo temporário
git branch -D temp
empurrar
guess
feito.
Você pode usar git rebase -i
(contra o ramo de onde você ramificou) 'i' para interativo.
Substitua o pick
próximo ao comentário de confirmação com o qual deseja alterar r
(ou reword
), salve e saia e, ao fazer isso, você poderá fazer a edição.
git push
mais uma vez e pronto!
-p
argumento de rebase
quais p
reservas são mescladas.
Suponha que você tenha uma árvore como esta:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
Primeiro, checkout
um ramo temporário:
git checkout -b temp
Na temp
ramificação, reset --hard
para um commit que você deseja alterar sua mensagem (por exemplo, esse commit é 946992
):
git reset --hard 946992
Use amend
para alterar a mensagem:
git commit --amend -m "<new_message>"
Depois disso, a árvore ficará assim:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
\
b886a0 [temp]
Então, cherry-pick
toda a cometer esse é antes de 946992
partir master
para temp
e cometê-los, use amend
se você deseja alterar as suas mensagens, bem como:
git cherry-pick 9143a9
git commit --amend -m "<new_message>
...
git cherry-pick 5a6057
git commit --amend -m "<new_message>
A árvore agora fica assim:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
\
b886a0 - 41ab2c - 6c2a3s - 7c88c9 [temp]
Agora force o push do branch temp para controle remoto:
git push --force origin temp:master
A etapa final, exclua a ramificação master
no local, git fetch origin
para extrair a ramificação master
do servidor, depois alterne para ramificação master
e exclua a ramificação temp
.
Agora, tanto o local quanto o remoto, terão todas as mensagens atualizadas.
Em nossa loja, introduzi a convenção de adicionar tags anotadas com nomes reconhecíveis para confirmar com mensagens incorretas e usar a anotação como substituta.
Mesmo que isso não ajude as pessoas que executam comandos casuais "git log", ele nos fornece uma maneira de corrigir referências incorretas de rastreadores de erros nos comentários, e todas as minhas ferramentas de compilação e lançamento entendem a convenção.
Obviamente, essa não é uma resposta genérica, mas pode ser algo que as pessoas possam adotar em comunidades específicas. Tenho certeza que se for usado em uma escala maior, algum tipo de suporte de porcelana poderá surgir, eventualmente ...
(De http://git.or.cz/gitwiki/GitTips#head-9f87cd21bcdf081a61c29985604ff4be35a5e6c0 )
Como mudar compromete-se mais profundamente na história
Como o histórico no Git é imutável, a correção de qualquer coisa, exceto o commit mais recente (commit que não é cabeça de ramificação), requer que o histórico seja reescrito a partir do commit alterado e para a frente.
Você pode usar o StGIT para isso, inicializar a ramificação, se necessário, comprometendo-se com a confirmação que deseja alterar, acessá-la se necessário, fazer uma alteração e atualizar o patch (com a opção -e se desejar corrigir a mensagem de confirmação) e pressione tudo e stg cometem.
Ou você pode usar rebase para fazer isso. Crie uma nova ramificação temporária, rebobine-a para o commit que você deseja alterar usando git reset --hard, altere esse commit (seria o topo do cabeçalho atual) e depois rebase o branch em cima do commit alterado, usando git rebase --onto.
Ou você pode usar o git rebase --interactive, que permite várias modificações, como reordenação de patches, recolhimento, ...
Eu acho que isso deveria responder sua pergunta. No entanto, observe que, se você empurrou o código para um repositório remoto e as pessoas o retiraram, isso atrapalha o histórico de códigos e o trabalho que eles fizeram. Então faça com cuidado.