what unstash stash commits changes and git git-stash

unstash - ¿Cómo resolver git stash conflict sin commit?



stash changes on git (10)

Como se hizo en esta pregunta , también quiero saber cómo resolver un git stash pop conflicto sin agregar todas las modificaciones a un commit (al igual que "git stash pop" sin un conflicto).

Mi enfoque actual es muy poco cool 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 las soluciones alternativas como la solución de scy solo funcionan para HEAD vacías, pero no solucionan el problema inicial de que HEAD no tiene el mismo contenido como Para un git stash pop sin un conflicto.


De acuerdo con las preguntas de git stash , después de solucionar 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 añaden automáticamente al índice (por diseño). Es por eso que git add <file> completa el proceso de resolución de conflictos.


En lugar de agregar los cambios que realice para resolver el conflicto, puede usar el git reset HEAD file para resolver el conflicto sin programar sus cambios.

Puede que tenga que ejecutar este comando dos veces, sin embargo. Una vez para marcar el conflicto como resuelto y una vez para anular los cambios que se realizaron en la rutina de resolución de conflictos.

Es posible que haya un modo de reinicio que haga ambas cosas simultáneamente, aunque no haya uno ahora.


La forma más rápida que he encontrado es resolver el conflicto, luego hacer git add -u , y luego hacer git reset HEAD , que ni siquiera implica un compromiso.


No creo que hacer una confirmación y luego restablecer la rama para eliminar esa confirmación y soluciones similares sugeridas en otras respuestas es la forma limpia de resolver este problema.

La siguiente solución me parece mucho más limpia y también lo sugiere el propio Git : ejecutar el git status en el repositorio con un conflicto:

Unmerged paths: (use "git reset HEAD <file>..." to unstage) (use "git add <file>..." to mark resolution)

Hagamos lo que Git sugiere sin hacer ningún compromiso:

  1. Manualmente (o utilizando alguna herramienta de combinación de GUI) resuelve el conflicto (s).
  2. Use git reset para marcar los conflictos como resueltos y eliminar los cambios. Puedes ejecutarlo sin ningún parámetro y Git eliminará todo del índice. No tienes que ejecutar git add antes.
  3. Finalmente, elimine el alijo con git stash drop , porque Git no hace eso en el conflicto.

Asi que:

$ git stash pop # ...manually resolve conflict(s) $ git reset $ git stash drop

Nota: 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 te gusta, siempre puedes usar git reset para eliminar todo del índice.

Otra nota: recomiendo usar cualquiera de las herramientas de combinación de 3 vías para resolver conflictos, por ejemplo, KDiff3 . Suele resolver la mayoría de los conflictos automáticamente.


No es la mejor manera de hacerlo pero funciona:

$ git stash apply $ >> resolve your conflict << $ >> do what you want to do with your code << $ git checkout HEAD -- file/path/to/your/file


Parece que esta puede ser la respuesta que está buscando, no lo he intentado personalmente todavía, pero parece que puede hacer 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


Supongamos que tiene este escenario en el que guarda sus cambios para poder extraerlos del origen. Posiblemente porque sus cambios locales son solo debug: true en algunos archivos de configuración. Ahora tira y alguien ha introducido una nueva configuración allí, creando un conflicto.

git status dice:

# On branch master # Unmerged paths: # (use "git reset HEAD <file>..." to unstage) # (use "git add/rm <file>..." as appropriate to mark resolution) # # both modified: src/js/globals.tpl.js no changes added to commit (use "git add" and/or "git commit -a")

Bueno. Decidí seguir con lo que Git sugirió: resolví el conflicto y me comprometí:

vim src/js/globals.tpl.js # type type type … git commit -a -m WIP # (short for "work in progress")

Ahora mi copia de trabajo está en el estado que quiero, pero he creado un compromiso que no quiero tener. ¿Cómo me deshago de ese compromiso sin modificar mi copia de trabajo? Espera, hay un comando popular para eso!

git reset HEAD^

Mi copia de trabajo no se ha modificado, pero la confirmación WIP se ha ido. ¡Eso es exactamente lo que quería! (Tenga en cuenta que no estoy usando --soft aquí, porque si hay archivos fusionados automáticamente en su alijo, se configuran automáticamente y, por lo tanto, terminará con estos archivos nuevamente en la reset después del reset ).

Pero queda una cosa más: la página de manual de 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 de escondites. Debe resolver los conflictos manualmente y llamar a git stash drop manualmente después". Así que eso es exactamente lo que hacemos ahora:

git stash drop

Y hecho.


git stash branch funciona, lo que crea una nueva rama para ti, comprueba el compromiso que tenías cuando escondiste tu trabajo, vuelve a aplicar tu trabajo allí y luego elimina el alijo si se aplica con éxito. mira this


git add . git reset

git add . pondrá en escena TODOS los archivos indicando a git que has resuelto el conflicto

git reset desestabilizará TODOS los archivos montados sin crear un commit


git checkout stash -- .

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 ocultos en su lugar. Así que puedes perder tus cambios no comprometidos.