Restablecer otra rama a la actual sin un pago

110

Estoy escribiendo algunos scripts para mi flujo de trabajo de Git.

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

Antes de:

 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 el árbol de trabajo).

es posible?

Alejandro Gladysh
fuente
¿Alguien sabe si esto también es posible en Egit?
zedoo

Respuestas:

84

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 necesitas es

git update-ref refs/heads/OtherBranch refs/heads/CurrentBranch
P Shved
fuente
3
Hombre, desearía que esto funcionara sin lo superfluo refs/heads/
ELLIOTTCABLE
41
Una forma mucho más agradable de hacer esto es git push . current:other. Esto funciona sin refs/heads(/ cc @elliottcable) y también evita que actualice la rama extraída. Tenga en cuenta que es posible que deba pasar -f (o usar +current:other) si la actualización no es un avance rápido.
Lily Ballard
4
También puede utilizar el -m 'some text'argumento para registrar el motivo de la actualización de la referencia que se mostrará mediante un git reflog OtherBranchcomando, como "sincronizado con CurrentBranch". Puede ser útil recordar por qué lo hizo más tarde.
Levi Haskell
18
¿Por qué usaría git update-ref refs/heads/OtherBranch refs/heads/CurrentBrancho git push . CurrentBranch OtherBranchcuándo podría usar el mucho más limpio (IMO) en su git branch -f OtherBranch CurrentBranchlugar? (Vea mi respuesta en git branch -f a continuación)
Colin D Bennett
1
@BenHymers Entonces, la página de manual de "git push" es una maldita mentira. Describe el comando como "Actualizar referencias remotas ...". cuando de hecho puede actualizar las referencias locales sin problemas.
Kaz
228

Establecer otherbranchpara apuntar a la misma confirmación que currentbranchejecutando

git branch -f otherbranch currentbranch

La -fopción (forzar) dice que git branch sí, realmente quiero sobrescribir cualquier otherbranchreferencia existente con la nueva .

De la documentación :

-f -
fuerza

Restablecer si ya existe. Sin -f git branch se niega a cambiar una rama existente.

Colin D. Bennett
fuente
6
Ésta es la respuesta más sencilla. ¡Gracias!
Robert Karl
Me sale fatal: Cannot force update the current branch.cuando intento hacer esto.
Fuad Saud
4
@FuadSaud, eso es porque ya se ha otherbranchretirado. Esta pregunta SO se trata específicamente de restablecer otra rama a una confirmación diferente (es decir, no restablecer la rama extraída). Lo que quiere hacer es restablecer la rama actual con git reset targetbranchpara forzar que se apunte a la rama actual targetbranch. Agregue --hardtambién para forzar el árbol de trabajo a ese contenido. O --softdejar el índice solo y solo cambiar la rama en sí.
Colin D Bennett
Bien, ya sé sobre el reinicio. Lo que estaba buscando era una forma de, dentro de una rutina, apuntar siempre maestro local a maestro ascendente / maestro, independientemente de lo que se haya comprobado. Pensé que branch -fpodía hacer eso.
Fuad Saud
9
Imo, esta debería ser la respuesta aceptada. ¡Esto mejoró mucho mi flujo de trabajo!
Lethal-
23

Puedes sincronizar con este comando tus ramas en cualquier momento

$ git push . CurrentBranch:OtherBranch -f

También sin -f reemplaza este conjunto de comandos

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

Puede ser útil cuando no necesita enviar todos sus archivos en CurrentBranch y, por lo tanto, no puede cambiar a otras ramas.

Denis Kuznetsov
fuente
Puede causar "remoto: error: denegando el avance no rápido"
Basilevs
3
No incluiría la -fopción a menos que sea absolutamente inevitable. Funciona bien sin él en mi caso.
Melebio