2009-10-19 12 views
79

Estoy escribiendo algunos scripts para mi flujo de trabajo de Git.Git: restablecer otra rama a la actual sin un checkout

Necesito restablecer otra rama (existente) a la actual, sin pago.

Antes:

CurrentBranch: commit A 
OtherBranch: commit B 

Después:

CurrentBranch: commit A 
OtherBranch: commit A 

Equivalente de

$ git checkout otherbranch 
$ git reset --soft currentbranch 
$ git checkout currentbranch 

(Nota --soft: no quiero afectar árbol de trabajo.)

¿Es esto posible?

+0

¿Alguien sabe si esto es posible también en Egit? – zedoo

Respuesta

59

Los flujos de trabajo que describe no son equivalentes: cuando realiza reset --hard, pierde todos los cambios en el árbol de trabajo (es posible que desee hacerlo reset --soft).

Lo que se necesita es

git update-ref refs/heads/OtherBranch refs/heads/CurrentBranch 
+0

Derecha, gracias. No quiero afectar el árbol de trabajo. –

+2

Hombre, ojalá funcionó sin los superfluos 'refs/heads /' ... – ELLIOTTCABLE

+32

Una forma mucho más agradable de hacer esto es 'git push. actual: otro'. Esto funciona sin 'refs/heads' (/ cc @elliottcable), y también evita que actualice la rama check-out. Tenga en cuenta que es posible que deba pasar -f (o use '+ current: other') si la actualización no es un avance rápido. –

15

puede sincronizar con este comando sus ramas en cualquier momento

$ git push . CurrentBranch:OtherBranch -f 

También sin -f que sustituir este conjunto de comandos

$ git checkout OtherBranch 
$ git merge CurrentBranch 
$ git checkout CurrentBranch 

Puede ser útil cuando no necesita confirmar todos sus archivos en CurrentBranch y por lo tanto no puede cambiar a otro b ranchos.

+0

Puede causar "control remoto: error: denegación de avance no rápido" – Basilevs

+0

No incluiría la opción '-f' a menos que sea absolutamente inevitable. Funciona bien sin él en mi caso. – Melebius

140

Conjunto otherbranch a señalar en el mismo cometer como currentbranch ejecutando

git branch -f otherbranch currentbranch 

La opción -f (fuerza) dice git branchsí, me refiero a sobrescribir cualquier referencia existente otherbranch con el nuevo.

Desde el documentation:

-f
--force

Reset to if exists already. Without -f git branch refuses to change an existing branch.

+2

Esta es la respuesta más fácil. ¡Gracias! –

+0

Me sale 'fatal: no puedo forzar la actualización de la rama actual' cuando intento hacer esto. –

+3

@FuadSaud eso se debe a que ya tiene 'otherbranch' desprotegido. Esta pregunta SO se refiere específicamente a restablecer * otra rama * a una confirmación diferente (es decir, no restablecer la rama desprotegida). Lo que quiere hacer es reiniciar la rama actual con 'git reset targetbranch' para forzar a la rama actual a apuntar a' targetbranch'. Agregue '--hard' para forzar también el árbol de trabajo a ese contenido. O '--soft' para dejar el índice solo y solo cambiar la rama en sí. –

Cuestiones relacionadas