2012-09-06 14 views
20

Tengo un gran proyecto de git que, estúpidamente, importé a eclipse y ejecuté un autoformato. Ahora, cada archivo en el proyecto se muestra como modificado. En lugar de comprometer mis archivos formateados, preferiría revertir todos los archivos en los que solo he sido formateado y no tuve otros cambios. Por ejemplo:Stash cambia a archivos específicos

$ git status 
# On branch master 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# (commit or discard the untracked or modified content in submodules) 

#  modified: dir/file1.cpp 
#  modified: dir/file1.h 
#  modified: dir/file2.cpp 
#  modified: dir/file2.h 
#  modified: dir/file3.cpp 
#  modified: dir/file3.h 
#  modified: dir/file4.cpp 
#  modified: dir/file4.h 

Sé que file2.cpp, file2.h y file3.cpp han sido modificados con el contenido (es decir, no sólo con formato). Quiero esconder los cambios en estos tres archivos y luego verificar una revisión anterior, para poder volver a aplicar los cambios a estos archivos después. Yo preferiría evitar algo así como:

$ cp file2.cpp ~/tmp 
$ git checkout blahblahblah 
$ cp ~/tmp/file2.cpp . 

Si hay una manera obvia de hacerlo que imposible involucrar a esconder, que me haga saber. lo que hace el trabajo.

+0

Tome un vistazo a la pregunta (http://stackoverflow.com/questions/5506339/how-can-i-git-stash-a-specific-file) pero también parece que en su caso podría 'git add' los archivos con cambios que desea mantener y luego' git checkout - .' y luego, al final, extraiga los archivos agregados si lo desea. – mikej

+0

Con el próximo Git 2.13 (Q2 2017), el comando real sería 'git stash push - file2.cpp file2.h file3.cpp'. Consulte [mi respuesta a continuación] (http://stackoverflow.com/a/42963606/6309) – VonC

Respuesta

21

Puede add los archivos con los cambios que desea conservar, a continuación, stash el resto de los archivos y limpiar el alijo: (. Tenga en cuenta que esto borrará todo de sus escondites)

git add file2.cpp file2.h file3.cpp 
git stash --keep-index 
git stash clear 

Esto lo dejará con file2.cpp, file2.h, y file3.cpp en etapas para la confirmación. Si a continuación desea para guardar estos archivos (y no cometerlos):

git reset 
git stash 

Ahora usted estará en su confirmación anterior, únicamente con los tres archivos escondidos.

+7

¿por qué necesita ejecutar 'stash clear'? – sekmo

3

Eso es un buen uso para git diff y git apply IMO:

git diff file2.cpp file2.h file3.cpp > ../my-changes.patch 
git checkout ... 
git apply ../my-changes.patch 

Después diff, puede inspeccionar el archivo de revisión para asegurarse de que todos los cambios están ahí.

Tenga en cuenta que puede necesitar utilizar la opción --reject para aplicar, en caso de que el parche no se aplique limpiamente. También vea el man page for apply.

5

Una buena opción es utilizar el modo de almacenamiento interactivo.

git stash --patch 

Funciona sobre todo como el modo de suma interactivo: usted va a ser presentado con una serie de diferenciaciones que muestran los cambios que tiene en su árbol de trabajo y usted tiene que elegir qué archivos (o sólo ciertas partes de una archivo!) que quiere esconder, el resto se mantendrá intacto.

De man git-stash:

Con --patch, se puede seleccionar de forma interactiva trozos del diff entre la cabeza y el árbol de trabajo que se llegar escondidos. La entrada oculta se construye de modo que su estado de índice sea el mismo que el estado de índice de su repositorio, y su árbol de trabajo contiene solo los cambios que seleccionó de forma interactiva. Los cambios seleccionados se deshacen de su árbol de trabajo. Consulte el "Interactive Mode" section of git-add(1) para aprender a usar el modo --patch.

En su caso, podrá ver trozos de formato único y esconderlos individualmente, sin perder sus cambios significativos.

19

sé que file2.cpp, file2.h y file3.cpp han sido modificados con el contenido (es decir, no sólo con formato).
Quiero esconder los cambios en estos tres archivos y luego verificar una revisión anterior, para poder volver a aplicar los cambios a estos archivos después.

Con Git 2,13 (Q2 2017), escondite GIT tendrá oficialmente una manera para guardar los cambios para archivos específicos con

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

Ver commit 9e14090, commit 1ada502, commit df6bba0 (28 de febrero 2017), y commit 9ca6326, commit 6f5ccd4, commit f5727e2 (19 de febrero de 2017) por Thomas Gummerer (tgummerer).
(Fusionada por Junio C Hamano -- gitster -- en commit 44c3f09 10 Mar 2017)

Como now documented:

Para hacer rápidamente una instantánea, se puede omitir "empuje".
En este modo, los argumentos no opcionales no pueden evitar que un subcomando mal escrito haga un escondite no deseado.
Las dos excepciones a esto son stash -p que actúa como alias para stash push -p y pathspecs, que se permiten después de un doble guion -- para la desambiguación.

Cuando se da a pathspec 'git stash push', el nuevo escondite registra los estados modificados sólo para los archivos que coinciden con el pathspec.
Las entradas de índice y los archivos de árbol de trabajo se retrotraen al estado en HEAD solo para estos archivos, dejando también archivos que no coinciden con la ruta de acceso intacta.

Tenga en cuenta, como ha señalado en medmundsthe comments, que git stash sería utilizar rutas relative to the root folder of the git repo.

+0

Versión 2.13 (para Windows) no publicado a la fecha de este comentario. – OmegaMan

+0

@OmegaMan sí: Git 2.13 (Linux) se lanzará en dos días (10 de mayo): https://calendar.google.com/calendar/embed?src=jfgbl2mrlipp4pb6ieih0qr3so%40group.calendar.google.com (desde http://stackoverflow.com/a/14931771/6309). Git para Windows debería lanzarse en las próximas 24 a 48 horas después de eso. – VonC

+1

@OmegaMan Y ... ¡liberado! https://github.com/git-for-windows/git/releases/tag/v2.13.0.windows.1 – VonC

1

También puedes usar git stash -p. De esta forma puede seleccionar qué partes se deben agregar a los escondites, también se pueden seleccionar archivos completos.

Se le pedirá con algunas acciones para cada trozo: [? Cómo puedo GIT esconder un archivo específico]

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 
Cuestiones relacionadas