studio stash que hace force comando git git-stash

force - git stash pop que hace



git stash reporting: '''' no es una referencia de stash (3)

No estoy seguro de lo que pasó, pero parece que el git stash está en un mal lugar.

% git stash list stash@{0}: filter-branch: rewrite stash@{1}: filter-branch: rewrite stash@{2}: On mysolr: start mysolr stuff

Está bien, y git show stash@{0} funciona bien. Pero:

% git stash drop '''' is not a stash reference % git stash pop '''' is not a stash reference % git stash drop stash@{0} ''stash@{0}'' is not a stash reference

He usado git stash un montón en el pasado y no he encontrado esto. Recientemente había reescrito el historial para eliminar un archivo del historial antes de publicarlo en github. El comando que corrí entonces fue

git filter-branch --force --index-filter / ''git rm --cached --ignore-unmatch FILENAME'' / --prune-empty --tag-name-filter cat -- --all

¿Alguna idea de cómo arreglar el alijo?


Creo que filter-branch ha roto tus escondites. Si el argumento de git stash no se parece lo suficiente a una bolsa de escondite , not a stash reference queja de not a stash reference .

Tenga en cuenta que git show stashref utiliza el antiguo git show , que no requiere que una confirmación dada como argumento se asemeje a un alijo. Si git stash show falla de la misma manera que los otros comandos de git stash , o si el examen manual del alijo en cuestión muestra que ya no es un commit de combinación de dos o tres padres, entonces este es el caso.

Probablemente fue el --prune-empty que lo hizo aquí. Si no hubiera add nada en el momento del alijo, el índice de confirmación estaría vacío. En general, es probable que sea más inteligente evitar filtrar referencias de alijo.

Puedes probar dos enfoques diferentes:

  • Recupere el alijo original SHA-1 (s) de refs/original/ (donde filter-branch dejó la filter-branch ) y / o los reflogs; utilícelas para reconstruir refs/stash y / o los reflogs de stash, o úselos directamente y luego presione la ref de stash y su reflog.
  • Utilice solo las confirmaciones de árbol de trabajo restantes en los escondites reescritos. Todo lo que realmente necesita, ya que las confirmaciones de índice estaban vacías, es esa única confirmación de árbol de trabajo. Puedes obtener un parche usando el comando git show que ya has ejecutado.

(Para obtener más información sobre las bolsas de alijo y de alijo, incluida la forma de tres padres utilizada con --untracked o - sin --untracked , consulte ¿Cómo recuperarse de “guardar el gash con el alijo --todos”? ).

Suponiendo que haya recuperado su contenido y desea eliminar por completo la referencia de stash , esto lo hará. Tenga en cuenta que esta es la opción de "atacar desde la órbita" ; no lo haga hasta que esté seguro de que está listo:

git update-ref -d refs/stash


No tienes que destruir todos tus escondites. Puedes eliminar solo los rotos manualmente usando git reflog . En tu caso:

git reflog delete --rewrite stash@{1} git reflog delete --rewrite stash@{0}

(Las puse en orden inverso aquí porque cada eliminación disminuye la numeración de las siguientes entradas. En la práctica, no se moleste en hacer los cálculos mentalmente, simplemente haga una git stash list después de cada eliminación para obtener una lista actualizada y seleccione otra entrada rota restante a partir de ese.)


todas las respuestas anteriores no funcionan para mí, el comando a continuación funciona, puede eliminar un alijo que desee. Espero que funcione para usted.

``` git stash list //--- apply target stash git stash apply refs/stash@{n} //---- delete target stash git stash drop --index n // or git stash drop refs/stash@{n} ```