Deberías mirar git-flow . Es un modelo de ramificación excelente (y popular).
Resumen de flujo de Git
Derivación
Los troncos principales que se quedan para siempre son developy master. mastercontiene su última versión y developsu última copia de desarrollo "estable".
Los contribuyentes crean featuresucursales (con el prefijo feature/convencional) a partir de develop :
$ git checkout -b feature/my-feature develop
y hotfixramas (prefijadas hotfix/por convención) fuera de master:
# hotfix the latest version of master
$ git checkout -b hotfix/hotfix-version-number master
# or hotfix from a specific version
$ git checkout -b hotfix/hotfix-version-number <starting-tag-name>
Estas ramas son "desechables", lo que significa que tienen una vida útil corta antes de volver a fusionarse con los troncos principales. Están destinados a encapsular pequeñas piezas de funcionalidad.
Ramas de acabado
Cuando un contribuyente termina con una featurerama, la fusionan nuevamente en develop:
$ git checkout develop
$ git merge --no-ff feature/my-feature
$ git branch -d feature/my-feature
Cuando terminan con una hotfixrama, la fusionan de nuevo en ambas mastery developla revisión continúa:
$ git checkout master
$ git merge --no-ff hotfix/hotfix-version-number
$ git checkout develop
$ git merge --no-ff hotfix/hotfix-version-number
$ git branch -d hotfix/hotfix-version-number
Este es el aspecto de integración continua.
Lanzamientos
Cuando esté listo para comenzar a empaquetar una versión, cree una releaserama desde su rama "estable" develop(igual que crear featureramas). Luego coloca el número de versión en una etiqueta (que se describe a continuación).
El uso de releaseramas separadas le permite continuar desarrollando nuevas características developmientras corrige errores y agrega toques finales a la releaserama.
Cuando esté listo para finalizar el lanzamiento, fusiona la releaserama en ambos mastery develop(al igual que a hotfix) para que todos sus cambios se lleven adelante.
Etiquetado
Cuando crea una releaserama o una hotfixrama, coloca el número de versión de manera apropiada en una etiqueta. Con vainilla git, se ve así:
$ git tag -a <tag-name> -m <tag-description>
Entonces también deberá insertar las etiquetas (por separado) en su repositorio remoto:
$ git push --tags
Por lo general, es mejor usar versiones semánticas en las que sus versiones toman la forma major.minor.hotfix. Los golpes mayores son incompatibles con versiones anteriores, mientras que los golpes menores y de revisión no son incompatibles con versiones anteriores (a menos que esté en beta 0.x.x).
Fusionando
Como viste anteriormente, git-flow te anima a fusionar ramas con el siguiente comando:
$ git merge --no-ff <branch-name>
La --no-ffopción le permite mantener todo el historial de su rama sin dejar un montón de ramas en la confirmación actual del repositorio (por lo que no se preocupe, no tendrá una rama para cada versión).
También te animamos a tirar con
$ git pull --rebase
Por lo tanto, no agrega muchos commits de fusión inútiles.
Puede configurar git para hacer ambas cosas de forma predeterminada en su .gitconfig. Aunque te dejaré mirar eso;)
Versiones de navegación
Cuando alguien busca una versión específica de su base de código, puede verificar la etiqueta por su nombre:
# checkout in detached HEAD to browse
$ git checkout <tag-name>
# OR checkout and create a new local branch (as you might for a hotfix)
$ git checkout -b <new-branch-name> <tag-name>
O, si alguien está navegando en github, también hay una pestaña "etiquetas" en el menú desplegable "ramas".
Usando la extensión git-flow (recomendado)
Mi forma favorita de usar este modelo es con la extensión de flujo git para git.
( Editar: Louis ha recomendado la bifurcación AVH que funciona mejor git describey podría estar más activa ahora. Gracias Louis).
La extensión automatiza todas las partes desordenadas (como usar merge --no-ffy eliminar ramas después de la fusión) para que pueda continuar con su vida.
Por ejemplo, con la extensión, puede crear una rama de características como esta:
$ git flow feature start my-feature-name
y terminar así
$ git flow feature finish my-feature-name
Los comandos para las revisiones y versiones son similares, aunque usan el número de versión en lugar del nombre de una rama, de esta manera:
# Create hotfix number 14 for this minor version.
$ git flow hotfix start 2.4.14
# Create the next release
$ git flow release start 2.5.0
Git flow luego crea la etiqueta de versión para usted y le recuerda amablemente que suba la versión en cualquier configuración o archivos de manifiesto (lo que podría hacer con un administrador de tareas como grunt).
Espero que ayude :) No estoy seguro exactamente cómo lo integraría todo con su configuración de Travis CI, pero supongo que los githooks lo llevarán allí.