Digamos que eu tenha um repositório Mercurial local e um remoto. Agora, começo a trabalhar em um recurso. Eu trabalho nisso e, quando penso que está pronto, eu envio o changeset. Testando-o um pouco mais, descobri que poderia melhorar ainda mais esse recurso ajustando algo no código. Eu faço a mudança e me comprometo. 20 minutos depois, descobri que há um bug neste novo recurso, então eu o corrijo e o cometo também.
Agora tenho 3 changesets que realmente gostaria de enviar para o repositório remoto como um changeset com a mensagem "Implementando recurso X", por exemplo.
Como posso fazer isso sem muito trabalho? Acredito que poderia fazer isso com patches, mas parece que dá muito trabalho.
mercurial
push
compression
changeset
Lucas
fonte
fonte
Respostas:
Que tal a extensão Collapse ?
fonte
hg rebase --collapse
. Verifique o hg wiki sobre o comando rebase. Uma vez que esta pergunta é o terceiro resultado geral da pesquisa e a primeira no stackoverflow, pensei que a informação poderia ser útil.hg rebase
com--collapse
dentro de uma única ramificação.A extensão histedit é exatamente o que você está procurando.
ou
exibirá uma lista dos conjuntos de alterações de saída. Da lista você pode
histedit irá pedir-lhe a nova mensagem de commit dos changesets dobrados, cujo padrão é as duas mensagens com "\ n *** \ n" separando-as.
Você também pode obter resultados semelhantes usando a extensão mq, mas é muito mais difícil.
Você também pode usar a extensão de recolhimento apenas para dobrar, mas ela não fornece uma IU tão boa e não fornece uma maneira de editar a mensagem de confirmação resultante. Editar a mensagem de confirmação resultante também permite limpar a mensagem final, que é algo que sempre acabo utilizando.
fonte
Sim, você pode fazer isso com patches: vamos assumir que seu trabalho está nos conjuntos de alterações 100 a 110, inclusive
Crie um patch:
% hg export -o mypatch 100:110 --git
Atualizar para 99:
% hg update 99
Aplique o patch com --no-commit (caso contrário, você receberá todos os seus changesets de volta):
% hg import --no-commit mypatch
Confirme todas as alterações de uma vez:
% hg commit
Agora você tem duas cabeças (110 e 111) que devem ser equivalentes em termos de arquivos que produzem em seu diretório de trabalho - talvez diferencie-as para sanidade antes de remover as antigas:
% hg strip 100
OK, agora que já expliquei tudo, parece longo, mas, tendo feito isso um monte de vezes, não acho que seja muito trabalhoso ...
fonte
hg strip --keep
e compromete tudo em um único commit?hg strip
colocará um backup no.hg/strip-backup/
diretório. Eu acho que não é tão seguro,git reflog
mas ainda fornece algum tipo de resgate.Se você estiver usando TortoiseHg, use pode apenas selecionar duas revisões (use CTRL para selecionar as não subsequentes), clique com o botão direito e selecione "Compactar histórico" .
Depois disso, você obterá uma nova lista de alterações no novo cabeçalho, começando com a primeira alteração selecionada antes, ela conterá todas as listas de alterações descendentes entre as que você selecionou.
Você pode simplesmente remover listas de alterações antigas se não precisar mais delas: use extensões MQ para isso. Novamente, em TortoiseHg: clique com o botão direito na primeira lista de alterações que precisa ser removida com todos os seus descendentes, "Modificar Histórico -> Remover" .
fonte
Meu método preferido de usar mq para esta dobra é usando TortoiseHg conforme descrito aqui . No entanto, isso pode ser feito facilmente na linha de comando da seguinte forma:
(Pode haver uma maneira melhor de fazer a etapa qfold, mas não estou ciente disso, pois geralmente uso o TortoiseHg para essa operação.)
Parece um pouco complicado no início, mas depois que você começa a usar o mq, é bastante simples e natural - além disso, você pode fazer todos os tipos de outras coisas com o mq que podem ser muito úteis!
fonte
hg collapse
ehg histedit
são as melhores maneiras. Ou melhor, seriam as melhores maneiras, se funcionassem de forma confiável ... Eu tivehistedit
que travar com um despejo de pilha em três minutos.Collapse
não é muito melhor.Pensei em compartilhar dois outros BKMs:
hg rebase --collapse
Esta extensão é distribuída com o Mercurial. Ainda não tive problemas com isso. Você pode ter que jogar alguns jogos para contornar as
hg rebase
limitações - basicamente, não gosta de rebase para um ancestral no mesmo branch, nomeado ou padrão, embora permita que seja feito rebase entre branches (nomeados).Mova o repositório (
foo/.hg
) para o diretório de trabalho (bar
) e seus arquivos. Não o contrário.Algumas pessoas falaram sobre a criação de duas árvores clones e a cópia de arquivos entre elas. Ou remendando entre eles. Em vez disso, é mais fácil mover os
.hg
diretórios.Isso funciona desde que os verdadeiros repositórios, as
.hg
árvores, sejam independentes do diretório de trabalho e de seus arquivos.Se eles não são independentes ...
fonte
histedit
é uma opção muito boa para essa tarefa. Eu ainda não confio nisso enquanto faço um git rebase -i, mas ele não trava .. pelo menos as versões mais recentes irão deixá-lo em um branch temporário se algo der terrivelmente errado, então a única vez que os changesets serão removidos é após a confirmação do novo branch.Eu nunca usei o Mercurial, mas isso se parece muito com o que Martin Fowler estava falando em seu blog não muito tempo atrás:
http://martinfowler.com/bliki/MercurialSquashCommit.html
fonte
Por que não apenas
hg strip --keep
comandar?Então você pode confirmar todas as alterações como um único commit.
fonte
HistEdit fará o que você quiser, mas provavelmente é um exagero. Se a única coisa que você precisa é dobrar alguns conjuntos de alterações, a extensão de recolhimento fará o trabalho.
fonte
Suponha que você tenha dois commits
THIS
e não publicadosTHAT
no Mercurial e gostaria que eles se juntassem em um único commit noTHIS
ponto:Verifique se seus commits não foram publicados:
Atualizar para
LAST
confirmar:e a importação confirma até
THIS
no MQ ::Cancele a aplicação de todos os patches e aplique apenas primeiro
THIS
::Junte-se a
THAT
::NOTA Para encontrar o nome,
THATNAME
use:Aplique todos os patches e mova-os para o histórico do repositório ::
Minha postagem no blog sobre o assunto é Juntando dois commits no Mercurial .
fonte
Sim,
strip --keep
funciona para a pergunta do autor. Mas era um pouco diferente dos outros, por exemplo, se você tiver a versão de 1 a 30, mas quiser apenas recolher a versão 12-15. Outras soluções funcionam, mas nãostrip --keep
.fonte