Guarda sólo un archivo de los múltiples archivos que han cambiado con Git.

git git-stash


¿Cómo puedo esconder sólo uno de los múltiples archivos modificados en mi sucursal?




Answer 1 bukzor


Descargo de responsabilidad : la siguiente respuesta es para git antes de git 2.13. Para git 2.13 y más, mira otra respuesta más abajo .


Warning

Como se ha señalado en los comentarios,esto pone todo en el escondite,tanto en escena como sin escena.El índice --keep-index sólo deja el índice solo después de que el escondite está hecho.Esto puede causar conflictos de fusión cuando más tarde se abre el escondite.


Esto esconderá todo lo que no haya agregado previamente. Simplemente git add las cosas que desea conservar, luego ejecútelo.

git stash --keep-index

Por ejemplo,si quieres dividir una vieja confirmación en más de un conjunto de cambios,puedes usar este procedimiento:

  1. git rebase -i <last good commit>
  2. Marcar algunos cambios como edit ar .
  3. git reset HEAD^
  4. git add <files you want to keep in this change>
  5. git stash --keep-index
  6. Arregle las cosas según sea necesario. No olvides git add cualquier cambio.
  7. git commit
  8. git stash pop
  9. Repita,desde el número 5,según sea necesario.
  10. git rebase --continue



Answer 2 konrad.kruczynski


También puede usar git stash save -p "my commit message" . De esta forma, puede seleccionar qué trozos se deben agregar al alijo, también se pueden seleccionar archivos completos.

Se le pedirá que haga unas cuantas acciones por cada trozo:

   y - stash this hunk
   n - do not stash this hunk
   q - quit; do not stash this hunk or any of the remaining ones
   a - stash this hunk and all later hunks in the file
   d - do not stash this hunk or any of the later hunks in the file
   g - select a hunk to go to
   / - search for a hunk matching the given regex
   j - leave this hunk undecided, see next undecided hunk
   J - leave this hunk undecided, see next hunk
   k - leave this hunk undecided, see previous undecided hunk
   K - leave this hunk undecided, see previous hunk
   s - split the current hunk into smaller hunks
   e - manually edit the current hunk
   ? - print help



Answer 3 VonC


Since git is fundamentally about managing a all repository content and index (and not one or several files), git stash deals, not surprisingly, with the all working directory.

Actually, since Git 2.13 (Q2 2017), you can stash individual files, with git stash push:

git stash push [--] [<pathspec>...]

Cuando pathspec se asigna a ' git stash push ', el nuevo alijo registra los estados modificados solo para los archivos que coinciden con el camino específico. Consulte " Cambios de alijo a archivos específicos " para obtener más información.

Ejemplo simplificado:

 git stash push path/to/file

El caso de prueba para esta función muestra algunas opciones más desactivadas:

test_expect_success 'stash with multiple pathspec arguments' '
    >foo &&
    >bar &&
    >extra &&
    git add foo bar extra &&

    git stash push -- foo bar &&   

    test_path_is_missing bar &&
    test_path_is_missing foo &&
    test_path_is_file extra &&

    git stash pop &&
    test_path_is_file foo &&
    test_path_is_file bar &&
    test_path_is_file extra

La respuesta original (abajo,junio de 2010)se refería a la selección manual de lo que se quiere esconder.

Comentarios de Casebash :

Esta (la solución original de stash --patch ) es agradable, pero a menudo he modificado muchos archivos, por lo que usar parche es molesto

bukzor 's respuesta (upvoted, noviembre de 2011) sugiere una solución más práctica, basado en
git add + git stash --keep-index .
Ve a ver y vota su respuesta,que debería ser la oficial (en lugar de la mía).

Acerca de esa opción, chhh señala un flujo de trabajo alternativo en los comentarios:

deberías " git reset --soft " después de un alijo para recuperar tu puesta en escena clara:
Para llegar al estado original-que es una clara área de escenificación y con sólo algunas modificaciones selectas no escenificadas,uno podría suavemente reajustar el índice para obtener (sin cometer nada como tú-bukzor-lo hizo).


(Respuesta original de junio de 2010: alijo manual)

Sin embargo, git stash save --patch podría permitirle lograr el alijo parcial que busca :

Con --patch , puede seleccionar interactivamente trozos en la diferencia entre HEAD y el árbol de trabajo que se va a guardar.
La entrada del escondite está construida de tal manera que su estado de índice es el mismo que el estado de índice de su depósito,y su árbol de trabajo contiene sólo los cambios que usted seleccionó de manera interactiva.Los cambios seleccionados son entonces retirados de su árbol de trabajo.

Sin embargo,eso guardará el índice completo (que puede no ser lo que usted quiere,ya que podría incluir otros archivos ya indexados),y un árbol de trabajo parcial (que podría parecerse al que usted quiere esconder).

git stash --patch --no-keep-index

podría ser un mejor ajuste.


Si --patch no funciona, un proceso manual podría:

Para uno o varios archivos,una solución intermedia sería..:

  • copiarlos fuera del repo de Git
    (En realidad, el eleotlecram propone una alternativa interesante )
  • git stash
  • copiarlos de nuevo
  • git stash # esta vez, solo se guardan los archivos que deseas
  • git stash pop stash@{1} # vuelve a aplicar todas las modificaciones de tus archivos
  • git checkout -- afile # restablece el archivo al contenido HEAD, antes de cualquier modificación local

Al final de ese proceso bastante engorroso,sólo tendrá uno o varios archivos escondidos.




Answer 4 blueyed


Cuando git stash -p (o git add -p con stash --keep-index ) sería demasiado engorroso, me resultó más fácil usar diff , checkout y apply :

Para "esconder" un archivo o directorio en particular solamente:

git diff path/to/dir > stashed.diff
git checkout path/to/dir

Luego,después...

git apply stashed.diff



Answer 5 sandstrom


Use git stash push , así:

git stash push [--] [<pathspec>...]

Por ejemplo:

git stash push -- my/file.sh

Está disponible desde Git 2.13, lanzado en la primavera de 2017.