Para mover la rama puntero de un desprotegido rama, uno puede usar el git reset --hard comando. Pero cómo mover la rama puntero de un no-revisado de la sucursal a punto en otro commit (manteniendo todas las otras cosas como el seguimiento de la rama remota)?

  • Suena como que todo lo que quería hacer es una rama de otro commit de la que fue creado a partir de ahora. Si mi interpretación es correcta, entonces ¿por qué no simplemente crear una nueva rama de la confirmación de que desea crear a partir de el uso de git branch <branch-name> <SHA-1-of-the-commit> y volcado de la antigua rama?
  • No estoy seguro de lo dumping «maestro» de la rama es una buena idea.
InformationsquelleAutor Mot | 2011-03-29

7 Comentarios

  1. 505

    N. B. Si usted simplemente desea mover un rama a otro a cometer, el
    la manera más fácil es

    git branch -f branch-name new-tip-commit

    según lo detallado por Chris Johnsen respuesta.

    Que usted puede hacer para arbitrario refs. Esto es cómo mover una rama puntero:

    git update-ref -m "reset: Reset <branch> to <new commit>" refs/heads/<branch> <commit>
    

    La forma general:

    git update-ref -m "reset: Reset <branch> to <new commit>" <ref> <commit>
    

    Usted puede escoger las liendres sobre la reflog mensaje si te gusta – yo creo que el branch -f una es diferente de la reset --hard uno, y esto no es exactamente uno de ellos.

    • Viendo como ha sido 6 meses y Jefromi no se ha convertido a su comentario en una respuesta, lo estoy haciendo como wiki de la comunidad por lo que se obtiene de la exposición. Yo personalmente no lo vi hasta que me había hecho de una rama -f!
    • Dónde está el mensaje de buenas? Donde se almacena y cómo leerla más tarde?
    • gracias por la edición. @MikeL – probablemente se muestra en la reflog? (trate de git reflog para ver)
    • NOTA: Esto no funciona en desnudo repositorios. El desnudo de los repositorios, usted tiene que utilizar ‘git branch-f master <commit>’ para la actualización de la rama (véase la respuesta a continuación).
    • Extraño, este hizo lo que yo quería hacer, pero no aparecen en el reflog.
    • Si, como yo, accidentalmente usar <branch> en lugar de refs/heads/<branch>, usted terminará para arriba con un nuevo archivo en el .git directorio .git/<branch>, y obtendrá un mensaje como «nombre de referencia ‘maestro’ es ambiguo» al intentar trabajar con ella. Usted puede eliminar el archivo de la .directorio de git para corregir.
    • ¿Qué significa exactamente «arbitraria árbitros»? Chris Johnsen respuesta por debajo de las ramas de una arbitraria cometer si no me equivoco.
    • No se ha explicado satisfactoriamente por qué esto es mejor que git branch -f. Para ser más específicos, este método parece ser: (A) más difícil de utilizar (B) más difícil de recordar, y (C) más peligroso
    • «¿qué significa exactamente arbitraria árbitros» – de las Ramas no son el único tipo de ref que apunta a un commit. No son las etiquetas, y también puede crear arbitraria refs/whatevs/myref estilo de las referencias a sí mismo que no son ni ramas ni etiquetas. Creo que también responde a Steven Lu pregunta acerca de lo que esto podría ser «mejor». Estoy de acuerdo en rama -f es más simple si usted está trabajando con ramas.
    • referencias de los mandos es un ejemplo de cómo git utiliza referencias que no son ramas. Cuando se ejecuta git fetch origin, git crear referencias dentro de refs/remotes/origin/ que corresponden a la rama de los jefes de la origin remoto. git-p4 creará refs en refs/remotes/p4, para emular un control remoto llamado p4. Cuando se está recuperando de una mala git p4 sync, el uso de la git update-ref formulario permite que usted se mueva a donde el p4 rama de la cabeza de los puntos a, para intentar de nuevo la sincronización.
    • «Si usted simplemente desea mover una rama a otra a cometer, … Esto es como se mueve una rama puntero: …» ¿Qué es la distinción que se traen entre una «rama» y una «rama» puntero? Pensé que una rama era básicamente un puntero – aunque con cierto comportamiento.

  2. 881
    git branch -f <branch-name> <new-tip-commit>
    
    • O arbitrarias de refs, git update-ref -m "reset: Reset <branch> to <new commit>" <branch> <commit>. (Usted puede escoger las liendres sobre la reflog mensaje si te gusta – yo creo que el branch -f una es diferente de la reset --hard uno, y esto no es exactamente uno de ellos.)
    • Jefromi, favor de escribir una separada de respuestas, así que usted puede conseguir votos. 🙂
    • También puede upvote comentarios…
    • Pero usted no puede aceptarlos!
    • Esta es una mejor respuesta, ya que se maneja el 99% de los casos y en realidad se ajusta a la documentación. git help branch dice » -f, –force Reset <nombre_de_rama> a <punto de partida> si <nombre_de_rama> existe ya. Sin -f git branch se niega a cambiar de una rama existente.»
    • Muy útil si desea cambiar el lugar donde otra rama apunta sin echarle un vistazo.
    • Estoy haciendo git branch -f master <hash> y me dijo que fatal: Cannot force update the current branch. Ummmm tengo que hacer lo que ahora, echa un vistazo a algunos otros al azar de la rama antes de que se me permite utilizar este comando?
    • Usted puede utilizar git reset --soft <hash> a cambio de la CABEZA (es decir, la rama actual; suponiendo que la CABEZA no está separado).
    • Debería haber leído los comentarios antes de que me cambié de las ramas con el fin de mover la rama estaba en…
    • va a causar problemas con su índice. Creo que en este caso quiere --mixed (que es el modo predeterminado para git reset).
    • Esto no funcionará si la rama que va a mover es la actual rama (HEAD apunta a que sí).
    • Tienes razón @VladimirPanteleev. Cambiar a otra rama con git checkout otherbranch primera. La otra rama puede apuntar a la misma revisión.
    • Yo quería mover la cabeza de mi actual rama de un commit: git checkout HEAD^ && git branch -f mybranch HEAD && git checkout mybranch trabajó para mí.
    • ¿Qué es el ‘nuevo-tip-commit’?
    • Este parece tener un efecto secundario. Si su new-tip-commit es una rama remota, es también el autor para su branch-name. Hay una forma de evitar esto?

  3. 129

    También puede pasar git reset --hard una confirmación de referencia.

    Por ejemplo:

    git checkout branch-name
    git reset --hard new-tip-commit
    

    Me parece que hacer algo como esto semi-frecuencia:

    Asumiendo esta historia

    $ git log --decorate --oneline --graph
    * 3daed46 (HEAD, master) New thing I shouldn't have committed to master
    * a0d9687 This is the commit that I actually want to be master
    
    # Backup my latest commit to a wip branch
    $ git branch wip_doing_stuff
    
    # Ditch that commit on this branch
    $ git reset --hard HEAD^
    
    # Now my changes are in a new branch
    $ git log --decorate --oneline --graph
    * 3daed46 (wip_doing_stuff) New thing I shouldn't have committed to master
    * a0d9687 (HEAD, master) This is the commit that I actually want to be master
    
    • Esto tiene más sentido en que normalmente se utiliza en la CABEZA o en la CABEZA^ para mover la punta de la rama atrás en el tiempo. Así que esto es consistente para especificar la confirmación por delante.
    • Esto está bien si su árbol de trabajo está limpio. Si usted tiene un montón de montaje o unstaged cambios, es probablemente mejor para hacer git update-ref como se discutió anteriormente.
    • ¿Has notado que tu «respuesta» no agrega nada que no sea parte de la pregunta ya?? – OP dijo: si está desprotegido… puede utilizar git reset --hard ... No hay necesidad de repetir aquí! 🙁
    • No estoy de acuerdo. La pregunta no dijo como para usarlo y este lo hace. Era agradable no tener que ir a buscar para que cómo.
    • Gracias.
    • tal vez fue agradable para usted para encontrar esto aquí, pero es que no responden la pregunta. Tal vez es la respuesta de alguna pregunta, pero aquí es mal.
    • mi método preferido. Allí totalmente debe ser un git repoint <commit> comando

  4. 39

    Sólo para enriquecer la discusión, si desea mover myBranch rama a su actual cometer, solo omite el segundo argumento después de -f

    Ejemplo:

    git branch -f myBranch


    Yo generalmente hago esto cuando me rebase mientras que en un Desprendimiento de la CABEZA del estado 🙂

  5. 12

    En gitk --all:

    • haga clic derecho en la confirmación desea
    • -> crear nueva rama
    • introduzca el nombre de una rama existente
    • presione intro en el cuadro de diálogo que confirma la sustitución de la antigua rama de ese nombre.

    Ten en cuenta que la re-creación, en lugar de modificar la rama existente se pierden en el seguimiento de información de la filial de. (Generalmente, esto no es un problema simple de casos de uso, donde sólo hay una remota y su sucursal local tiene el mismo nombre que la delegación correspondiente en el mando a distancia. Ver los comentarios para obtener más detalles, gracias @mbdevpl para señalar este inconveniente.)

    Sería genial si gitk tenía una función en el cuadro de diálogo tenía 3 opciones: sobrescribir, modificar o cancelar.


    Incluso si usted es normalmente una línea de comandos adicto como yo, git gui y gitk están muy bien diseñados para el subconjunto de git uso que se permiten. Yo recomiendo el uso de ellos para lo que es buena (es decir, de forma selectiva de ensayo de bloques a/del índice en git gui, y también acaba de cometer. (ctrl-s para agregar una firma-off: línea, ctrl-enter para confirmar.)

    gitk es ideal para mantener la pista de un par de ramas, mientras que ordenar tus cambios en un bonito parche de la serie para presentar aguas arriba, o cualquier otra cosa donde usted necesita para mantener un seguimiento de lo que está en el medio de con múltiples ramas.

    Ni siquiera tengo una gráfica de un explorador de archivos abierto, pero me encanta gitk/git gui.

    • Tan fácil! Puede que se me acaban convertidos de gitg a gitk.
    • De esta manera, sin embargo, el seguimiento de la sucursal de la información se pierde.
    • Yo no soy realmente un git experto. Creo que entiendo lo que quieres decir, pero no las consecuencias. La he usado bastante a menudo, y aún así ha sido capaz de empujar las ramas de las ramas del mismo nombre en un mando a distancia. ¿Qué hace la asociación entre una sucursal y su mando a distancia de seguimiento de la rama de hacer por usted?
    • hace que la mayoría sólo importa cuando su sucursal local tiene un nombre diferente de la rama remota es el seguimiento de?
    • Ineed, cuando la rama de los nombres no coinciden con lo que importa. También cuando hay más de un mando a distancia. También cuando usted está usando git petición para mostrar la rama de estado, que va a mostrar cometer distancia para su seguimiento rama (si está configurado). También, git status de salida se ve afectada. Además, en algunos casos git fetch y git push no funciona sin especificar remoto de forma explícita si no establece el seguimiento de la rama. Yo no sé acerca de todos los casos, pero para mí, la regla general es que por comodidad y velocidad de trabajo, es mejor tener el seguimiento de las ramas en orden.
    • Como una nota del lado, git a veces se establece el seguimiento de la rama automáticamente. E. g. al hacer git checkout devel pero sólo origin/devel existe, el programa creará automáticamente y la caja devel, mientras que también la configuración de su seguimiento de rama en consecuencia.
    • gracias, he añadido una advertencia a la respuesta acerca de este inconveniente. Siéntase libre de hacer una edición a sí mismo si usted ve margen de mejora.

  6. 3

    Honestamente, estoy sorprendido de cómo a nadie se le ocurrió la git push comando:

    git push -f . <destination>:<branch>
    

    El punto ( . ) se refiere en el repositorio local, y puede que tenga la opción-f, dado que el destino podría ser «detrás de su remota contraparte».

    Aunque este comando se utiliza para guardar los cambios en el servidor, el resultado es exactamente el mismo que si se mueve la rama remota (<branch>) para el mismo cometido, como la rama local (<destination>)

Dejar respuesta

Please enter your comment!
Please enter your name here