¿Cómo seleccionar solo cambios en ciertos archivos?

Resuelto Tobias Kienzler asked hace 13 años • 15 respuestas

Si quiero fusionar en una rama de Git los cambios realizados solo en algunos de los archivos modificados en una confirmación particular que incluye cambios en varios archivos, ¿cómo se puede lograr esto?

Supongamos que la confirmación de Git llamada stufftiene cambios en los archivos A,,, y, pero solo quiero fusionar los cambios en los archivos y . Suena como un trabajo, pero solo sabe cómo fusionar confirmaciones completas, no un subconjunto de los archivos.BCDstuffABgit cherry-pickcherry-pick

Tobias Kienzler avatar Apr 19 '11 20:04 Tobias Kienzler
Aceptado

Lo haría con cherry-pick -n( --no-commit), que te permite inspeccionar (y modificar) el resultado antes de confirmar:

git cherry-pick -n <commit>

# unstage modifications you don't want to keep, and remove the
# modifications from the work tree as well.
# this does work recursively!
git checkout HEAD <path>

# commit; the message will have been stored for you by cherry-pick
git commit

Si la gran mayoría de las modificaciones son cosas que no desea, en lugar de verificar rutas individuales (el paso intermedio), puede restablecer todo y luego agregar lo que desee:

# unstage everything
git reset HEAD

# stage the modifications you do want
git add <path>

# make the work tree match the index
# (do this from the top level of the repo)
git checkout .
Cascabel avatar Apr 19 '2011 14:04 Cascabel

Los otros métodos no funcionaron para mí ya que la confirmación tuvo muchos cambios y conflictos con muchos otros archivos. Lo que se me ocurrió fue simplemente

git show SHA -- file1.txt file2.txt | git apply -

En realidad, no guarda addlos archivos ni realiza una confirmación por usted, por lo que es posible que deba realizar un seguimiento con

git add file1.txt file2.txt
git commit -c SHA

O si desea omitir el complemento, puede usar el --cachedargumento paragit apply

git show SHA -- file1.txt file2.txt | git apply --cached -

También puedes hacer lo mismo con directorios completos.

git show SHA -- dir1 dir2 | git apply -
Michael Anderson avatar Apr 22 '2015 05:04 Michael Anderson

Normalmente uso la -pbandera con un git checkout de la otra rama, lo cual me parece más fácil y granular que la mayoría de los otros métodos que he encontrado.

En principio:

git checkout <other_branch_name> <files/to/grab in/list/separated/by/spaces> -p

ejemplo:

git checkout mybranch config/important.yml app/models/important.rb -p

Luego aparece un cuadro de diálogo que le pregunta qué cambios desea en los "blobs". Esto prácticamente funciona para cada fragmento de cambio continuo de código que luego puede indicar y(Sí), n(No), etc., para cada fragmento de código.

La opción -po patchfunciona para una variedad de comandos en git, incluido git stash save -pel que le permite elegir lo que desea guardar de su trabajo actual.

A veces uso esta técnica cuando he trabajado mucho y me gustaría separarlo y comprometerme en más confirmaciones basadas en temas usando git add -py eligiendo lo que quiero para cada confirmación :)

Tyrone Wilson avatar Mar 02 '2016 09:03 Tyrone Wilson

La situación:

Estás en tu rama, digamos, mastery tienes tu compromiso en cualquier otra rama. Tienes que elegir sólo un archivo de esa confirmación en particular.

El enfoque:

Paso 1: Realizar el pago en la sucursal requerida.

git checkout master

Paso 2: asegúrese de haber copiado el hash de confirmación requerido.

git checkout commit_hash path\to\file

Paso 3: Ahora tienes los cambios del archivo requerido en la rama deseada. Sólo necesitas agregarlos y confirmarlos.

git add path\to\file
git commit -m "Your commit message"
techdreams avatar Aug 07 '2018 05:08 techdreams

Quizás la ventaja de este método sobre la respuesta de Jefromi es que no es necesario recordar qué comportamiento de git reset es el correcto :)

 # Create a branch to throw away, on which we'll do the cherry-pick:
 git checkout -b to-discard

 # Do the cherry-pick:
 git cherry-pick stuff

 # Switch back to the branch you were previously on:
 git checkout -

 # Update the working tree and the index with the versions of A and B
 # from the to-discard branch:
 git checkout to-discard -- A B

 # Commit those changes:
 git commit -m "Cherry-picked changes to A and B from [stuff]"

 # Delete the temporary branch:
 git branch -D to-discard
Mark Longair avatar Apr 19 '2011 13:04 Mark Longair