Mercurial: Mesclando um arquivo entre os ramos em um repo
-
21-08-2019 - |
Pergunta
Quando eu tenho duas filiais em Hg repo, como mesclar apenas um arquivo com outro ramo, sem ter todos os outros ficheiros a partir de alterações fundiu?
É possível mesclar apenas determinados arquivos, em vez de changeset todo?
Solução
AVISO: como um "dummy merge", como é recomendado por @Martin_Geisler, pode realmente bagunçar tudo, se mais tarde você quer fazer uma verdadeira fusão dos dois ramos. A fusão manequim será gravado, e dizer que você mesclar o ramo que você fez a fusão fictício para - você não vai ver as alterações. Ou se fundem em outro ramo, as mudanças em que outro ramo será desfeita.
Se tudo que você quer é copiar um arquivo inteiro de um galho para outro, você pode simplesmente fazer:
hg update -r to-branch
hg revert -r from-branch file
hg ci -m 'copied single file from from-branch to to-branch
Se você quiser selecionar diferentes partes desse arquivo, então "hg record"
é útil.
Eu só fiz isso no meu diretório home hgignore.
Se os dois ramos tiver feito alterações em um arquivo que você deseja manter, um truque sujo seria a criação de uma fusão dos dois ramos usando hg merge, possivelmente / provavelmente em ainda outro ramo, verifique se, e, em seguida, copiar um único arquivo entre a junção e o ramo de-:
hg update -r to-branch
branch merge-branch
hg merge -r from-branch
hg ci -m 'temp merge to be discarded"
hg update -r to-branch
hg revert -r merge-branch single-file
hg ci -m 'merged single-file from from-branch to to-branch"
hg strip merge-branch
Vale a pena mencionar: o caminho para "copiar um arquivo único entre os ramos" (ou revisões, ou de revisões a integrar, ou ....) é "revert hg". I.
hg update -r Where-you-want-to-copy-to
hg revert -r Where-you-want-to-copy-from file-you-want-to-copy
...
hg ci
Por alguma razão eu, e alguns dos meus colegas de trabalho, encontrar este muito confundindo. "Revert" == "cópia" ... faz sentido para alguns padrões de uso, mas não todos.
Outras dicas
Não. Mercurial funciona em uma base de alterações.
Mas você pode fazer uma " manequim merge " onde você ignorar as alterações recebidas de um dos ramos. Antes de se comprometer você poderia então reverter arquivos selecionados para qualquer estado que você deseja:
% HGMERGE=internal:local hg merge # keep my files
% hg revert --rev other-branch a.txt # update a.txt to other branch
% hg commit -m 'Dummy merge to pick a.txt from other-branch.'
Talvez isso irá ajudá-lo um pouco.
Gostaria apenas de utilizar uma ferramenta externa como vimdiff
para diff os dois arquivos que deseja mesclar e, em seguida, fundi-los. A vantagem disso é que você pode fazer edição seletiva em partes do arquivo. Por exemplo:
hg update -r branch-merging-to
hg extdiff -p vimdiff -r branch-merging-from file-I-am-merging
Para fazer isso você precisa habilitar as ferramentas externas na sua .hgrc, o que significa apenas adicionando estas linhas:
[extensions]
hgext.extdiff =