Esto va a sonar contradictorio, pero escúchame:
Anímalos a comenzar a experimentar con git
Una de las cosas interesantes sobre git es que es sorprendentemente fácil hacer que cualquier operación local sea completamente segura. Cuando comencé a usar git, una de las cosas que me encontré haciendo fue comprimir todo el directorio como una copia de seguridad en caso de que arruinara algo. Más tarde descubrí que este es un gran error y casi nunca es realmente necesario para proteger su trabajo, pero tiene la virtud de ser muy seguro y muy simple, incluso si no sabe qué demonios está haciendo y cómo el comando que quieres probar saldrá. Lo único que debes evitar cuando haces esto es push
. Si no presiona nada, esta es una forma 100% segura de probar lo que quiera.
El miedo a probar cosas es uno de los mayores obstáculos para aprender git. Se le da por lo tanto control sobre todo lo que es una especie de enormes proporciones. La realidad es que puede apegarse a algunas operaciones muy seguras para la mayoría de su uso diario, pero encontrar qué comandos son esos requiere algo de exploración.
Al darles una sensación de seguridad , estarán mucho más dispuestos a tratar de descubrir cómo hacer las cosas por su cuenta. Y estarán mucho más capacitados para encontrar un flujo de trabajo personal en su máquina local que funcione para ellos. Y si no todos hacen lo mismo localmente , está bien, siempre y cuando cumplan con los estándares con lo que presionan . Si se necesita comprimir todo el repositorio antes de realizar una operación para que se sientan así, está bien; pueden aprender mejores formas de hacer las cosas a medida que avanzan y mientras prueban cosas. Cualquier cosa para comenzar a probar cosas y ver lo que hace.
Esto no significa que el entrenamiento no valga nada. Por el contrario, la capacitación puede ayudarlo a presentarle características, patrones y normas. Pero no es un reemplazo para sentarse y hacer cosas en su trabajo diario. Ni git ni SVN son cosas de las que puedes ir a una clase y luego sabes todo. Usted tiene que utilizar para resolver sus problemas para familiarizarse con ellos y qué características son muy adecuadas para el cual los problemas.
Deja de desanimarlos de aprender los entresijos de git
Mencioné no presionar nada, lo que en realidad va en contra de una de las cosas que les has estado enseñando: siempre "Comprometerse y Empujar". Creo que deberías dejar de decirles que hagan esto y decirles que comiencen a hacer lo contrario. Git tiene básicamente 5 "lugares" donde tus cambios pueden ser:
- En disco, no comprometido
- Escenificado pero no comprometido
- En un compromiso local
- En un escondite local
- Repositorios remotos (solo las confirmaciones y etiquetas se insertan y se extraen entre diferentes repositorios)
En lugar de alentarlos a tirar y empujar todo en un solo paso, aliéntelos a aprovechar estos 5 lugares diferentes. Anímalos a:
Esto los alentará a verificar su trabajo antes de que esté disponible públicamente para todos, lo que significa que detectarán sus errores antes. Verán la confirmación y pensarán: "Espera, eso no es lo que quería", y a diferencia de SVN, pueden regresar e intentarlo nuevamente antes de presionar.
Una vez que se acostumbren a la idea de comprender dónde están sus cambios, pueden comenzar a decidir cuándo omitir los pasos y combinar ciertas operaciones (cuándo tirar porque ya sabe que desea buscar y fusionar o cuándo hacer clic en la opción Confirmar y presionar) .
Este es en realidad uno de los enormes beneficios de git sobre SVN, y git está diseñado teniendo en cuenta este patrón de uso. SVN, por el contrario, asume un repositorio central, por lo que no es sorprendente si las herramientas para git no están tan optimizadas para el mismo flujo de trabajo. En SVN, si su confirmación es incorrecta, su único recurso real es una nueva confirmación para deshacer el error.
Hacer esto en realidad conducirá naturalmente a la siguiente estrategia:
Anímalos a usar sucursales locales
Las sucursales locales realmente alivian muchos de los puntos débiles de trabajar en archivos compartidos. Puedo hacer todos los cambios que quiero en mi propia rama, y nunca afectará a nadie ya que no los estoy presionando. Luego, cuando llegue el momento, puedo usar las mismas estrategias de fusión y rebase, solo que más fácil:
- Puedo cambiar la base de mi sucursal local, lo que hace que fusionarlo sea maestro trivial.
- Podría usar una combinación simple (crear una nueva confirmación) en master para incorporar los cambios de mi sucursal local.
- Puedo aplastar fusionar toda mi sucursal local en un solo commit en master si creo que mi sucursal es demasiado desordenada para salvarla.
El uso de sucursales locales también es un buen comienzo para descubrir una estrategia de ramificación sistemática. Ayuda a sus usuarios a comprender mejor sus propias necesidades de ramificación, por lo que puede elegir una estrategia basada en las necesidades y el nivel actual de comprensión / habilidad del equipo y no solo caer en Gitflow porque todos lo han escuchado.
Resumen
En resumen, git no es SVN y no puede ser tratado como tal. Necesitas:
- Elimine el miedo alentando la experimentación segura.
- Ayúdelos a comprender cómo es diferente git para que puedan ver cómo eso cambia su flujo de trabajo normal.
- Ayúdelos a comprender las funciones disponibles para ayudarlos a resolver sus problemas más fácilmente.
Todo esto lo ayudará a adoptar gradualmente un mejor uso de git, hasta que llegue al punto en que pueda comenzar a implementar un conjunto de estándares.
Características específicas
En el término inmediato, las siguientes ideas pueden ayudar.
Rebase
Mencionaste rebase y que realmente no lo entiendes en tu pregunta. Así que aquí está mi consejo: pruebe lo que acabo de describir. Realice algunos cambios localmente mientras otra persona empuja algunos cambios. Compromete tus cambios localmente . Comprime el directorio de tu repositorio como copia de seguridad. Obtenga los cambios de la otra persona. ¡Ahora intente ejecutar un comando rebase y vea qué sucede con sus commits! Puede leer un sinfín de publicaciones en el blog o recibir capacitación sobre rebase y cómo debe o no usarlo, pero nada de eso es un reemplazo para verlo en vivo en acción. Así que pruébalo .
merge.ff=only
Esta será una cuestión de gusto personal, pero la recomendaré al menos temporalmente, ya que mencionó que ya tiene problemas con el manejo de conflictos. Recomiendo configurar merge.ff
aonly
:
git config --global merge.ff only
"ff" significa "avance rápido". Una combinación de avance rápido es cuando git no necesita combinar cambios de diferentes confirmaciones. Simplemente mueve el puntero de la rama hacia una nueva confirmación a lo largo de una línea recta en el gráfico.
Lo que esto hace en la práctica es evitar que git intente automáticamente crear confirmaciones de fusión. Entonces, si confirmo algo localmente y luego realizo los cambios de otra persona, en lugar de intentar crear una confirmación de fusión (y potencialmente forzar al usuario a lidiar con conflictos), la fusión simplemente fallará. En efecto, git solo habrá realizado a fetch
. Cuando no tiene confirmaciones locales, la fusión continúa normalmente.
Esto les brinda a los usuarios la oportunidad de revisar los diferentes commits antes de intentar fusionarlos y los obliga a tomar una decisión sobre la mejor manera de combinarlos. Puedo cambiar el nombre, continuar con la fusión (usando git merge --no-ff
para omitir la configuración), o incluso puedo posponer la fusión de mis cambios por ahora y manejarlo más tarde. Creo que este pequeño aumento de velocidad ayudará a su equipo a evitar tomar decisiones equivocadas sobre fusiones. Puede dejar que su equipo lo apague una vez que mejoren en el manejo de las fusiones.