Forzar git stash para sobrescribir archivos agregados

223

Tengo algunos archivos que no fueron rastreados en git. Hice algunos cambios y quería confirmarlos, pero me di cuenta de que había olvidado registrar primero los archivos no modificados. Así que escondí los archivos, luego agregué las versiones sin modificar.

Luego, cuando aplico el alijo al repositorio, obtengo conflictos debido a que los archivos ya se han agregado.

¿Cómo puedo aplicar el alijo y forzar que las versiones en el alijo se usen con preferencia a los originales en el repositorio?

Gracias

Stefan
fuente
77
Solución fea hasta que alguien encuentre una mejor: elimine los archivos nuevos usando git rmantes de hacerlo git stash apply.
tom
¿No perderá eso la historia? La razón para agregar las versiones no modificadas fue mantener el historial.
Stefan
1
No, no perderá la historia. Si elimina un archivo, agréguelo de nuevo con una pequeña modificación, y luego confirme, gitlo tratará como una pequeña modificación.
tom

Respuestas:

365

Usar en git checkoutlugar de git stash apply:

$ git checkout stash -- .
$ git commit

Esto restaurará todos los archivos en el directorio actual a su versión oculta.


Si hay cambios en otros archivos en el directorio de trabajo que deben mantenerse, aquí hay una alternativa menos dura:

$ git merge --squash --strategy-option=theirs stash

Si hay cambios en el índice, o la fusión tocará archivos con cambios locales, git se negará a fusionar. Los archivos individuales se pueden extraer del alijo utilizando

$ git checkout stash -- <paths...>

o interactivamente con

$ git checkout -p stash
tom
fuente
Ninguno de estos funcionó en mi caso de uso. Los hallazgos y mi solución están aquí stackoverflow.com/a/26685296/496046 - esto también debería resolver su situación, @AlexanderBird
tremby
2
git checkout stash -- .Este comando literalmente no hizo nada cuando lo ejecuté.
Rotsiser Mho
3
@RotsiserMho Git no es muy bueno para proporcionar mensajes de confirmación. ¿Estás seguro de que no hizo nada? Funcionó bien para mí.
Sinjai
55
Tuve que ejecutar git checkout stash -- .en la carpeta principal más alta que contenía mis cambios, de lo contrario, solo aplicó cambios a la carpeta desde donde ejecuté el comando.
Leo
1
@Leo: Así es, es porque .especifica el directorio actual (puede reemplazarlo con una ruta diferente en lugar de cambiar el directorio). Actualicé mi respuesta para aclarar eso.
tom
13

git stash show -p | git apply

y luego git stash dropsi quieres soltar los elementos escondidos.

Hasan TBT
fuente
2
Nota: debe estar en la raíz del repositorio para que esto funcione correctamente, de lo contrario obtendrá esto .
Ruslan
@PengheGeng Como puede ver, respondí aproximadamente un año antes de NetEmmanuel
Hasan TBT
@Ruslan Lo consigo mientras estoy en la raíz de mi repositorio
Leo
6

Para forzar git stash popejecutar este comando

git stash show -p | git apply && git stash drop
NetEmmanuel
fuente
1

TL; DR:

git checkout HEAD path/to/file
git stash apply

Versión larga:

Obtiene este error debido a los cambios no confirmados que desea sobrescribir. Deshacer estos cambios con git checkout HEAD. Puede deshacer los cambios en un archivo específico con git checkout HEAD path/to/file. Después de eliminar la causa del conflicto, puede aplicar como de costumbre.

Usuario12547645
fuente