error de git stash: git stash pop y terminó con conflictos de fusión


Hice un git stash pop y terminé con conflictos de fusión. Eliminé los archivos del sistema de archivos e hice un git checkout como se muestra a continuación, pero cree que los archivos aún no se fusionan. Luego intenté reemplazar los archivos y hacer un git checkout de nuevo y el mismo resultado. I event intentó forzarlo con la bandera -f. Cualquier ayuda sería apreciada!

chirag-patels-macbook-pro:haloror patelc75$ git status
app/views/layouts/_choose_patient.html.erb: needs merge
app/views/layouts/_links.html.erb: needs merge
# On branch prod-temp
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   db/schema.rb
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       unmerged:   app/views/layouts/_choose_patient.html.erb
#       unmerged:   app/views/layouts/_links.html.erb

chirag-patels-macbook-pro:haloror patelc75$ git checkout app/views/layouts/_choose_patient.html.erb
error: path 'app/views/layouts/_choose_patient.html.erb' is unmerged
chirag-patels-macbook-pro:haloror patelc75$ git checkout -f app/views/layouts/_choose_patient.html.erb
warning: path 'app/views/layouts/_choose_patient.html.erb' is unmerged
Author: Chirag Patel, 2010-05-15

4 answers

Ver man git merge (CÓMO RESOLVER CONFLICTOS):

Después de ver un conflicto, puedes hacer dos cosas:

  • Decide no fusionarte. Las únicas limpiezas que necesita son restablecer el archivo de índice a la confirmación de HEAD a reverse 2. y para limpiar los cambios del árbol de trabajo realizados por 2. y 3.; git-reset hard hard se puede usar para esto.

  • Resolver los conflictos. Git marcará los conflictos en el árbol de trabajo. Editar los archivos en forma y git añadirlos al índice. Usa git commit para sellar el trato.

Y bajo TRUE MERGE (para ver qué 2. y 3. se refiere a):

Cuando no es obvio cómo conciliar los cambios, sucede lo siguiente:

  1. El puntero de la CABEZA permanece igual.

  2. La ref MERGE_HEAD se establece para apuntar a la otra cabeza de rama.

  3. Las rutas que se fusionan limpiamente se actualizan tanto en el archivo de índice como en tu árbol de trabajo.

  4. ...

Así que: use git reset --hard si desea eliminar los cambios de alijo de su árbol de trabajo, o git reset si desea simplemente limpiar el índice y dejar que los conflictos en su árbol de trabajo se fusionen a mano.

Bajo man git stash (OPCIONES, pop ) se puede leer además:

Aplicar el estado puede fallar con conflictos; en este caso, no se elimina de la lista de alijos. Tienes que resolver los conflictos a mano y llamar git stash drop manualmente después.

 216
Author: tanascius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-12 17:09:39

Me pasó algo similar. No quería preparar los archivos todavía, así que los agregué con git add y luego simplemente hice git reset. Esto básicamente acaba de añadir y luego sin marcar mis cambios, pero se borraron las rutas no fusionadas.

 40
Author: Aaron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-04 17:10:31

Si, como yo, lo que normalmente quieres es sobrescribir el contenido del directorio de trabajo con el de los archivos guardados, y aún tienes un conflicto, entonces lo que quieres es resolver el conflicto usando git checkout --theirs -- . desde la raíz.

Después de eso, puede git reset traer todos los cambios del índice al directorio de trabajo, ya que aparentemente en caso de conflicto los cambios a los archivos no conflictivos permanecen en el índice.

Es posible que también desee ejecutar git stash drop [<stash name>] después, para deshacerse de la stash, porque git stash pop no lo elimina en caso de conflictos.

 11
Author: Pedro Gimeno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-06 23:18:05

Tenga en cuenta que Git 2.5 (Q2 2015) un futuro Git podría intentar hacer que ese escenario sea imposible.

Ver commit ed178ef por Jeff King (peff), 22 Abr 2015.
(Merged by Junio C Hamano -- gitster -- in commit 05c3967, 19 May 2015)

Nota: Esto ha sido revertido. Véase más adelante .

stash: requiere un índice limpio para aplicar / pop

Problema

Si haber organizado el contenido en su índice y ejecutar " stash apply/pop", podemos llegar a un conflicto y poner nuevas entradas en el índice.
Recuperar a tu estado original es difícil en ese punto, porque herramientas como" git reset keep keep " destruirán todo lo que esté preparado.

En otras palabras:

"git stash pop/apply" se olvidó de asegurarse de que no solo el árbol de trabajo está limpio, sino también el índice está limpio.
Esto último es importante ya que una aplicación de alijo puede entrar en conflicto y el índice se utilizará para la resolución de conflictos.

Solución

Podemos hacer esto más seguro negándonos a aplicar cuando hay cambios escalonados.

Eso significa que si antes había merges debido a la aplicación de un stash en archivos modificados (agregados pero no confirmados), ahora no serían merges porque el stash apply / pop se detendría inmediatamente con: {[15]]}

Cannot apply stash: Your index contains uncommitted changes.

Obligarle a confirmar los cambios significa que, en caso de fusiones, puede fácilmente restaure el estado inicial( antes de git stash apply/pop) con un git reset --hard.


Ver commit 1937610 (15 de junio de 2015), y commit ed178ef (22 de abril de 2015) por Jeff King (peff).
(Merged by Junio C Hamano -- gitster -- in commit bfb539b, 24 Jun 2015)

Ese commit fue un intento de mejorar la seguridad de la aplicación un alijo, porque el proceso de solicitud puede crear entradas de índice en conflicto, después de lo cual es difícil de restaurar el estado de índice original.

Desafortunadamente, esto perjudica algunos flujos de trabajo comunes alrededor de " git stash -k", como:

git add -p       ;# (1) stage set of proposed changes
git stash -k     ;# (2) get rid of everything else
make test        ;# (3) make sure proposal is reasonable
git stash apply  ;# (4) restore original working tree

Si "git commit" entre los pasos (3) y (4) , entonces esto sólo funciona. Sin embargo, si estos pasos son parte de un pre-commit gancho, usted no tiene esa oportunidad (usted tiene que restaurar el estado original, independientemente de si las pruebas pasaron o fallar).

 2
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-25 08:07:44