Ahora entiendo la mayoría de los conceptos básicos de Git / Github, sin embargo, todavía tengo problemas para comprender el panorama general.
Estas son algunas cosas que he logrado hacer funcionar hasta ahora:
- Push commits
- Trabajar con ramas
- Integre Github con Travis CI, un sistema de integración continua
- A través de Travis CI, construya automáticamente en cada commit para master y coloque el lanzamiento como un ZIP en Github bajo lanzamientos.
Sin embargo, hasta ahora solo he trabajado en versiones alfa / beta de proyectos, por lo que nunca he visto versiones versionadas en la práctica todavía.
Por lo tanto, quiero aprender más sobre el control de versiones, mantener versiones separadas, revisar las versiones, etc.
¿Cómo me aseguraría de que sucedan las siguientes cosas:
- Tener diferentes versiones de mi proyecto, por ejemplo, la versión 1.1.0 y 2.0.0
- Tener la capacidad de impulsar las revisiones en las versiones, colocar la versión a 1.1.1 o 2.0.1, etc.
- Haga que un sistema de integración continua compile esa versión automáticamente en commit y, si tiene éxito, publique una versión para esa versión específica.
Dudo entre las siguientes opciones:
- ¿Necesito usar etiquetas para cada versión? Si es así, ¿cómo puede un sistema de integración continua crear versiones automáticamente?
- ¿Debo crear ramas para cada versión? Si es así, ¿eso no crearía una tonelada completa de ramas (como una rama 1.1 y 2.0, las revisiones van a esa rama, por supuesto)
- ¿Cómo especificaría el número de versión? ¿Está bien tener un archivo de configuración que especifique el número de versión, o hay formas más inteligentes de evitarlo? En este caso, sería un proyecto Java, si eso importa.
Respuestas:
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
develop
ymaster
.master
contiene su última versión ydevelop
su última copia de desarrollo "estable".Los contribuyentes crean
feature
sucursales (con el prefijofeature/
convencional) a partir dedevelop
:y
hotfix
ramas (prefijadashotfix/
por convención) fuera demaster
: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
feature
rama, la fusionan nuevamente endevelop
:Cuando terminan con una
hotfix
rama, la fusionan de nuevo en ambasmaster
ydevelop
la revisión continúa:Este es el aspecto de integración continua.
Lanzamientos
Cuando esté listo para comenzar a empaquetar una versión, cree una
release
rama desde su rama "estable"develop
(igual que crearfeature
ramas). Luego coloca el número de versión en una etiqueta (que se describe a continuación).El uso de
release
ramas separadas le permite continuar desarrollando nuevas característicasdevelop
mientras corrige errores y agrega toques finales a larelease
rama.Cuando esté listo para finalizar el lanzamiento, fusiona la
release
rama en ambosmaster
ydevelop
(al igual que ahotfix
) para que todos sus cambios se lleven adelante.Etiquetado
Cuando crea una
release
rama o unahotfix
rama, coloca el número de versión de manera apropiada en una etiqueta. Con vainilla git, se ve así:Entonces también deberá insertar las etiquetas (por separado) en su repositorio remoto:
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 beta0.x.x
).Fusionando
Como viste anteriormente, git-flow te anima a fusionar ramas con el siguiente comando:
La
--no-ff
opció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
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:
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 describe
y podría estar más activa ahora. Gracias Louis).La extensión automatiza todas las partes desordenadas (como usar
merge --no-ff
y 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:
y terminar así
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:
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í.
fuente
v0.3.0
, en<release>
git flow release start <release> [<base>]
. Debajo del capó, creará un nombre de rama incluyendo la versión, comorelease/v0.3.0
.¿Necesito usar una etiqueta para cada versión?
No, no necesitas usar etiquetas en absoluto. Si desea etiquetar cada versión, está bien, o si desea etiquetar cada vez que se construye su sistema CI, también puede hacerlo. Esencialmente, las etiquetas solo le dan un nombre fácil de usar a la confirmación, para que pueda extraerla fácilmente y verla más tarde.
¿Debo crear ramas para cada versión?
¡Seguro! La ramificación es barata / gratuita en Git, por lo que aprovecho cada oportunidad que tengo. También puede fusionar y eliminar ramas con bastante rapidez. Si siente que tiene muchas ramas, siempre puede reducirlas más tarde con una fusión selectiva. Hay una gran cantidad de esquemas de ramificación de Git disponibles también si desea utilizar un esquema probado y verdadero.
¿Cómo especificaría el número de versión?
Las etiquetas son generalmente la forma en que especifica el número de versión, ya que pertenece a git. Si está hablando sobre cómo versionar un proyecto, o la mejor manera de hacerlo, tendrá que investigar un poco, ya que es una pregunta basada en una opinión justa. Algunos proyectos permanecen en Beta para siempre, otros incrementan las versiones de números enteros como si estuvieran pasando de moda (Mirándote Chrome)
fuente
Si por "versión" te refieres a un conjunto de archivos que componen una versión o un candidato de versión, entonces recomiendo etiquetar cada versión. Si necesita consultar la versión 1.2.7 en el futuro, ¿desea buscar el hash de commit o simplemente usar el número de versión?
Además, si usa
git describe
para registrar información de compilación en algún lugar (como lo hago yo), el uso de etiquetas le permite proporcionar una salida mucho mejor.Un sistema de integración continua podría generar versiones independientemente de cómo utilice las etiquetas. Podría decirle que cree una versión sobre la base del hash de commit. Las etiquetas te hacen la vida más fácil.
No veo la ramificación como una cosa "por versión". Tengo un par de proyectos donde mis versiones son confirmaciones en la
master
rama. No necesito nada más complicado que esto por ahora porque ninguno de los proyectos está en la etapa estable y no hay necesidad de soportar versiones anteriores a largo plazo. Pero digamos que lanzo 1.0, 1.1, 1.2, luego lanzo 2.0 y todavía tengo que admitir la serie 1.0 con correcciones de seguridad, etc. Entonces ciertamente tendría una rama para poner los lanzamientos de mantenimiento para la serie 1.x .Tener una única fuente para su número de versión, como un archivo de configuración, es la mejor manera, ya que evita errores de dedo gordo que de otro modo podrían ocurrir si tiene que actualizar los números en varios lugares. Estoy hablando de ... hmm ... experiencia embarazosa. Lanzas 1.3 solo para descubrir que el software aún informa que es la versión 1.2. ¡Uy!
En otra respuesta, mxdubois te recomendó gitflow. Si decide usar gitflow, le recomiendo usar la edición AVH . La versión original ya no se mantiene activamente. Una diferencia notable es que la edición AVH realiza fusiones de lanzamiento que permiten
git describe
trabajar de manera inteligente. La versión original realiza la fusión de una manera que se disparagit describe
.fuente
Escaneando tu lista, veo la versión como tu foco, así que ...
Una forma de mantener versiones es con ramas y fusión (o rebase).
Así que tienes:
entonces creas una rama
luego agrega más cambios a
entonces creas una rama
luego agrega más cambios a
Ahora:
Para actualizar la Versión 2, ahora haz
Para actualizar la versión 3
Lo anterior es para actualizaciones al por mayor.
Sin embargo, es probable que sea más probable que desee seleccionar cambios específicos para los que hay
Más información sobre la selección de cerezas en http://git-scm.com/docs/git-cherry-pick
fuente