Como se preguntó en esta pregunta , también quiero saber cómo resolver un conflicto git stash pop
sin agregar todas las modificaciones a una confirmación (al igual que "git stash pop" sin conflicto).
Mi enfoque actual es muy poco interesante porque lo hago de esta manera:
git stash pop -> CONFLICT
git stash drop
[resolve conflict]
[add conflict files]
git reset HEAD <all files that are in commit-mode>
[Actualización] Una forma de reproducirlo:
mkdir foo; cd foo; git init
echo "1" > one
echo "2" > two
git add -A; git commit -m "first"
echo "1.1" > one
echo "2.1" > two
git stash
echo "2.2" > two
git commit -a -m "second"
echo "Only this file would stay in HEAD without the conflict" > third
git add third
git stash pop
git status
2016-06-27: se agregó un nuevo archivo llamado 'tercero' al ejemplo para mostrar que soluciones alternativas como la solución de scy solo funcionan para HEADs vacías pero no solucionan el problema inicial de que HEAD no tiene el mismo contenido como para un git stash pop
sin conflicto.
git add
resolvió sus archivos de conflicto, organizándolos efectivamente en el índice, y no desea tenerlos en nuestro índice?git stash pop
tiene cuando no se produce ningún conflicto (pero con la notificación de qué archivos deben fusionarse).Respuestas:
No sigas otras respuestas
Bueno, puedes seguirlos :). Pero no creo que hacer una confirmación y luego restablecer la rama para eliminar esa confirmación y soluciones similares sugeridas en otras respuestas sean la forma más clara de resolver este problema.
Solución limpia
La siguiente solución parece ser mucho más limpia para mí y también es sugerida por el propio Git : intente ejecutar
git status
en el repositorio con un conflicto:Entonces, hagamos lo que Git sugiere (sin hacer ninguna confirmación inútil):
git reset
para marcar los conflictos como resueltos y desestabilizar los cambios. Puede ejecutarlo sin ningún parámetro y Git eliminará todo del índice. No tienes que ejecutargit add
antes.git stash drop
, porque Git no lo hace en caso de conflicto.Traducido a la línea de comandos:
Explicación del comportamiento predeterminado.
Hay dos formas de marcar los conflictos como resueltos:
git add
ygit reset
. Mientrasgit reset
marca los conflictos como resueltos y elimina los archivos del índice,git add
también marca los conflictos como resueltos, pero mantiene los archivos en el índice.Agregar archivos al índice después de resolver un conflicto es a propósito. De esta manera, puede diferenciar los cambios del alijo anterior y los cambios que realizó después de que se resolvió el conflicto. Si no le gusta, siempre puede usar
git reset
para eliminar todo del índice.Herramientas de fusión
Recomiendo usar cualquiera de las herramientas de combinación de 3 vías para resolver conflictos, por ejemplo , KDiff3 , Meld , etc., en lugar de hacerlo manualmente. Por lo general, resuelve todos o la mayoría de los conflictos automáticamente. ¡Es un gran ahorro de tiempo!
fuente
git stash pop
falla con los conflictos.git stash drop
menos que desee mantener ese alijo.Supongamos que tiene este escenario en el que oculta sus cambios para extraerlos del origen. Posiblemente porque sus cambios locales son solo
debug: true
en algunos archivos de configuración. Ahora tiras y alguien ha introducido una nueva configuración allí, creando un conflicto.git status
dice:Bueno. Decidí seguir con lo que Git sugirió: resolví el conflicto y me comprometí:
Ahora mi copia de trabajo está en el estado que quiero, pero he creado una confirmación que no quiero tener. ¿Cómo me deshago de esa confirmación sin modificar mi copia de trabajo? ¡Espera, hay un comando popular para eso!
Mi copia de trabajo no ha cambiado, pero la confirmación WIP se ha ido. Eso es exactamente lo que quería! (Tenga en cuenta que no lo estoy usando
--soft
aquí, porque si hay archivos fusionados automáticamente en su alijo, se almacenan automáticamente y, por lo tanto, terminaría con estos archivos nuevamentereset
).Pero queda una cosa más: la página del manual
git stash pop
nos recuerda que "la aplicación del estado puede fallar con los conflictos; en este caso, no se elimina de la lista oculta. Es necesario resolver los conflictos a mano y llamargit stash drop
manualmente después". Entonces eso es exactamente lo que hacemos ahora:Y hecho.
fuente
git add <resolved conflict files>
seguirgit reset HEAD
?git stash pop
sin un conflicto. Simplemente agregue otro archivo a HEAD antes de hacer el conflictogit stash pop
ygit commit -a -m WIP
luego también agregaría el nuevo archivo al commit. Pero sin un conflicto, solo el nuevo archivo permanecería en HEAD pero no losgit stash pop
archivos.^
se usa como una continuación de línea especial y lo dejará sentado en un Más? preguntar en lugar de ejecutar el comando. En lugar de utilizar:git reset --soft HEAD~1
. ¿En lugar de agregar los cambios que realice para resolver el conflicto, puede usarlo
git reset HEAD file
para resolver el conflicto sin organizar sus cambios.Sin embargo, es posible que deba ejecutar este comando dos veces. Una vez para marcar el conflicto como resuelto y una vez para desestimar los cambios organizados por la rutina de resolución de conflictos.
Es posible que haya un modo de reinicio que haga ambas cosas simultáneamente, aunque ahora no hay ninguno.
fuente
trabajó para mi.
Nota : esto puede ser peligroso ya que no intenta fusionar los cambios del alijo en su copia de trabajo, sino que lo sobrescribe con los archivos escondidos. Para que pueda perder sus cambios no comprometidos.
fuente
git add .
organizará TODOS los archivos diciéndole a git que ha resuelto el conflictogit reset
desestabilizará TODOS los archivos organizados sin crear una confirmaciónfuente
git add -u
continuacióngit reset
Parece que esta puede ser la respuesta que estás buscando, aún no lo he intentado personalmente, pero parece que puede ser el truco. Con este comando, GIT intentará aplicar los cambios como estaban antes, sin intentar agregarlos todos para confirmar.
git stash apply --index
Aquí está la explicación completa:
http://git-scm.com/book/en/Git-Tools-Stashing
fuente
git stash pop
, o ¿hay alguna forma de revertir esto y hacerlogit stash apply --index
cuando descubrí quegit stash pop
se encontrará con un conflicto?git stash pop
y termina con conflictos, el alijo no se elimina ... para que puedas ejecutargit reset --hard
para deshacer el pop y luego probar la solución que sugerí.git stash branch
will works, que crea una nueva rama para usted, comprueba el commit en el que estaba cuando escondió su trabajo, vuelve a aplicar su trabajo allí y luego deja caer el alijo si se aplica con éxito. mira estofuente
La forma más rápida que he encontrado es resolver el conflicto, luego hacer
git add -u
, y luego hacergit reset HEAD
, que ni siquiera implica un compromiso.fuente
Según las preguntas de git stash , después de arreglar el conflicto,
git add <file>
es el curso de acción correcto.Fue después de leer este comentario que entendí que los cambios se agregan automáticamente al índice (por diseño). Es por eso que
git add <file>
completa el proceso de resolución de conflictos.fuente
No es la mejor manera de hacerlo, pero funciona:
fuente
file/path/to/your/file
, que no es lo que el OP preguntó, AFAIU