¿Es absolutamente necesario trabajar en varios errores a la vez? Y por "a la vez", quiero decir "tener archivos editados para múltiples errores al mismo tiempo". Porque a menos que lo necesite absolutamente, solo trabajaría en un error a la vez en su entorno. De esa manera, puede usar sucursales locales y rebase, lo cual me parece mucho más fácil que administrar un alijo / escenario complejo.
Digamos que master está en commit B. Ahora trabaje en el bug # 1.
git checkout -b bug1
Ahora estás en la rama bug1. Realice algunos cambios, confirme, espere la revisión del código. Esto es local, por lo que no está afectando a nadie más, y debería ser bastante fácil hacer un parche de git diffs.
A-B < master
\
C < bug1
Ahora estás trabajando en bug2. Ir volver a principal con git checkout master
. Hacer una nueva rama, git checkout -b bug2
. Haga cambios, comprométase, espere la revisión del código.
D < bug2
/
A-B < master
\
C < bug1
Supongamos que otra persona comete E&F en master mientras espera la revisión.
D < bug2
/
A-B-E-F < master
\
C < bug1
Cuando se aprueba su código, puede volverlo a crear en master con los siguientes pasos:
git checkout bug1
git rebase master
git checkout master
git merge bug1
Esto resultará en lo siguiente:
D < bug2
/
A-B-E-F-C' < master, bug1
Luego puede presionar, eliminar su rama local bug1, y listo. Un error a la vez en su espacio de trabajo, pero con el uso de ramas locales, su repositorio puede manejar múltiples errores. Y esto evita una etapa complicada de baile.
Responda a la pregunta de ctote en los comentarios:
Bueno, puedes volver a esconder cada error y solo trabajar con un error a la vez. Al menos eso te ahorra el problema de la puesta en escena. Pero después de haber intentado esto, personalmente lo encuentro problemático. Los escondites son un poco desordenados en un gráfico de registro de git. Y lo más importante, si arruinas algo, no puedes revertirlo. Si tiene un directorio de trabajo sucio y hace estallar un alijo, no puede "deshacer" ese pop. Es mucho más difícil arruinar los compromisos ya existentes.
Por lo tanto git rebase -i
.
Cuando vuelve a crear una rama en otra, puede hacerlo de forma interactiva (el indicador -i). Cuando haces esto, tienes la opción de elegir lo que quieres hacer con cada confirmación. Pro Git es un libro increíble que también está en línea en formato HTML, y tiene una buena sección sobre rebase y aplastamiento:
http://git-scm.com/book/ch6-4.html
Robaré su ejemplo literalmente por conveniencia. Suponga que tiene el siguiente historial de confirmaciones y desea volver a crear y aplastar bug1 en master:
F < bug2
/
A-B-G-H < master
\
C-D-E < bug1
Esto es lo que verá cuando escriba git rebase -i master bug1
pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame
pick a5f4a0d added cat-file
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
Para aplastar todos los commits de una rama en un solo commit, mantenga el primer commit como "pick" y reemplace todas las entradas posteriores "pick" con "squash" o simplemente "s". También tendrá la oportunidad de cambiar el mensaje de confirmación.
pick f7f3f6d changed my name a bit
s 310154e updated README formatting and added blame
s a5f4a0d added cat-file
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
Así que sí, aplastar es un poco molesto, pero aún así lo recomendaría sobre el uso intensivo de los escondites.