Pergunta

Em Mercurial / TortoiseHg, dado o exemplo a seguir, qual é a maneira mais fácil de revisão merge "G" em repo Um sem tomar D, E e F (Suponha que G não tem nenhuma dependência de D, E ou F).

Repo A: A - B - C

Repo B (Clone of A) A - B - C - D - E - F - G

É um remendo a melhor aposta?

Foi útil?

Solução

Tonfa é certo. O que você está descrevendo não é 'fusão' (ou 'empurrar' ou 'puxando'); é 'cherry-picking'. Um empurrão ou um puxão se move todos os changesets de um repo para outro que ainda não estiverem no que repo. A 'merge' leva dois 'cabeças' e funde-los para uma nova revisão que é a combinação de ambos.

Se você realmente precisa para mover G acabou, mas não pode cumprir com D, E, F lá você deve 'exportação hg' G de repo A, e, em seguida, 'import hg'-lo em repo A. O extensão de Transplante é um invólucro em torno exportação / importação com algumas sutilezas para ajudar a evitar mover a mesma revisão sobre múltipla vezes.

No entanto , a desvantagem de usar a importação / exportação, transplante, e cherry-picking, em geral, é que você não pode realmente passar G sem seus antepassados, porque em Mercurial um changeset nome é o seu 'Hashid', que inclui os hashids de seus pais. Pais diferentes (nova controladora da G seria C e não F) significa um Hashid diferente, por isso não é G mais. - É o trabalho de G, mas uma nova revisão pelo nome

Passando G como algo novo, vamos chamá-lo G'(Gee prime), não é um grande negócio para alguns usos, mas para outros é uma grande pita. Quando B get breve repo uma nova revisão, H, e você deseja movê-lo sobre o seu pai vai estar mudando de G para G', que têm diferentes hashes. Isso significa H vai passar como H' -. 100 changesets para baixo da linha e você terá diferentes hashids para tudo tudo porque você não poderia estar tendo D, E, F, em repo A

As coisas vão ficar ainda mais fora de sintonia, se / quando você deseja mover coisas de Repo Um em Repo B (direção oposta de seu movimento mais cedo). Se você tentar fazer um simples 'push hg' de A para B você vai ter G '(e H' e por descendentes posteriores), que será duplicatas dos changesets você já tem em Repo B.

O que, então, são suas opções?

  1. não se importam. Seus dados ainda está lá você simplesmente acabar com os mesmos changesets com diferentes nomes e mais trabalho em bolsas de futuros entre os dois repos. Não é errado, é apenas um pouco desajeitado talvez, e algumas pessoas não se importam.
  2. Mover todos D, E, e F até Repo A. Você pode mover todos os changesets sobre se eles são inofensivos e evitar todo o aborrecimento. Se eles não são tão inofensivos você pode movê-los e depois fazer um 'hg backout' para desfazer os efeitos da D, E e F em uma nova revisão H.
  3. Dar G melhor filiação para começar É médio para me mencionar isso porque é muito tarde para ir por esse caminho (sem editar história ). O que você deve ter feito antes de trabalhar no changeset G era hg update C. Se G não depende ou exigir changesets D, E, e F, então não deve ser o seu filho.

Se em vez de atualizar a C primeiro você vai ter um gráfico como este:

A - B - C - D - E - F
          \
            G

então, toda a resposta a esta pergunta seria apenas hg push -r G ../repoA e G iria passar de forma limpa, mantendo a mesma Hashid, e D, E e F não iria com ele.

UPDATE:

Como apontado nos comentários. Com mercuriais modernas o comando hg graft é a maneira perfeita para fazer isso.

Outras dicas

Referindo-se ao título, que cereja endereços pegando em geral, eu dou o exemplo de trabalhar em um repo, como os motores de busca da Internet pode trazer as pessoas aqui para cherry picking em geral. Trabalhando em um repositório, ele seria feito com hg graft :

hg update C
hg graft G

O resultado é:

            G'
          / 
A - B - C - D - E - F - G

aviso Extra: Os dois changesets será tratado como commits independentes, paralelas sobre os mesmos arquivos e pode fazer você correr em conflitos de mesclagem, razão pela qual cherry picking deve ser evitado em geral de gestão de ramo. Por exemplo, se G é uma correção de bug aplicado a um ramo versão estável marcada como 1.0.1, você deveria merge o ramo freeze com ele, e de vez em merge tempo o ramo master com correções de bugs da sucursal freeze .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top