Recentemente, comecei a colocar meu código sob controle de versão (no laboratório em que estou trabalhando, no SVN, e meus próprios códigos no github (obviamente com o git)). Antes de usar o controle de versão, eu costumava fazer algo assim. Eu tinha uma pasta com o nome da biblioteca, dentro de muitas pastas com o número da versão. Toda vez que eu queria começar a trabalhar em uma versão mais recente, fazia uma cópia da última versão, mudava o nome para a nova versão e começava a implementar.
No entanto, isso parece redundante quando a pasta é colocada sob controle de versão. Além de redundância, se alguém quiser obter a versão mais recente, eles estariam baixando todas as versões se ele simplesmente import
s / clone
s.
Agora vejo muitas maneiras de fazer isso com o controle de versão, mas, como sou novo, não sei qual seria mais sustentável.
Método 1: usando tags
Se eu entendesse as tags corretamente, você teria sua ramificação principal, confirmará qualquer alteração que tiver e as marcará com uma versão. Então, quando você deseja obter uma cópia de trabalho, obtém a que possui uma determinada tag. (Corrija-me se eu estiver errado)
Método 2: versões de ramificação
Nesse método, o ramo principal seria o ramo de desenvolvimento. De vez em quando é feita uma versão estável (digamos v1.2.0
), você cria um ramo para essa versão e nunca se compromete com ela. Dessa forma, se você deseja fazer o download de uma determinada versão, obtém o código dessa ramificação. Embora eu tenha dito que você nunca se compromete com isso, talvez seja possível fazer correções de bugs e se comprometer com o ramo de uma versão antiga para manter a versão antiga em execução. Por exemplo, se a versão atual é v2.0
, mas existem pessoas que desejam usar v1.2
, você pode obter outro ramo v1.2
, a saber, v1.2.1
e confirmar as correções de bugs, ou apenas manter a versão igual v1.2
e confirmar as correções.
Então os galhos ficariam assim:
v1.2.1 v1.2.2
/ /
v1.0.0 v1.2.0--------- v2.0.0
/ / /
-------------------------------------- dev
Dessa forma, você tem ramificações para cada atualização de versão secundária. (Observe que, no gráfico acima, as v1.2.1 e v1.2.2 ou criadas após o lançamento da v2.0.0, elas não faziam parte do desenvolvimento entre as v1.2.0 e a v2.0.0. Pense nisso como suporte para versões mais antigas)
Método 3: desenvolvimento de ramificação
Este método é o oposto do anterior. O ramo principal seria a versão estável mais recente. Sempre que você estiver trabalhando em uma nova versão, crie uma ramificação (para desenvolvimento), trabalhe no seu código e, quando estiver estável, junte-a à ramificação principal.
Nesse caso, os ramos ficariam assim:
________ ____ ________________ _____ dev
/ \/ \/ \/
---------------------------------- latest_version
Provavelmente este precisa ser feito em conjunto com tags, certo?
A questão!
Enfim, minha pergunta é: com base na sua experiência, qual desses métodos se mostra mais prático? Existe um método melhor conhecido por aí (que possivelmente eu não tenha descoberto)? Como essas coisas são comumente feitas?