¿Cómo puedo copiar el contenido de una sucursal a una nueva sucursal local?

Resuelto serengeti12 asked hace 11 años • 6 respuestas

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?

serengeti12 avatar Feb 21 '13 16:02 serengeti12
Aceptado
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
Daniel Hilgarth avatar Feb 21 '2013 09:02 Daniel Hilgarth

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 --copyuna 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, workdespués work-2de enviar el worktema 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 --movemantener 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 Bcopiando la rama Aque resulta ser la rama actual, también se actualiza HEADpara 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 operativa

Aprobado por: Rubén Justo
Aprobado por: Taylor Blau

Desde 52d59cc (" branch: agregue una --copyopció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.

VonC avatar Oct 14 '2017 23:10 VonC