¿Cómo descartar commits locales en Git?

264

Había estado trabajando en algo y decidí que estaba completamente jodido ... después de haber cometido algo. Así que probé la siguiente secuencia:

git reset --hard
git rebase origin
git fetch
git pull
git checkout

En ese momento recibí el mensaje

Your branch is ahead of 'origin/master' by 2 commits.

Quiero descartar mis confirmaciones locales , sin tener que borrar mi directorio local y volver a descargar todo. ¿Cómo puedo lograr eso?

Daniel C. Sobral
fuente
66
No hay necesidad de hacer ambas cosas git fetchy git pull- pull es una combinación de buscar y fusionar.
Ether
12
Nota para los usuarios: el principal problema de esta pregunta no tiene nada que ver con el mensaje "Su rama está por delante de 'origen / maestro' por N commits". . Deje de cerrar otras preguntas como duplicados de esta debido a ese mensaje.

Respuestas:

582
git reset --hard origin/master

eliminará todos los commits que no estén en origin/masterdonde originestá el nombre del repositorio y masterel nombre de la rama.

mipadi
fuente
1
Pensé que la sintaxis "origen / maestro", con una barra, se refería a un repositorio local.
Daniel C. Sobral
9
mipadi: Dicho de manera más correcta, restablecerá la rama actual para que apunte al mismo commit que origin / master.
Christoffer Hammarström
Se refiere a una rama. origin/masteres una rama que rastrea la masterrama del originrepositorio remoto.
mipadi
@ DanielC.Sobral No, origin/masteres una referencia a la masterrama del control remoto llamado origin.
Mateo
1
@littletiger git no rastrea carpetas, solo archivos y sus rutas. Por lo tanto, ignorará por completo las carpetas vacías (carpetas sin archivos o solo archivos ignorados). No aparecen en ningún lado ya que no hay nada que pueda entrar.
Mumbleskates
33

Como comentario aparte, aparte de la respuesta de mipadi (que debería funcionar por cierto), debes saber que al hacer:

git branch -D master
git checkout master

también hace exactamente lo que quieres sin having to redownload everything(tu cita parafraseada). Esto se debe a que su repositorio local contiene una copia del repositorio remoto (y esa copia no es lo mismo que su directorio local, ni siquiera es lo mismo que su rama desprotegida).

Eliminar una sucursal es perfectamente seguro y reconstruir esa sucursal es muy rápido y no implica tráfico de red. Recuerde, git es principalmente un repositorio local por diseño. Incluso las sucursales remotas tienen una copia en el local. Solo hay un poco de metadatos que le dicen a git que una copia local específica es en realidad una rama remota. En git, todos los archivos están en su disco duro todo el tiempo.

Si no tiene ninguna otra rama que no sea master, debe:

git checkout -b 'temp'
git branch -D master
git checkout master
git branch -D temp
slebetman
fuente
44
Pero, ¿cómo se diferencian las confirmaciones realizadas localmente de las confirmaciones realizadas en origen? De hecho, me dice queCannot delete the branch 'master' which you are currently on.
Daniel C. Sobral
1. Básicamente todas las confirmaciones son iguales, independientemente de si se realizan localmente o en origen. Lo importante es que las historias estén sincronizadas correctamente. Su confirmación local solo existirá en el origen después de que los haya presionado y, por defecto, git rechazará la solicitud si el historial en el origen puede terminar en un estado que no tiene sentido.
slebetman
2
2. Por supuesto, no puede eliminar la rama que está actualmente desprotegida. Para eliminar master, primero revisa otra rama. De si no hay otra rama, simplemente cree una temporal:git checkout -b temp;git branch -D master;git checkout master;git branch -D temp
slebetman
También tenga en cuenta que lo que dije sobre su copia local del repositorio remoto es diferente: git no le permitirá editar o incluso ver archivos en su copia de la rama remota. Solo le permitirá crear otra rama desde la rama remota que luego podrá ver y editar. Por convención, esta rama local tiene el mismo nombre que la rama remota. Tiene razón en que origin/masterestá en su máquina local. Esa es su copia local (completa) de la rama remota. La verdadera rama remota es origin master.
slebetman
Esto funcionó para mí. Sin git branch -D masterembargo, tal vez no fue necesario, ya que, como se señaló, genera un error.
Alexis Wilke
15

Lo que hago es intentar restablecer duro a HEAD. Esto eliminará todos los commits locales:

git reset --hard HEAD^
giang nguyen
fuente
Esta es la mejor respuesta, que realmente funcionó. Se descartaron todas las confirmaciones locales y se restablecieron a HEAD. ¿Cuál es el uso de ^ char?
karim
@karim el '^' es probablemente una expresión regular, que probablemente sea algo bastante profundo que no conozco o no leí hace mucho tiempo en el archivo manual ... lo siento hombre :)
giang nguyen
1
Tarde, pero ^representa la confirmación principal, por lo que restablecer a HEAD^descarta los cambios no confirmados y mueve la rama a la confirmación anterior, "eliminando" efectivamente la confirmación más reciente (aunque la confirmación aún existe, la rama simplemente no lo señala). La respuesta tendrá solo una confirmación local y el resto son cambios no confirmados. @karim @giang
QuantumQuaver
3

Necesitas correr

git fetch

Para obtener todos los cambios y luego no recibirá un mensaje con "su sucursal está por delante".

Володимир Пасіка
fuente
55
La búsqueda no tiene nada que ver con el problema principal del autor de la pregunta, que es deshacerse de los compromisos locales.
1
¿Qué pasa si ya he confirmado archivos en local y luego intento disparar el comando mencionado? Mostrará el mismo mensaje de error. Intenté git fetch y git fetch -p también. pero muestra el mismo error
Morez
1

He visto casos en los que el control remoto no estaba sincronizado y necesitaba ser actualizado. Si a reset --hardo branch -Dno funciona, intente

git pull origin
git reset --hard 
Jim Clouse
fuente
esto no responde la pregunta, reset --hardfunciona en esta situación
CharlesB
1
Hola Charles, tienes razón, eso reset --harddebería funcionar aquí. Sin embargo, simplemente estoy señalando que ocasionalmente no se restablece la rama correctamente y git pull originse volverá a sincronizar el control remoto y permitirá reset --hardque funcione correctamente.
Jim Clouse
0

Tuve que hacer un:

git checkout -b master

como dijo git que no existe, porque se ha borrado con el

git -D master
rampa
fuente