Git: ignora los primeros commits pero envía otros commits posteriores a la twig

A menudo me encuentro en una situación en la que clono un repository, creo una sucursal local y luego tengo que hacer un trabajo de configuration inicial, que cambia algunos files, antes de poder continuar con los cambios reales que deseo realizar más tarde.

Por ejemplo: he clonado un proyecto de Visual C ++ y he creado la twig local. Ahora tengo que cambiar los directorys include y lib para hacer una reference correcta de libboost. Esto cambia el file .vcxproj , pero obviamente es un cambio que no quiero enviar a origin/master . Solo los cambios posteriores son cambios reales.

He considerado usar git update-index --assume-unchanged <file> , pero eso ignorará todo el file y, por lo tanto, descarta la posibilidad de otros cambios en el file que quisiera confirmar.

¿Cuáles son las soluciones están ahí? Es git rebase tal vez la solución?

Sí, lo más probable es que git rebase sea ​​lo que quieres.

Hay muchas forms de hacerlo. Una forma sería comenzar con los cambios que no desea enviar, y cuando haya terminado, use git rebase --interactive para que pueda reorderar los commits y poner esos cambios no relacionados al final.

Algo como:

  • Proyecto de cambio (proyecto)
  • Fix 2 (arreglos)
  • Fix 1
  • Última confirmación (maestro)

Estoy agregando manualmente nombres de twigs (maestros, arreglos y proyectos), aunque puedes hacerlo sin twigs. Por ejemplo, si desea enviar todas las confirmaciones de la twig 'proyecto' como una twig 'arreglos', excepto la última, aunque no tenga esa twig local, puede hacer lo siguiente:

 git push origin project^:fixes 

Otra opción es tener una twig permanente de 'proyecto' que tenga los cambios locales en '.vcproj.default', y luego tener sus otras twigs basadas en la parte superior:

  • Fix 2 (arreglos)
  • Fix 1
  • Proyecto de cambio (proyecto)
  • Última confirmación (maestro)

Después de que haya terminado con su twig 'arreglos', puede volver a establecer la base de su twig antes de presionarla:

 git rebase --onto master project fixes 

Esto básicamente elegirá los commits de 'proyecto' a 'arreglos' ("Fix 1" y "Fix 2"), y los rebase en la parte superior de master, esencialmente eliminando el commit de "Project change" de la twig.

No estoy seguro de si recibí su pregunta correctamente, pero creo que no es una buena idea colocar un file de configuration que contenga la configuration local directamente en el repository. En su lugar, agregaría un file, digamos .vcproj.default al repository que contiene definiciones pnetworkingeterminadas para todas las configuraciones. Después de clonar un repository, solo

 cp .vcproj.default .vcproj 

y luego cambie la configuration que necesita. El file .vcproj mismo excluiría usando el file .gitignore .

Los filters pueden hacer que el process sea sencillo. Aquí está la idea básica , obtienes sed para save los valores actuales de la stream ascendente y replacelos con los tuyos en el momento del pago, y save tus valores actuales y replacelos con los de la stream ascendente en la verificación. ¿Puede proporcionar una muestra de los cambios que desea evitar que se filtren?