Estou procurando uma contraparte git commit --amend
no Mercurial, ou seja, uma maneira de modificar o commit ao qual minha cópia de trabalho está vinculada. Estou interessado apenas no último commit, não no arbitrário anterior.
Os requisitos para este procedimento de alteração são:
se possível, não deve exigir extensões. Ele não deve exigir extensões não padrão , ou seja, extensões que não vêm com uma instalação oficial do Mercurial.
se o commit para corrigir for um chefe do meu ramo atual, nenhum novo chefe deverá ser criado. Se o commit não for head, um novo head poderá ser criado.
o procedimento deve ser seguro de forma que, se por qualquer motivo a alteração falhar, desejo que a mesma cópia de trabalho e estado do repositório sejam restaurados como antes da alteração. Por outras palavras, se a alteração em si pode falhar, deve haver um procedimento à prova de falhas para restaurar a cópia de trabalho e o estado do repositório. Estou me referindo a "falhas" que estão na natureza do procedimento de alteração (como, por exemplo, conflitos), não a problemas relacionados ao sistema de arquivos (como restrições de acesso, não ser possível bloquear um arquivo para gravação, ... )
Atualização (1):
- o procedimento deve ser automatizável , para que possa ser executado por um cliente da GUI sem nenhuma interação do usuário necessária.
Atualização (2):
- os arquivos no diretório de trabalho não devem ser tocados (pode haver bloqueios do sistema de arquivos em certos arquivos modificados). Isso significa especialmente que uma abordagem possível pode em nenhum momento exigir um diretório de trabalho limpo.
fonte
Você tem 3 opções para editar confirmações no Mercurial:
hg strip --keep --rev -1
desfazer o último (1) commit (s), para que você possa fazê-lo novamente (consulte esta resposta para obter mais informações).Usando a extensão MQ , fornecida com o Mercurial
Mesmo que não seja fornecido com o Mercurial, vale a pena mencionar a extensão Histedit
Você também pode dar uma olhada na página Histórico de edições do wiki Mercurial.
Em resumo, o histórico de edição é realmente difícil e desencorajado . E se você já fez suas alterações, quase não há nada que possa fazer, exceto se você tiver controle total de todos os outros clones.
Eu não estou realmente familiarizado com o
git commit --amend
comando, mas AFAIK, Histedit é o que parece ser a abordagem mais próxima, mas, infelizmente, ele não é fornecido com o Mercurial. O MQ é realmente complicado de usar, mas você pode fazer quase qualquer coisa com ele.fonte
hg revert myfile
para desfazer a exclusão. Talvez adicionar novamente comhg add
o arquivo após orollback
também funcionar.GUI equivalente para
hg commit --amend
:Isso também funciona na GUI do TortoiseHG (estou usando a versão 2.5):
Passe para a visualização 'Confirmar' ou, na visualização do ambiente de trabalho, selecione a entrada 'diretório de trabalho'. O botão 'Confirmar' tem uma opção chamada 'Alterar revisão atual' (clique na seta suspensa do botão para encontrá-lo).
Advertência :
Mais informações sobre isso no canal de desenvolvimento THG
fonte
Estou sintonizando o que a krtek escreveu. Mais especificamente, solução 1:
Premissas:
Solução:
hg rollback
para desfazer a última confirmaçãoA reversão realmente desfaz a última operação. Sua maneira de trabalhar é bastante simples: operações normais no HG serão anexadas apenas aos arquivos; isso inclui uma confirmação. O Mercurial controla os comprimentos dos arquivos da última transação e, portanto, pode desfazer completamente uma etapa truncando os arquivos de volta aos comprimentos antigos.
fonte
Supondo que você ainda não tenha propagado suas alterações, eis o que você pode fazer.
Adicione ao seu .hgrc:
No seu repositório:
É claro que você não precisa começar com a revisão zero ou abrir todos os patches; nos últimos apenas um pop (
hg qpop
) é suficiente (veja abaixo).remova a última entrada no
.hg/patches/series
arquivo ou os patches que você não gosta. Também é possível reordenar.hg qpush -a; hg qfinish -a
.diff
arquivos (patches não aplicados) ainda em .hg / patches (deve ser um no seu caso).Se você não quer para ter de volta tudo de sua correção, você pode editá-lo usando
hg qimport -r0:tip
(ou similar), em seguida, editar o material e usohg qrefresh
de mesclar as alterações no remendo superior em seu stack. Leiahg help qrefresh
.Ao editar
.hg/patches/series
, você pode até remover vários patches ou reordenar alguns. Se sua última revisão for 99, você pode apenas usá-lohg qimport -r98:tip; hg qpop; [edit series file]; hg qpush -a; hg qfinish -a
.Obviamente, esse procedimento é altamente desencorajado e arriscado . Faça um backup de tudo antes de fazer isso!
Como nota de rodapé, eu já fiz isso milhões de vezes em repositórios particulares.
fonte
hg qfold
, btwhg import -r<prev>:tip
. Uma pena que não há atalho para a versão anterior, como no subversion.Versões recentes do Mercurial incluem a
evolve
extensão que fornece ohg amend
comando. Isso permite alterar uma confirmação sem perder o histórico de pré-alterações no seu controle de versão.Vejo https://www.mercurial-scm.org/doc/evolution/user-guide.html#example-3-amend-a-changeset-with-evolve para obter uma descrição completa da
evolve
extensão.fonte
Pode não resolver todos os problemas da pergunta original, mas como esse parece ser o post de fato sobre como o mercurial pode ser alterado para o commit anterior, adicionarei meus 2 centavos de informação.
Se você é como eu, e só deseja modificar a mensagem de confirmação anterior (corrija um erro de digitação, etc.) sem adicionar nenhum arquivo, isso funcionará
Sem nenhum padrão de inclusão ou exclusão
hg commit
, por padrão, todos os arquivos do diretório ativo serão incluídos. A aplicação de padrão-X 'glob:**'
excluirá todos os arquivos possíveis, permitindo apenas modificar a mensagem de confirmação.Funcionalmente, é o mesmo que
git commit --amend
quando não há arquivos no índice / estágio.fonte
Outra solução pode ser usar o
uncommit
comando para excluir um arquivo específico da confirmação atual.hg uncommit [file/directory]
Isso é muito útil quando você deseja manter a confirmação atual e desmarcar alguns arquivos da confirmação (especialmente útil porque
files/directories
foram excluídos).fonte