¿Cómo puedo copiar el contenido de una sucursal a una nueva sucursal local?
Trabajé en una sucursal local y también envié los cambios a control remoto.
Quiero revertir los cambios en esa rama y hacer algo más en ella, pero no quiero perder el trabajo por completo. Estaba pensando en algo como crear una nueva rama localmente y copiar la rama anterior allí, luego puedo revertir los cambios y continuar trabajando en la rama anterior.
¿Existe tal vez una manera mejor que esta?
git checkout old_branch
git branch new_branch
Esto le dará una nueva rama "new_branch" con el mismo estado que "old_branch".
Este comando se puede combinar con lo siguiente:
git checkout -b new_branch old_branch
Ver la segunda parte (desde Git 2.23, tercer trimestre de 2019):git switch -c newBranch oldBranch
Con Git 2.15 (cuarto trimestre de 2017), " git branch
" aprendí " -c/-C
" a crear una nueva rama copiando una existente.
Véase el compromiso c8b2cec (18 de junio de 2017) de Ævar Arnfjörð Bjarmason ( avar
) .
Consulte el compromiso 52d59cc , el compromiso 5463caa (18 de junio de 2017) de Sahil Dua ( sahildua2305
) .
(Fusionado por Junio C Hamano -- gitster
-- en commit 3b48045 , 3 de octubre de 2017)
branch
: agregue una opción--copy
(-c
) para ir con--move
(-m
)Agregue la capacidad a
--copy
una rama y su reflog y configuración; esto utiliza la misma maquinaria subyacente que la opción--move
(-m
), excepto que el reflog y la configuración se copian en lugar de moverse.Esto es útil, por ejemplo, para copiar una rama de tema a una nueva versión, por ejemplo,
work
despuéswork-2
de enviar elwork
tema a la lista, mientras se conserva toda la información de seguimiento y otras configuraciones que acompañan a la rama, y a diferencia de--move
mantener la otra rama ya enviada durante referencia.
Nota: al copiar una sucursal, permaneces en tu sucursal actual.
Como explica Junio C Hamano , la implementación inicial de esta nueva característica fue modificando HEAD, lo cual no fue bueno:
Al crear una nueva rama
B
copiando la ramaA
que resulta ser la rama actual, también se actualizaHEAD
para apuntar a la nueva rama.
Probablemente se hizo de esta manera porque "git branch -c A B
" aprovechó su implementación en "git branch -m A B
",Esto no coincide con las expectativas habituales.
Si estuviera sentado en una silla azul y alguien viniera y la repintara de rojo, aceptaría terminar sentado en una silla que ahora es roja (también puedo estar de pie, ya que ya no está mi silla azul favorita). ).Pero si alguien crea una nueva silla roja, modelándola a partir de la silla azul en la que estoy sentado, no espero que me echen de la silla azul y acabe sentado en la nueva roja.
Segunda parte: con git 2.23 (tercer trimestre de 2019), no es necesario usar git branch o la antigua confusióngit checkout
: tienes git switch
.
git switch -c newBranch oldBranch
Con Git 2.40 (primer trimestre de 2023), ' git branch -c
' ( man ) es más robusto y detecta un caso sin operación.
Ver compromiso cfbd173 (17 de noviembre de 2022) de Rubén Justo ( rjusto
) .
(Fusionado por Junio C Hamano -- gitster
-- en el compromiso 963f8d3 , 19 de diciembre de 2022)
branch
: forzar la copia de una rama a sí misma a través de @{-1} no es operativaAprobado por: Rubén Justo
Aprobado por: Taylor Blau
Desde 52d59cc ("
branch
: agregue una--copy
opción (-c) para ir con--move
(-m)", 2017-06-18, Git v2.15.0-rc0 - combinación incluida en el lote n.° 12 ), podemos copiar una rama para crear una nueva rama con la opción '-c' (copiar) o para sobrescribir una rama existente usando la opción '-C' (forzar copia).
Se considera una posibilidad de no operación cuando se nos pide copiar una rama a sí misma, para seguir la misma no operación introducida para la operación de cambio de nombre (-M) en 3f59481 (branch
: enable a no-op, 2011-11-25, Git v1.7.9-rc0 -- merge ) (rama: permitir una "rama -M HEAD" no operativa<current-branch>
, 25 de noviembre de 2011).
Para comprobar esto, en 52d59cc comparamos los nombres de las ramas proporcionados por el usuario, el origen (HEAD si se omite) y el destino, y una coincidencia se considera no operativa.Desde ae5a6c3 (
checkout
: implementar, 2009-01-17, Git v1.6.2-rc0 - merge ) (pagar: implementar "@{-N}" nombre de acceso directo para la enésima última rama, 2009-01-17) una rama se puede especificar usando atajos como @{-1}.
Esto permite este uso:$ git checkout -b test $ git checkout - $ git branch -C test test # no-op $ git branch -C test @{-1} # oops $ git branch -C @{-1} test # oops
Como usamos el nombre de la rama proporcionado por el usuario para hacer la comparación, si una de las ramas se proporciona mediante un acceso directo, no tendremos una coincidencia y se realizará una llamada
git_config_copy_section()
.
Esto hará un duplicado de la configuración para esa rama, y con esta progresión la segunda llamada producirá cuatro copias de la configuración, y así sucesivamente.Utilicemos el nombre de la rama interpretada para esta comparación.
La operación de cambio de nombre no se ve afectada.