Para mover el puntero de una rama desprotegida, se puede usar el git reset --hard
comando. Pero, ¿cómo mover el puntero de rama de una rama no extraída para apuntar a una confirmación diferente (manteniendo todas las demás cosas como una rama remota rastreada)?
git
git-branch
Agudeza
fuente
fuente
git branch <branch-name> <SHA-1-of-the-commit>
y volca la rama antigua?Respuestas:
Puedes hacerlo por referencias arbitrarias. Así es como se mueve un puntero de rama:
La forma general:
Puede elegir liendres sobre el mensaje de reflog si lo desea: creo que el mensaje
branch -f
es diferente del anteriorreset --hard
, y este no es exactamente ninguno de ellos.fuente
git branch -f
. Para ser específicos, este método parece ser: (A) más difícil de usar (B) más difícil de recordar y (C) más peligrosofuente
git update-ref -m "reset: Reset <branch> to <new commit>" <branch> <commit>
. (Puede elegir liendres sobre el mensaje de reflog si lo desea, creobranch -f
que es diferente delreset --hard
otro, y este no es exactamente ninguno de los dos)git help branch
dice "-f, --force Restablecer <nombre de rama> a <punto de inicio> si ya existe <nombre de rama>. Sin -f git branch se niega a cambiar una rama existente".git branch -f master <hash>
y me dicefatal: Cannot force update the current branch.
Ummmm, ¿tengo que hacer qué ahora, verifique alguna otra rama aleatoria antes de poder usar este comando?HEAD
señala).También puede pasar
git reset --hard
una referencia de confirmación.Por ejemplo:
Me parece que hago algo como esto con frecuencia:
Asumiendo esta historia
fuente
git update-ref
lo mencionado anteriormente.git reset --hard ...
No es necesario repetirlo aquí! :-(Solo para enriquecer la discusión, si desea mover la
myBranch
rama a su confirmación actual , simplemente omita el segundo argumento después-f
Ejemplo:
git branch -f myBranch
Generalmente hago esto cuando estoy
rebase
en un estado HEAD separado :)fuente
En
gitk --all
:Tenga en cuenta que volver a crear en lugar de modificar la rama existente perderá la información de la rama de seguimiento . (Esto generalmente no es un problema para casos de uso simples donde solo hay un control remoto y su sucursal local tiene el mismo nombre que la sucursal correspondiente en el control remoto. Vea los comentarios para obtener más detalles, gracias @mbdevpl por señalar este inconveniente).
Sería genial si
gitk
tuviera una función donde el cuadro de diálogo tuviera 3 opciones: sobrescribir, modificar existente o cancelar.Incluso si normalmente eres un adicto a la línea de comandos como yo,
git gui
ygitk
estás bastante bien diseñado para el subconjunto de uso de git que permiten. Recomiendo usarlos para lo que son buenos (es decir, organizar selectivamente los trozos dentro / fuera del índice en git gui, y también solo comprometerse. (Ctrl-s para agregar un cierre de sesión: línea, ctrl-enter para confirmar) .)gitk
es ideal para realizar un seguimiento de algunas ramas mientras clasifica sus cambios en una buena serie de parches para enviar en sentido ascendente, o cualquier otra cosa en la que necesite realizar un seguimiento de lo que está en medio de varias ramas.Ni siquiera tengo abierto un navegador de archivos gráficos, pero me encanta gitk / git gui.
fuente
git status
salida se ve afectada. Además, en algunos casosgit fetch
ygit push
no funcionará sin especificar explícitamente el control remoto si no configura la rama de seguimiento. No conozco todos los casos, pero para mí la regla general es que, por conveniencia y rapidez de trabajo, es mejor tener ramas de seguimiento en orden.La solución recomendada
git branch -f branch-pointer-to-move new-pointer
en TortoiseGit :fuente
Honestamente, me sorprende cómo nadie pensó en el
git push
comando:El punto (.) Se refiere al repositorio local, y es posible que necesite la opción -f porque el destino podría estar "detrás de su contraparte remota" .
Aunque este comando se usa para guardar los cambios en su servidor, el resultado es exactamente el mismo que si se moviera la rama remota (
<branch>
) a la misma confirmación que la rama local (<destination>
)fuente
-f
evitar golpear nada local; por ejemplo,git fetch origin && git push . origin/develop:develop
es una versión de prueba rápida sin fallas degit checkout develop && git pull --ff-only
Abra el archivo
.git/refs/heads/<your_branch_name>
y cambie el hash almacenado allí al que desea mover el encabezado de su rama. Simplemente edite y guarde el archivo con cualquier editor de texto. Solo asegúrese de que la rama a modificar no sea la actual activa.Descargo de responsabilidad: Probablemente no sea una forma recomendable de hacerlo, pero hace el trabajo.
fuente
En el caso de que la confirmación a la que desea apuntar esté por delante de la rama actual (que debería ser el caso, a menos que desee deshacer las últimas confirmaciones de la rama actual), simplemente puede hacer:
fuente
git push . <commit>:<branch>
que ya se sugirió.