Classificando para fora uma bagunça Git
-
03-07-2019 - |
Pergunta
Eu apenas herdei um projeto que foi mantida usando Git. Em certo ponto, o código foi implantado em 3 sistemas separados e cada sistema mantiveram a sua própria respository GIT descentralizada.
Cada um dos 3 sistemas estendida do sistema de base original em 3 sentidos diferentes. Nenhum dos 3 sistemas foram sincronizados uns contra os outros. Algumas mudanças estão no branch master, outros estão em novas agências.
Como posso trazer os 3 fontes diferentes em conjunto para que eu posso:
- encontrar uma base comum para trabalhar com;
- descobrir quais mudanças são correções de bugs que devem ser aplicados em todos os 3 sistemas; e
- manter os 3 sistemas de uma forma sã de modo que não é apenas um ramo comum e separar as personalizações necessárias para os 3 sistemas diferentes?
Solução
Eu provavelmente começar por empurrar todos os repositórios para ramos separados em um repositório central, a partir do qual eu possa rebase, fundir etc entre os ramos facilmente.
Uma ferramenta boa visualização, como git-idade , gitnub , gitx , risadinha pode fazer maravilhas, mas a sua tarefa será, provavelmente, um pouco entediante, a menos que você puder encontrar os pontos de ramificação. Se há manchas semelhantes aplicada a todos os ramos que você pode usar (interativo) rebase para reordenar seus commits tais que eles estão na mesma ordem. Então você pode começar 'fechando' os seus ramos, movendo-se o ponto de ramo para cima, colocando commits em mestre. Uma descrição agradável sobre como commits reordenamento usando rebase podem ser encontrados aqui .
As possibilidades são as ações que você precisa tomar são descritos nos links fornecidos pelo Git Índice Howto . Um bom Cheat Sheet é sempre bom ter ao seu alcance. Além disso, eu suspeito que o acompanhamento de Eric Sinks post " DVCS e DAGs, Parte 1 " irá conter algo de útil (Ele não sabia, mas era um nontheless leitura interessante).
adicionais boa de se ter links são: Git Magia , Git Pronto e Guia SourceMage Git
Espero que todos os repos teve boa cometer mensagens que indicam o propósito de cada patch, é isso ou revisão de código:)
Quanto à forma de manter personalizações que tivemos sorte com o seguinte:
Começámos por separação (ou manter separado) o código personalizado a partir do código genérico. Então nós tentamos duas abordagens; tanto que funcionou bem:
- Todas as implantações tem seus próprios repositórios onde a personalização foi mantido.
- Todas as implantações tem seu próprio ramo em um 'customization'-repositório.
Depois da primeira implantação e vendo que o segundo foi um fato passamos algum tempo tentando prever personalização futuro / corte pontos para reduzir a duplicação através dos repos personalizados (alt. 1, que é a abordagem que actualmente uso) e na base / repo núcleo.
E sim, nós tentamos refatorar impiedosamente sempre que notar a divisão core / personalização escorregar:)
Outras dicas
OK. Depois de um grande de um trabalho árduo, eu consegui fazê-lo. Para qualquer outra pessoa embarcando em uma tarefa semelhante, ele vai envolver um monte de:
git rebase
comandos e quando as coisas deram errado:
git reflog
seguido de
git reset --hard HEAD@{ref}