git stash y pop muestra el archivo que ya no está marcado como movido?


git mv file1 file2

git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   renamed:    file1 -> file2

git stash
git stash pop

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   file2
#
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    file1

Como puedes ver, git pierde la relación renombrada después de un stash / pop. ¿Hay alguna manera de recuperar esta relación, o hacer que stash sepa que los archivos se movieron? A menudo me escondí para ver cómo es el estado de mi sistema antes de los cambios, pero tener que perder la relación de cambio de nombre es un problema para mí. No se como arreglarlo aparte de borrar el nuevo archivo, hacer un git mv de nuevo, y reemplazar el contenido del nuevo archivo.

Author: SQB, 2011-12-13

2 answers

Si aún no has reventado tu alijo, haz:

git stash pop --index

Esto conserva correctamente las relaciones de archivo movidas (pero no confirmadas) en un alijo. Según git help stash:

Si se usa la opción index index, entonces intenta restablecer no solo los cambios del árbol de trabajo, sino también los del índice. Sin embargo, esto puede fallar, cuando tiene conflictos (que se almacenan en el índice, donde por lo tanto ya no puede aplicar los cambios como antes originalmente).

Si ya has reventado tu alijo y quieres volver a crear la relación movida, haz:

git rm --cached file1

Esto elimina el archivo" antiguo " inmóvil del índice:

Utilice esta opción para eliminar y eliminar rutas solo del índice

 29
Author: manojlds,
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-10-23 19:03:21

Respuesta corta: git rm --cached file1

Todo lo que git mv realmente hace es renombrar el archivo (en el sistema de archivos) y luego agregar una eliminación y creación de archivo al índice (área de preparación). No está especialmente marcado. Otra maquinaria posteriormente se da cuenta de que era un cambio de nombre, al ver que el contenido que se llamaba file1 antes ahora se llama file2.

Dado que los comandos git stash modifican el índice, pueden perturbar las cosas. Tenga en cuenta que ahora tiene la creación por etapas, pero no la eliminación! (Normalmente git stash deja todo sin marcar después de un pop, pero en este caso creo que no tiene más remedio que poner el nuevo archivo en el índice, para evitar que no tenga idea de cuál conservar. Puede evitar que esto suceda con git stash pop --index, pero eso se apaga si los cambios guardados no se pueden aplicar limpiamente, por lo que no es predeterminado.) git status ya no es posible mostrarlo como un cambio de nombre, porque el cambio de nombre se divide efectivamente entre el índice y el árbol de trabajo, y ninguna sección puede reclamarlo completamente.

Simplemente ejecute git rm --cached file1 para organizar la eliminación (es decir, eliminar el archivo 1 del índice) y se mostrará como un cambio de nombre de nuevo. También puede ejecutar git add -u para agregar cambios automáticamente, siempre y cuando no tenga otros cambios que no desee realizar.

Ten en cuenta que esto significa que en la práctica no necesitas preocuparte: cuando preparas correctamente todo en preparación para commit (por ejemplo, con git add -u), el "problema" se arregla solo.

 20
Author: Cascabel,
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
2011-12-13 22:10:46