Aquí hay un flujo de trabajo con el que me ocupo habitualmente en el trabajo.
git checkout -b feature_branch
# Do some development
git add .
git commit
git push origin feature_branch
En este punto, mis colegas deben revisar la rama de funciones, pero quiero seguir desarrollando otras funciones de las que dependen feature_branch
. Entonces, mientras feature_branch
está en revisión ...
git checkout feature_branch
git checkout -b dependent_branch
# Do some more development
git add .
git commit
Ahora hago algunos cambios en respuesta a la revisión del código en feature_branch
git checkout feature_branch
# Do review fixes
git add .
git commit
git checkout dependent_branch
git merge feature_branch
Ahora aquí es donde tenemos problemas. Tenemos una política de aplastamiento en el maestro, lo que significa que las ramas de características que se fusionan en el maestro deben comprimirse en una única confirmación.
git checkout feature_branch
git log # Look for hash at beginning of branch
git rebase -i first_hash_of_branch # Squash feature_branch into a single commit
git merge master
Todo está bien, excepto con dependent_branch
. Cuando trato de cambiar la base de la rama dependiente al maestro o intento fusionar el maestro en él, git se confunde con el historial reescrito / aplastado y básicamente marca cada cambio depedendent_branch
como un conflicto. Es un PITA para pasar y básicamente rehacer o eliminar los conflictos de todos los cambios dependent_branch
. ¿Hay alguna solución para esto? A veces, creo manualmente un parche y lo aplico desde una nueva rama del maestro, pero si hay algún conflicto real con eso, es aún peor arreglarlo.
git checkout dependent_branch
git diff > ~/Desktop/dependent_branch.diff
git checkout master
git checkout -b new_dependent_branch
patch -p1 < ~/Desktop/dependent_branch.diff
# Pray for a clean apply.
¿Algunas ideas? Sé que esto sucede debido al historial reescrito durante el squash, pero ese es un requisito que no puedo cambiar. ¿Cuál es la mejor solución / alternativa? ¿Hay algo de magia que pueda hacer? ¿O hay una forma más rápida de realizar todos los pasos relacionados con la creación manual de la diferencia?
git add .
es completamente malvado y eventualmente te morderá cuando termines cometiendo cosas que no pretendías. Debería usargit add -p
o al menosgit add -u .