alterações da colheita de cereja Mercurial para cometer
-
21-08-2019 - |
Pergunta
Say, I fez muitas mudanças para o meu código e só precisam se comprometer algumas dessas mudanças. Existe uma maneira de fazê-lo em mercurial? Eu sei que darcs
tem um recurso como este.
Eu sei hg transplant
pode fazer isso entre os ramos, mas eu preciso de algo assim para cometer código no presente ramo e não quando a adição de conjuntos de mudanças de algum outro ramo.
Solução
MQ como Chad mencionados são uma maneira. Há também soluções mais leves:
Outras dicas
Se você estiver usando TortoiseHg 1.x para Windows, este recurso é implementado lindamente direito da caixa (sem extensões necessárias).
- Execute o TortoiseHg Commit Tool.
- Escolha um arquivo para o qual você só quer cometer um subconjunto de sua alterar.
- Clique no Hunk guia Selection no painel de visualização.
- Clique duas vezes ou usar a barra de espaço para alternância que mudam pedaços deve ser incluído no cometer.
Para TortoiseHg 2.x , a guia Hunk Seleção é ido agora. Em seu lugar, é a Shelve ferramenta . Tem mais algumas funcionalidades que a seleção pedaço de idade. Esses novos recursos vêm à custa de alguma complexidade adicional.
Note que não há necessidade de activar explicitamente a extensão Mercurial Shelve ao usar este recurso. De acordo com Steve Borho (chumbo TortoiseHg desenvolvedor) em a uma pergunta diferente TortoiseHg : "Nós temos uma cópia local da extensão prateleira e chamada para ele diretamente."
Para
Observe na lista de arquivos à que o arquivo superior esquerdo está marcada para indicar que será incluído, o segundo arquivo é desmarcada porque ele não será incluído, eo terceiro arquivo, Sample.txt, está cheio (o Null indicador de caixa) porque só selecionar as alterações de arquivo que será incluído no cometer.
A mudança para Sample.txt que será incluído é verificada na porção seleção mudança inferior direito da imagem. A mudança que serão excluídos está desmarcada ea vista diff fica acinzentado. Note também que o ícone da ferramenta de prateleira ainda está prontamente disponível.
O tutorial Mercurial Filas é terrível para este caso de uso. Todos os exemplos que eu vi supor que você ainda tem que fazer um commit e você estiver atualizando um único patch. Na maioria das vezes isso não é o caso, e você tem 2 ou 3 commits que você quer esmagar juntos ou mudança de alguma outra forma.
Vamos dizer que você tem esse tipo de história:
---O---O---A---B---C
O primeiro exemplo é de squash comete A, B, e C. Primeira inicialização mq:
$ hg qinit
Agora precisamos "importação" os commits A, B e C para a fila de patch. Vamos assumir que eles são os últimos 3 commits. Podemos usar o "N" sintaxe revisão para importá-los assim:
$ hg qimport -r -3:-1
Isso significa importar como manchas de 3 patches de backup para a última confirmação. Você pode verificar o status desses patches com hg qseries
. Ele deve mostrar algo como isto:
$ hg qseries
101.diff
102.diff
103.diff
Onde os números 101, 102 e 103 correspondem aos números de revisão locais dos commits A, B e C. Agora essas manchas são aplicada , o que significa que as mudanças que eles descrevem são já no cópia de trabalho. Você pode se livrar do muda a cópia de trabalho e removê-los a partir do histórico de commits, salvando-os na única forma de patch, usando hg qpop
. Você pode dizer hg qpop; hg qpop
pop mudanças C e B da pilha, ou especificar um patch para "pop com". Neste caso, seria algo como isto:
$ hg qpop 101.diff
now at: 101.diff
Agora você tem os patches para commits B e C na fila remendo, mas eles não são aplicadas (suas mudanças foram "perdidos" - eles só existem na fila área do patch). Agora você pode dobrar esses patches para o último, ou seja, criamos um novo commit que é o equivalente à soma das mudanças A + B + C.
$ hg qfold -e 102.diff 103.diff
Isto irá mostrar o seu editor para que você possa alterar a mensagem de commit. Por defeito, a mensagem será a concatenação do mensagens para o muda A, B e C, separados por asteriscos cometer. O bom aqui é que hg qfold
vontade tab-completar os patches se você estiver usando bash e ter o script hg-conclusão de origem. Isso deixa a história como esta, em que A + B + C é uma única confirmação que é a combinação dos 3 patches que nos interessam:
---O---O---A+B+C
Outro caso de uso é se temos o mesmo tipo de história como antes, mas queremos deixar cair remendo B e mesclar A + C. Isso é muito semelhante ao anterior, na verdade. Quando você chegar à etapa qfold, você simplesmente dobrar no último commit em vez dos 2 últimos commits:
$ hg qfold -e 103.diff
Isso deixa a mudança para B na fila de patch, mas ela não é aplicada para a cópia de trabalho e sua cometem não está na história. Você pode ver isso executando:
$ hg qunapplied
102.diff
A história agora se parece com isso, onde A + C é uma única confirmação que combina muda A e C:
---O---O---A+C
Um caso de uso final pode ser que você precisa para aplicar somente comprometer C. Você faria isso executando o qimport como acima, e você seria pop off todos os patches que você não quer:
$ hg qpop -a
Os meios bandeira -a pop off todos os patches. Agora você pode aplicar apenas o que você quer:
$ hg qpush 103.diff
Isso deixa você com essa história:
---O---O---C
Uma vez que você é feito com tudo isso, você precisa para acabar com a fila de mexer. Isso pode ser feito com:
$ hg qfinish -a
Então, lá estamos nós. Agora você pode executar hg push
e só cometer exatamente o que você quer, ou hg email
um patch coerente para a lista de discussão.
Eu sinto como se estivesse faltando alguma coisa porque ninguém sugeriu isso já.
O normal "hg commit" comando pode ser usado para escolher seletivamente o que se comprometer (você não tem de se comprometer todas as alterações pendentes no diretório de trabalho local).
Se você tem um conjunto de mudanças assim:
M ext-web/docroot/WEB-INF/liferay-display.xml
M ext-web/docroot/WEB-INF/liferay-portlet-ext.xml
M ext-web/docroot/WEB-INF/portlet-ext.xml
Você pode cometer apenas duas dessas mudanças com ...
hg commit -m "partial commit of working dir changes" ext-web/docroot/WEB-INF/liferay-display.xml ext-web/docroot/WEB-INF/liferay-portlet-ext.xml
Não super conveniente a partir da linha de comando porque você tem que mão-escrever os arquivos para cometer seletivamente (vs um processo de check-box GUI como tartaruga), mas é quase tão simples quanto ele ganha e não requer extensões. E file-englobamento provavelmente pode ajudar a reduzir a digitação (como seria acima, ambos os arquivos comprometidos compartilhar exclusivamente "Liferay" em seus caminhos.
Você pode usar o registro extensão , que é distribuído com Mercurial.
Você precisa habilitá-lo em seu arquivo ~/.hgrc
primeiro, adicionando-o à seção [extensions]
:
[extensions]
record=
Em seguida, basta digitar hg record
vez de hg commit
, e você será capaz de selecionar o que muda para os arquivos que você quer se comprometer.
Você também pode usar o crecord extensão que fornece uma interface mais agradável para análise e selecione as mudanças. (Ele não é distribuído com Mercurial, embora, e eu já vi isso ocasionalmente atrapalhar a cometer por isso não é completamente livre de bugs.)
Algum tempo passou. Parece ser a melhor opção agora é hg commit --interactive
Eu acredito Mercurial Filas preenche esse papel para o Mercurial. Há um bom muito tutorial ligada lá.
Tente QCT (Qt Commit Tool). Ele tem uma característica "select mudanças" que inicia a ferramenta de mesclagem de 3 vias para você a mudanças individuais de desfazer. Depois de se comprometer, essas alterações "desfez" voltar.
Eu uso comprometer-patch . É um script que permite que você edite o diff antes de cometer. É realmente agradável com diff-mode e modo vc Emacs do.
No passado eu usei crecord, mas tem erros relacionados com unicode (na verdade a extensão registro tem os erros, que crecord depende).
Primeiro você deve esquecer tudo o que sabia sobre GUI do e voltar para a linha de comando. Avançar na linha de comando faça o seguinte:
hg status> filelist.txt
Este tubulações todos os seus arquivos modificados para um arquivo de texto chamado filelist.txt
A seguir, edite a sua lista de arquivos para incluir apenas os arquivos que você deseja cometer.
Finalmente cometer usando o sytnax conjunto de arquivos:
hg commit "set: 'listfile: test.txt'"