Pregunta

Tengo cambios en un archivo, más un nuevo archivo, y me gustaría usar git stash para guardarlos mientras cambio a otra tarea. Pero git stash por sí solo oculta solo los cambios en el archivo existente; el nuevo archivo permanece en mi árbol de trabajo, abarrotando mi trabajo futuro. ¿Cómo guardo este archivo no rastreado?

¿Fue útil?

Solución

Actualización 17 de mayo de 2018:

Las nuevas versiones de git ahora tienen git stash --all que oculta todos los archivos, incluidos los archivos no rastreados e ignorados.
git stash --include-untracked ya no toca los archivos ignorados (probado en git 2.16.2).

Respuesta original a continuación:

Advertencia, al hacer esto se eliminarán permanentemente sus archivos si tiene alguna entrada de directorio / * en su archivo gitignore.

A partir de la versión 1.7.7 puede usar git stash --include-untracked o git stash save -u para guardar archivos sin rastrear sin organizarlos.

Agregue ( git add ) el archivo y comience a rastrearlo. Entonces esconder. Como todo el contenido del archivo es nuevo, se guardarán y podrá manipularlo según sea necesario.

Otros consejos

A partir de git 1.7.7, git stash acepta la opción --include-rastreado (o -u abreviado). Para incluir archivos sin seguimiento en su escondite, use cualquiera de los siguientes comandos:

git stash --include-untracked
git stash -u

Advertencia, hacer esto eliminará permanentemente sus archivos si tiene alguna entrada de directorio / * en su archivo gitignore.

Agregue el archivo al índice:

git add path/to/untracked-file
git stash

Todo el contenido del índice, más cualquier cambio no escalonado a los archivos existentes, todo entrará en el alijo.

En git bash, el almacenamiento de archivos no rastreados se logra mediante el comando

git stash --include-untracked

o

git stash -u

http://git-scm.com/docs/git-stash

git stash elimina cualquier archivo no rastreado o no confirmado de su espacio de trabajo. Y puede revertir git stash usando los siguientes comandos

git stash pop

Esto colocará el archivo nuevamente en su espacio de trabajo local.

Mi experiencia

Tuve que realizar una modificación en mi archivo gitIgnore para evitar el movimiento de los archivos .classpath y .project en el repositorio remoto. No puedo mover este .gitIgnore modificado en repositorio remoto a partir de ahora.

Los archivos

.classpath y .project son importantes para eclipse, que es mi editor de Java.

En primer lugar, agregué selectivamente el resto de los archivos y me comprometí para la puesta en escena. Sin embargo, el empuje final no se puede realizar a menos que el archivo .gitIgnore modificado se encuentre y los archivos no rastreados, a saber. .project y .classpath no están escondidos.

Utilicé

 git stash 

para guardar el archivo .gitIgnore modificado.

Para guardar el archivo .classpath y .project, utilicé

<*>

y eliminó los archivos de mi espacio de trabajo. La ausencia de estos archivos me quita la capacidad de trabajar en mi ubicación de trabajo en eclipse. Continué completando el procedimiento para enviar los archivos comprometidos a control remoto. Una vez que esto se hizo con éxito, usé

<*>

Esto pegó los mismos archivos en mi espacio de trabajo. Esto me devolvió mi capacidad de trabajar en el mismo proyecto en eclipse. Espero que esto deje de lado las ideas falsas.

Como se ha dicho en otra parte, la respuesta es git add el archivo. por ejemplo:

git add path/to/untracked-file
git stash

Sin embargo, la pregunta también se plantea en otra respuesta: ¿Qué sucede si realmente no desea agregar el archivo? Bueno, por lo que puedo ver, tienes que hacerlo. Y lo siguiente NOT funcionará:

git add -N path/to/untracked/file     # note: -N is short for --intent-to-add
git stash

esto fallará, como sigue:

path/to/untracked-file: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state

Entonces, ¿qué puedes hacer? Bueno, realmente debe agregar el archivo, sin embargo , puede anular la agregación efectiva más adelante, con git rm --cached :

git add path/to/untracked-file
git stash save "don't forget to un-add path/to/untracked-file" # stash w/reminder
# do some other work
git stash list
# shows:
# stash@{0}: On master: don't forget to un-add path/to/untracked-file
git stash pop   # or apply instead of pop, to keep the stash available
git rm --cached path/to/untracked-file

Y luego puede continuar trabajando, en el mismo estado en que estaba antes del git add (es decir, con un archivo no rastreado llamado ruta / a / untracked-file ; más cualquier otro cambio que pueda haber tenido para rastrear archivos).

Otra posibilidad para un flujo de trabajo en esto sería algo como:

git ls-files -o > files-to-untrack
git add `cat files-to-untrack` # note: files-to-untrack will be listed, itself!
git stash
# do some work
git stash pop
git rm --cached `cat files-to-untrack`
rm files-to-untrack

[Nota: Como se menciona en un comentario de @mancocapac, es posible que desee agregar --exclude-standard al comando git ls-files ( entonces, git ls-files -o --exclude-standard ).]

... que también podría ser fácil de escribir, incluso los alias funcionarían (presentado en sintaxis zsh; ajustar según sea necesario) [también, acorté el nombre del archivo para que todo se ajuste en la pantalla sin desplazarse en esta respuesta; no dude en sustituir un nombre de archivo alternativo de su elección]:

alias stashall='git ls-files -o > .gftu; git add `cat .gftu`; git stash'
alias unstashall='git stash pop; git rm --cached `cat .gftu`; rm .gftu'

Tenga en cuenta que este último podría ser mejor como un script o función de shell, para permitir que los parámetros se suministren a git stash , en caso de que no desee pop pero apply , y / o quiere poder especificar un alijo específico, en lugar de solo tomar el primero. Quizás esto (en lugar del segundo alias, arriba) [espacio en blanco despojado para ajustarse sin desplazarse; volver a agregar para mayor legibilidad]:

function unstashall(){git stash "${@:-pop}";git rm --cached `cat .gftu`;rm .gftu}

Nota : en este formulario, debe proporcionar un argumento de acción así como el identificador si va a proporcionar un identificador oculto, p. ej. unstashall apply stash @ {1} o unstashall pop stash @ {1}

Que, por supuesto, pondría en su .zshrc o equivalente para que exista a largo plazo.

Espero que esta respuesta sea útil para alguien, ya que reúne todo en una sola respuesta.

En git versión 2.8.1: lo siguiente funciona para mí.

Para guardar archivos modificados y sin seguimiento en un alijo sin nombre

git stash save -u

Para guardar archivos modificados y sin seguimiento en un alijo con un nombre

git stash save -u <name_of_stash>

Puede usar pop y aplicar más tarde de la siguiente manera.

git stash pop

git stash apply stash@{0}

Pude esconder solo los archivos no rastreados haciendo:

git stash save "tracked files I'm working on"
git stash save -u "untracked files I'm trying to stash"
git stash pop stash@{1}

El último muestra el alijo de los archivos rastreados, dejando solo los archivos no rastreados.

Si desea guardar archivos sin seguimiento, pero mantener los archivos indexados (los que está a punto de confirmar, por ejemplo), simplemente agregue la opción -k (mantener el índice) a la - u

git stash -u -k

Simplemente puede hacerlo con el siguiente comando

git stash save --include-untracked

o

git stash save -u

Para obtener más información acerca de git stash Visita esta publicación (haz clic aquí)

supongamos que el archivo nuevo y sin seguimiento se llama: " views.json " ;. si desea cambiar de sucursal ocultando el estado de su aplicación, generalmente escribo:

git add views.json

Entonces:

git stash

Y sería escondido. Entonces puedo cambiar de rama con

git checkout other-nice-branch

Hay varias respuestas correctas aquí, pero quería señalar que para los directorios completos nuevos, 'git add path' NOT trabajo. Entonces, si tiene un montón de archivos nuevos en untracked-path y haga esto:

git add untracked-path
git stash "temp stash"

esto se esconderá con el siguiente mensaje:

Saved working directory and index state On master: temp stash
warning: unable to rmdir untracked-path: Directory not empty

y si untracked-path es la única ruta que está escondiendo, el alijo " alijo temporal " Será un alijo vacío. La forma correcta es agregar la ruta completa, no solo el nombre del directorio (es decir, finalizar la ruta con un '/'):

git add untracked-path/
git stash "temp stash"

Pensé que esto podría resolverse diciéndole a git que el archivo existe, en lugar de enviar todo el contenido al área de preparación, y luego llamar a git stash . Araqnid describe cómo hacer lo primero.

git add --intent-to-add path/to/untracked-file

o

git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 path/to/untracked-file

Sin embargo, este último no funciona:

$ git stash
b.rb: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state

Solía ??reflexionar y desear la misma característica. Pero con el tiempo, noté que realmente no es necesario. Cuando guardas, está bien dejar los nuevos archivos. Nada "malo" puede sucederles (cuando revisas algo más, git producirá un error y no sobrescribirá el archivo sin seguimiento existente)

Y como generalmente el período de tiempo entre el git stash y el git stash pop es bastante pequeño, necesitará el archivo sin seguimiento rápidamente nuevamente. Entonces, diría que la inconveniencia de que el archivo aparezca en git status mientras está trabajando en otra cosa (entre git stash y git stash pop ) es más pequeño que las molestias causadas por el trabajo y la atención necesaria que de lo contrario costaría intentar agregar el archivo no rastreado a su escondite.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top