Eu tenho um par de commits que deveria ser apenas um. Se eu estivesse usando o git, usaria:
git rebase -i <some-commit-before>
e depois esmagá-los.
Posso fazer isso no mercurial? Se sim, como?
Sim, você pode fazer isso usando o mercurial sem quaisquer extensões por Concatenating Changesets .
Como alternativa, se quiser usar uma extensão, você pode usar:
Meu favorito é o
hg strip --keep
comando. E então eu confirmo todas as mudanças em um commit.É a forma mais rápida e confortável para mim, porque gosto de fazer muitos pequenos compromissos no meu trabalho diário;)
Nota 1:
strip
precisa de uma extensão embutidamq
para ser habilitada.Nota 2: Meu cliente Git / Mercurial favorito (SmartGit / Hg) anexa por
--keep
parâmetro padrão durantestrip
. E o que é ainda mais conveniente: oferece uma opção chamadajoin commits
:]fonte
hg strip --keep --rev [rev]
Onderev
está o número de revisão do primeiro commit que você deseja esmagar com o último--rev
é opcional, o comando completo éhg strip --keep [rev]
hg help strip
fornecehg strip [-k] [-f] [-n] [-B bookmark] [-r] REV...
, e omitindo a revisão, forneceabort: empty revision set
.hg strip
não é a melhor ideia. Não é exatamente seguro. Experimentehg histedit
, talvez até tente usar a extensão evoluir.A extensão Rebase funcionou perfeitamente. Para esmagar 2 commits:
Dot é um atalho para a revisão atual.
É ainda mais fácil quando você tem alguns commits em um branch e deseja agrupá-los todos em um:
Como funciona:
(de http://mercurial-scm.org/wiki/RebaseExtension#Collapsing )
fonte
evolve
é uma extensão do mercurial que nos ajuda a ter uma história mutável segura, embora ainda seja experimental. Você pode usá-lo clonando-o de sua repo e adicioná-lo em sua .hgrc assim.Supondo que você clonou o repo evoluir em seu diretório inicial. Agora você está pronto para ir. Você também pode procurar ajuda em
hg help fold
.Comando de Dobra
Você diz
fold
para esmagar / dobrar uma cadeia linear de commits que não está quebrada. O que o fold faz é criar um novo changeset que contém as mudanças de todos os changesets e marcar todos os commits como obsoletos. Você pode ter uma visão mais aprofundada sobre isso em docs .Agora, suponha que você tenha o seguinte histórico.
Você quer esmagar
e
,f
eg
. Você pode fazerO resultado será
onde
h
está o changeset que contém as mudanças de todos os três commitse
,f
eg
.Você também pode dobrar changesets do meio do histórico, ou seja, não necessariamente você precisa escolher uma corrente que inclua a ponta. Suponha que você queira desistir
b
,c
ed
. Você pode fazerIsso resultará em
onde
i
é dobrado a revisão deb
,c
,d
ej
é o mesmo conjunto de alterações comoh
. Evolve guia do usuário é uma leitura obrigatória.fonte
--keep
opção de rebase cobre isso (seguido por marcar as revisões como secretas ou usar tira nelas depois de verificar o resultado). Até mesmo mover revisões entre outras revisões é possível com uma sequência de dois comandos de rebase.Com o Mercurial 4.8 (novembro de 2018, 9 anos depois), você pode considerar o novo comando
hg absorb
(antes era um recurso experimental ).Consulte " Absorvendo Mudanças Comprometidas no Mercurial 4.8 "
fonte
Eu acho que
chistedit
(construído desde o Mercurial 2.3) é o mais próximorebase -i
que é puro Mercurial (chistedit
é a versão interativa dohistedit
). Uma vez no histedit, ofold
comando mapeia para rebasesquash
eroll
mapeia de comando para rebasefixup
. Veja histedit docs para mais informações.Aqui está um exemplo simples. Suponha que você tenha o seguinte e deseja mover todas as alterações de 1e21c4b1 para a revisão anterior e apenas manter a mensagem da revisão anterior.
Você pode executar
hg chistedit -r b4a738a4
para editar o histórico de volta para b4a738a4. Em chistedit, você então move o cursor para baixo para 1e21c4b1 e pressionar
para indicar que deseja rolar essa revisão. Observe que a ordem em histedit (do mais antigo para o mais recente) é revertida dehg log
(do mais recente para o mais antigo).Depois de escolher suas alterações, você escolhe
c
confirmá-las. O resultado é o seguinte:@ bfa4a3be drees tip | Um compromisso de 788aa028 drees | Coisas mais antigas
Se você for relativamente novo para eles, então
histedit
pode ser uma escolha melhor do quechistedit
porque fornece as descrições dos comandos no arquivo histedit para referência. Só é preciso um pouco mais de edição para definir os comandos usando a edição de texto normal (como o rebase normal).Observe, para usar
histedit
ouchistedit
você precisa adicionarhistedit
às suas extensões em ~ / .hgrc:Eu sugeri
chistedit
uma vez que é o mais próximo derebase -i
e funciona em qualquer lugar da história. Se você realmente quiser apenas incluir / ajustar a revisão atual na anterior, então @G. Astrip
sugestão de Demecki pode ser boa, pois o que está acontecendo é claro. Está integrado desde o Mercuria 2.8. Para obter os resultados equivalentes aos acima, você pode fazer o seguinte:Observe
strip
, como o histedit, precisa ser habilitado em seu ~ / .hgrc:fonte
Vamos supor que você queira esmagar (unir) 2 commits mais recentes.
Encontre um número de revisão
saída possível:
Ramificação de soft reset
Confirme as alterações novamente
Notas
strip
requer que uma extensão embutida seja habilitada. Crie / edite o~/.hgrc
arquivo de configuração com o seguinte conteúdo:fonte
Eu uso:
fonte