Accidentalmente me comprometí con la rama equivocada. ¿Cómo elimino esa confirmación?
Accidentalmente me comprometí con la rama equivocada. ¿Cómo elimino esa confirmación?
Respuestas:
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
dice fatal: 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 )
git reset --hard origin
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.
git reset --hard origin/<branch>
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:
x--x--x--x <-- master
\
-y--y--m--m <- y branch, with commits which should have been on master
, entonces puedes marcarlo master
y moverlo donde quieras estar:
git checkout master
git branch tmp
git checkout y
git branch -f master
x--x--x--x <-- tmp
\
-y--y--m--m <- y branch, master branch
, restablecer y bifurcar donde debería haber estado:
git checkout y
git reset --hard HEAD~2 # ~1 in your case,
# or ~n, n = number of commits to cancel
x--x--x--x <-- tmp
\
-y--y--m--m <- master branch
^
|
-- y branch
y, finalmente, mueva sus confirmaciones (vuelva a aplicarlas, haciendo nuevas confirmaciones)
git rebase --onto tmp y master
git branch -D tmp
x--x--x--x--m'--m' <-- master
\
-y--y <- y branch
Si desea mover ese compromiso a otra rama, obtenga el SHA del compromiso en cuestión
git rev-parse HEAD
Luego cambie la rama actual
git checkout other-branch
Y cherry-pick
el compromiso deother-branch
git cherry-pick <sha-of-the-commit>
git reset --hard HEAD~1
posterior. Creo que usar reset --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:
git checkout -B <branch-name> <SHA>
De hecho, si no le importa pagar, puede configurar la rama a lo que quiera con:
git branch -f <branch-name> <SHA>
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":
git branch topic_duplicate topic
git rebase --onto dump master topic_duplicate
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:
git branch -f dump topic_duplicate
git branch -D topic_duplicate
O con
git branch -M topic_duplicate dump
O simplemente descartando el basurero
git branch -D dump
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>
o git 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:
git cherry-pick master..topic
Entonces toda la secuencia se reducirá a:
git reset --hard <latest-commit-to-keep>
git cherry-pick master..topic
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.
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.
git reset - origen duro