2009-03-23 17 views

Respuesta

882

Para restablecer un archivo específico a este último cometido estado (para descartar los cambios no comprometidos en un archivo específico):

Esto se menciona en la salida git status:

(use "git checkout -- <file>..." to discard changes in working directory) 

Para restablecer todo el repositorio al último estado comprometida: (! Pero no la carpeta .git/)

git reset --hard 

para eliminar archivos sin seguimiento, por lo general sólo eliminar todos los archivos en la copia de trabajo, y luego hacer git reset --hard cuales lo deja solo con los archivos comprometidos.

Una mejor manera es utilizar git clean: (Advertencia:. Usar la bandera -x como a continuación hará que git para borrar ficheros ignorados)

git clean -d -x -f 

eliminará los archivos sin seguimiento, incluidos los directorios (-d) y archivos ignorados por git (-x). Reemplace el argumento -f con -n para ejecutar en seco o -i para el modo interactivo y le dirá qué se eliminará.

enlaces pertinentes:

+18

Tenga en cuenta que, de forma predeterminada, 'git clean -d' es insuficiente. También necesita agregar el indicador -f (fuerza). Además, si desea eliminar adicionalmente los archivos ignorados por .gitignore, entonces debe agregar la opción -x. Esto es lo que parece: git clean -xdf –

+1

Creo que te refieres a "directorio de trabajo" en lugar de "repositorio" en la oración "Normalmente solo elimino todos los archivos en el repositorio". –

+0

@Dr. Persona Buen punto, eso está más claro, editado – dbr

102
git clean -df 

Editar: No está bien anunciado, pero git clean es realmente útil. Git Ready tiene un nice intro to git clean.

Actualización: se ha eliminado la bandera x basado en la sugerencia en el comentario a continuación

+18

Sugiero no utilizar el parámetro '-x', ya que eliminará todo el contenido de gignoler. Digamos que tiene una carpeta llamada '' gitignored '' agregada a '.gitignore', y almacena allí sus archivos que deben ser seguros, también los borra usando el parámetro' -x' – Highmastdon

+1

Vaya. 'git clean -xdf' también eliminó' .gitignore', y no me di cuenta antes de la siguiente confirmación. Ya no ignoraré '.gitignore'. :) – Grastveit

+3

@Grastveit 'git clean -xdf' eliminará' .gitignore' si y solo si no se ha agregado a, por lo tanto, funciona según lo previsto. – Marko

29

Todas las respuestas hasta el momento retienen commits locales. Si usted es realmente grave, puede descartar todos los commits locales y todas las modificaciones locales haciendo:

git reset --hard origin/branchname 

Por ejemplo:

git reset --hard origin/master 

Esto hace que su repositorio local coincidir exactamente con el estado del origen (que no sean archivos sin seguimiento).

Si lo hiciste accidentalmente después de leer el comando, y no lo que hace :), usa git reflog para encontrar tus antiguos commits.

+0

¿Es realmente necesario el nombre de la rama? Para mí 'git reset --hard' simplemente funciona para la rama de trabajo actual sin nombre de sucursal. – RBT

+0

Sin la rama, no borra las confirmaciones locales. – dbn

+0

ohh. De acuerdo. Mi observación solo se refería a los archivos modificados localmente y los nuevos no agregados. Por lo tanto, si lo obtuve correctamente, si algún archivo está en etapas o ya se ha confirmado en la sucursal local (no se ha enviado aún), no se limpiará si no utilizo el nombre de la rama explícitamente. ¿Correcto? – RBT

9

Puede crear una confirmación que contenga una copia de trabajo vacía.

Este es un enfoque generalmente seguro y no destructivo porque no implica el uso de ningún mecanismo de reinicio de fuerza bruta. Primero oculta todo el contenido administrado con git checkout empty, luego puede revisar y eliminar manualmente cualquier contenido no administrado que permanezca.

## create and initialize a temporary repo with an empty working copy 
(
mkdir ./temp-repo && cd ./temp-repo && git init 
touch ./temp-file && git add . && git commit -m "almost empty" 
git rm ./temp-file && git commit -m "empty" 
git tag empty 
) 

## fetch the history from the temporary repo 
git remote add empty ./temp-repo && git fetch --tags empty && git remote rm empty 
gvfs-trash ./temp-repo ## delete the temporary repo 

## clear the working copy 
git checkout empty 

Su copia de trabajo ahora debería estar libre de cualquier contenido administrado. Todo lo que queda son archivos no administrados y la carpeta .git.

Para repoblar su copia de trabajo ...

git checkout master ## or whatever branch you will be using 
+0

Esto también puede ser una buena forma de ahorrar algo de espacio en disco en caso de necesidad. – nobar

+5

Una forma mucho más rápida de crear el pago vacío: 'true | git mktree | xargs git commit-tree | xargs git tag empty' – jthill

+0

@jthill: Parece que funciona, ¡gracias por la sugerencia! – nobar

1

Para restablecer un archivo específico como git status sugiere:

git checkout <filename> 

Para restablecer una carpeta

git checkout <foldername>/* 
7

Para cambiar a otra rama, descartando todos los cambios no confirmados (por ejemplo, como resultado del extraño manejo de terminaciones de línea de Git):

git checkout -f <branchname> 

que tenían una copia de trabajo con cientos de archivos modificados (pero vacío git diff --ignore-space-at-eol) que no podía deshacerse con cualquiera de los comandos que leí aquí, y git checkout <branchname> no va a funcionar, ya sea - a menos que reciba la opción -f (o --force).

+0

' git checkout -p'? – badp

Cuestiones relacionadas