Accidentalmente me comprometí con la rama equivocada. ¿Cómo elimino esa confirmación?
948
Elimina la confirmación más reciente y conserva el trabajo que has realizado:
git reset --soft HEAD~1
Elimine la confirmación más reciente, destruyendo el trabajo que ha realizado:
git reset --hard HEAD~1
git reset --hard origin
git remote
enumera el origen para mí,git reset --hard origin
dicefatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
. ¿Por qué?git reset HEAD~1
también mantendrá todos sus cambios, pero lo dejará con un índice vacío en lugar de mantener todo (como lo--soft
haría la opción).Me pregunto por qué la mejor respuesta que he encontrado es solo en los comentarios. ( por Daenyth con 86 votos )
Este comando sincronizará el repositorio local con el repositorio remoto eliminando cada cambio que haya realizado en su local. También puede hacer lo siguiente para obtener la rama exacta que tiene en el origen.
fuente
git reset --hard origin/<branch>
git reset --soft origin/<branch>
, si desea deshacerse del compromiso pero mantener el trabajo local.fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
, debes especificar la rama como:git reset --hard origin/feature/my-cool-stuff
No lo elimine: solo una confirmación
git cherry-pick
es suficiente.Pero si tuvo varias confirmaciones en la rama incorrecta, ahí es donde
git rebase --onto
brilla:Supongamos que tienes esto:
, entonces puedes marcarlo
master
y moverlo donde quieras estar:, restablecer y bifurcar donde debería haber estado:
y, finalmente, mueva sus confirmaciones (vuelva a aplicarlas, haciendo nuevas confirmaciones)
fuente
Haz un
git rebase -i FAR_ENOUGH_BACK
y suelta la línea para el commit que no quieres.fuente
Si desea mover ese compromiso a otra rama, obtenga el SHA del compromiso en cuestión
Luego cambie la rama actual
Y
cherry-pick
el compromiso deother-branch
fuente
git reset --hard HEAD~1
posterior. Creo que usarreset --soft
luego cambiar de rama y comprometerse nuevamente habría ahorrado trabajo extra. Por otra parte, estaba usando SourceTree para hacer la mayoría de mis cosas básicas, solo ordenando alinearlo con esto después de mi error.Para su referencia, creo que puede hacer "hard cut" los compromisos de su rama actual no solo con git reset --hard, sino también con el siguiente comando:
De hecho, si no le importa pagar, puede configurar la rama a lo que quiera con:
Esta sería una forma programática de eliminar confirmaciones de una rama, por ejemplo, para copiar nuevas confirmaciones (usando rebase).
Suponga que tiene una rama que está desconectada del maestro porque ha tomado fuentes de otra ubicación y la ha vertido en la rama.
Ahora tiene una rama en la que ha aplicado cambios, llamémosle "tema".
Ahora creará un duplicado de la rama de su tema y luego lo volverá a basar en el volcado del código fuente que se encuentra en la rama "volcado":
Ahora sus cambios se vuelven a aplicar en la rama topic_duplicate en función del punto de partida de "dump", pero solo las confirmaciones que se han producido desde "master". Por lo tanto, sus cambios desde el maestro ahora se vuelven a aplicar sobre "dump", pero el resultado termina en "topic_duplicate".
Luego puede reemplazar "dump" con "topic_duplicate" haciendo lo siguiente:
O con
O simplemente descartando el basurero
Quizás también podría elegir simplemente después de borrar el "topic_duplicate" actual.
Lo que estoy tratando de decir es que si desea actualizar la rama "duplicada" actual basada en un antepasado diferente, primero debe eliminar los commits "cherrypicked" anteriores haciendo un
git reset --hard <last-commit-to-retain>
ogit branch -f topic_duplicate <last-commit-to-retain>
y luego copiando los otros commits (desde el main rama temática) ya sea mediante rebase o selección de cerezas.Rebasing solo funciona en una rama que ya tiene los commits, por lo que debe duplicar su rama de tema cada vez que quiera hacer eso.
Cherrypicking es mucho más fácil:
Entonces toda la secuencia se reducirá a:
Cuando se ha desprotegido su rama duplicada de tema. Eso eliminaría las confirmaciones previamente seleccionadas del duplicado actual y simplemente volvería a aplicar todos los cambios que ocurran en el "tema" en la parte superior de su "volcado" actual (antepasado diferente). Parece una forma razonablemente conveniente de basar su desarrollo en el maestro ascendente "real" mientras usa un maestro "descendente" diferente para verificar si sus cambios locales también se aplican a eso. Alternativamente, podría generar un diff y luego aplicarlo fuera de cualquier árbol fuente de Git. Pero de esta manera puede mantener una versión actualizada (parcheada) modificada que se basa en la versión de su distribución mientras su desarrollo real está en contra del maestro principal real.
Tan solo para demostrar:
Espero que esto ayude a alguien. Tenía la intención de reescribir esto, pero no puedo hacerlo ahora. Saludos.
fuente
El siguiente comando funcionó para mí, todos los cambios comprometidos locales se descartan y el local se restablece al mismo que el origen remoto / rama maestra.
fuente