Donde trabajar con Git (Ramas o Troncos)

Uso SVN y tengo 3 environments

  • Entorno de desarrollo
  • Entorno de preproducción
  • Entorno de producción

En realidad, todo el equipo trabaja con el trunk .

Queremos migrar a Git . ¿Dónde deberíamos trabajar en el entorno de desarrollo?

Deberíamos trabajar con las sucursales y cuando cargamos el código a la producción, reintegramos esas twigs al maestro (troncal)?

Git y SVN "piensan" de forma muy diferente acerca de commits y branches. Específicamente, Git no tiene un tronco .

En otras versiones, los sistemas de control, las sucursales y los nombres de las sucursales son elementos muy sólidos (y, por consiguiente, muy pesados) y en algunos casos son totalmente inseparables. En Mercurial, por ejemplo, una vez que se realiza una confirmación en una twig en particular, esa confirmación se realiza en esa twig, y solo esa twig, para siempre. (En SVN, las twigs son extremadamente pesadas, pero bastante diferentes y no tan comparables como Mercurial es con Git. Me gusta utilizar Mercurial como comparador porque tanto Git como Mercurial están distribuidos , mientras que SVN está centralizado. Distribuido vs centralizado también fundamentalmente cambia la forma en que uno usa el control de versiones. Git le permite designar un repository central de synchronization, pero es opcional en lugar de obligatorio.)

Por el contrario, en Git, el nombre de una sucursal es algo pequeño, de pluma, casi de ninguna importancia. Es simplemente un nombre legible para un commit, con otra propiedad especial. Git tiene dos nombres convenientes y legibles para los commit: nombres de las twigs y nombres de las tags. La mayor diferencia entre ellos es que se supone que los nombres de las twigs se mueven, tanto que Git los mueve automáticamente y los nombres de las tags no son suficientes para que Git evite que los muevas accidentalmente.

Tenga en count esta distinción cuidadosa, en Git, entre un nombre de twig y una twig, er, algo-o-otro . Git no hace exactamente esta distinción. Hay al less dos cosas diferentes, ambas llamadas "una twig". Para más información sobre esto, vea ¿Qué queremos decir con "twig"? Trataré de resumirlo diciendo que la historia real -el set de confirmaciones que componen una twig-como-una-cosa-otra-que-el-nombre-está formada por los compromisos mismos. Los compromisos, una vez realizados, son permanentes 1 e inmutables. Nadie, ni usted ni Git, pueden cambiar un compromiso, porque su ID hash, su "verdadero nombre", que es completamente ilegible, es un hash criptográfico de sus contenidos. Cambie incluso un solo bit de esos contenidos y cambie la ID del hash, de modo que tenga una confirmación nueva y diferente.

Cada confirmación contiene, como parte de sus datos, el ID de su confirmación padre (ancestro inmediato) o múltiples ID para múltiples confirmaciones principales si la confirmación es una confirmación de fusión . Son estas cadenas de ID las que forman la twig-como-algo-otro-que-el-nombre-y en Git, esto significa que cualquier compromiso dado puede estar en muchas twigs al mismo time. En algunos casos, ¡una confirmación puede estar en ninguna twig en absoluto!

Cuando realiza una nueva confirmación, Git agrega la nueva confirmación a la sucursal actual, escribiendo la confirmación en la database del repository con su matriz establecida en la confirmación actual. Por lo tanto, siempre hay 2 una confirmación actual, que se conoce como HEAD . Una vez que la nueva confirmación se guarda de manera segura para siempre, Git luego escribe la ID del nuevo compromiso en el nombre de la sucursal. HEAD se implementa realmente como un file, pero ese file normalmente solo contiene el nombre de la twig actual. Es la asignación de la bifurcación a la identificación de compromiso que proporciona la identificación hash de la confirmación actual.

Los nombres de las sucursales pueden agregarse y eliminarse en cualquier momento, aunque como se señala en la nota al pie 1, la eliminación de una lata del nombre de la sucursal -si esos commits no tienen otro nombre para encontrarlos- abandona los commits del Grim Reaper Collector.

Debido a todo esto, Git debería usarse de una manera muy diferente. Puedes, y deberías, crear nuevas twigs a izquierda y derecha, en un abrir y cerrar de ojos. Cuando haya terminado lo que sea que necesite para la sucursal, combínelo, restátelo, vuelva a clasificarlo y aplacéelo, o deséchelo, lo que quiera: todos estos son extremadamente rápidos. Cuando hayas terminado, cualquier commit que tengas es el historial, y verás ese historial iniciando Git con algunos nombres de twigs u otros puntos de partida (tags, o incluso identificadores hash de commit sin formatting, por ejemplo). Le muestra esos commits específicos, y luego sus padres, y los padres de sus padres, y así sucesivamente, todo el path de vuelta al primer commit (parentless, o root ).


1 Permanente, es decir, a exception de confirmaciones "abandonadas" (y otros objects de Git). Estos son eventualmente basura recolectada usando git gc . Los nombres de las sucursales tienen un propósito adicional: protegen las confirmaciones de dicha recostackción. Sin embargo, cualquier nombre, nombre de twig, nombre de label, stash del command git stash , cualquiera de los nombres de las notes de git notes , y así sucesivamente, protegerá una confirmación. Ese commit entonces protege sus commit (s) padre (s), regresando a través de todo el historial de commit.

2 Hay una exception a esta regla. Tiene que haber, para manejar un repository vacío, que no tiene commits en absoluto. Esa exception también se usa para las denominadas twigs huérfanas o no nacidas (algunas de Git usan el primer término, algunas usan el segundo), pero la mayoría de la gente solo ve la exception en un nuevo repository vacío.