¿Preservar solo las adiciones de files de una serie de confirmaciones de Git?

Deje A<-B<-C ser una secuencia de confirmaciones de Git.

Los compromisos B y C introducen 3 types de cambios:

  1. Agregar algunos files.
  2. Modificar algunos files.
  3. Borrando algunos files.

Desafortunadamente, los cambios de tipo 2 y 3 en B y C resultaron ser incorrectos. Por lo tanto, necesitamos derivar una secuencia modificada A<-B'<-C' , donde B' y C' solo incluyen las adiciones de files del A y B original, descartando cualquier Modificación o Supresión.

¿Cómo se puede hacer eso?

Si ayuda, no necesitamos absolutamente B' y C' como commits separados; podemos hacer solo con A<-D , donde D contiene cada file agregado en B o C

Puede intentar restablecer a A y agregar todos los files nuevos:

 # reset index, reset HEAD to A, preserve working tree. git reset A # Add only new files git add $(git ls-files -o --exclude-standard) # Make commit D (equals B and C new files) git commit -m "only new files from B and C" 

Para el segundo paso (agregar solo files nuevos), consulte " Git solo agrega todos los files nuevos, no los files modificados ".


El OP Dun Peal comenta :

C elimina algunos de los files introducidos por B. Por lo tanto, la copy de trabajo C no incluye todos los files introducidos por B. Supongo que podría evitar iterar sobre los compromisos uno a la vez, y realizar esto para cada uno.

Sí, se necesita un enfoque iterativo:

 git reset --hard B git reset A git add $(git ls-files -o --exclude-standard) git commit -m "only new files from B" 

Eso produce commit B' .

Repita para C , usando B' como base:

 git reset --hard C git reset B' git add $(git ls-files -o --exclude-standard) git commit -m "only new files from C"