Crea una rama en Git desde otra rama
Tengo dos ramas: master y dev.
Quiero crear una "rama de funciones" desde la rama de desarrollo .
Actualmente en la rama dev , hago:
git checkout -b myfeature dev
... (algo de trabajo)
git commit -am "blablabla"
git push origin myfeature
Pero, después de visualizar mis ramas, obtuve:
--**master**
------0-----0-----0-----0-----0
------------------------**dev**----**myfeature**
Quiero decir que la rama parece fusionada rápidamente y no entiendo por qué...
¿Qué estoy haciendo mal?
¿Cómo puede separarse de otra rama y regresar al repositorio remoto para la rama de funciones?
Todo eso en un modelo ramificado como el que se describe aquí .
Si te gusta el método del enlace que has publicado, echa un vistazo a Git Flow .
Es un conjunto de scripts que creó para ese flujo de trabajo.
Pero para responder a tu pregunta:
git checkout -b myFeature dev
Crea la rama MyFeature de dev . Haz tu trabajo y luego
git commit -am "Your message"
Ahora combine sus cambios con dev sin avance rápido
git checkout dev
git merge --no-ff myFeature
Ahora envía los cambios al servidor.
git push origin dev
git push origin myFeature
Y lo verás como quieras.
Si desea crear una nueva rama a partir de cualquiera de las ramas existentes en Git, simplemente siga las opciones.
Primero cambie/pague en la sucursal desde donde desea crear una nueva sucursal. Por ejemplo, si tiene las siguientes ramas como:
- maestro
- desarrollador
- rama1
Entonces, si desea crear una nueva rama llamada "subbranch_of_b1" debajo de la rama llamada "branch1", siga los pasos:
Pagar o cambiar a "branch1"
git checkout branch1
Ahora cree su nueva rama llamada "subbranch_of_b1" debajo de "branch1" usando el siguiente comando.
git checkout -b subbranch_of_b1 branch1
Lo anterior creará una nueva rama llamada subbranch_of_b1 debajo de la rama rama1 (tenga en cuenta que
branch1
en el comando anterior no es obligatorio ya que HEAD actualmente apunta a ella, aunque puede especificarlo si está en una rama diferente).Ahora, después de trabajar con subbranch_of_b1 , puede confirmarlo y enviarlo o fusionarlo de forma local o remota.
Empuje el subbranch_of_b1 al control remoto:
git push origin subbranch_of_b1
Varias formas de crear una rama en Git desde otra rama:
Esta respuesta agrega información adicional, que aún no está presente en las respuestas existentes, con respecto solo al título de la pregunta en sí ( Crear una rama en Git desde otra rama ), pero no aborda los detalles más específicos de la pregunta que ya tienen suficientes respuestas. aquí.
Estoy agregando esto porque realmente necesitaba saber cómo hacer el punto 1 a continuación (crear una nueva rama a partir de una rama que no he verificado ), y no era obvio cómo hacerlo, y las búsquedas en Google me llevaron hasta aquí como uno de los mejores resultados de búsqueda. Entonces, compartiré mis hallazgos aquí. Esto no se aborda bien, en todo caso, en ninguna otra respuesta aquí.
Mientras estoy en esto, también agregaré mis otros git branch
comandos más comunes que uso en mi flujo de trabajo habitual, a continuación.
1. Para crear una nueva sucursal a partir de una sucursal que no ha retirado:
Cree branch2
desde branch1
mientras tiene cualquier rama desprotegida (por ejemplo, digamos que ha master
desprotegido):
git branch branch2 branch1
El formato general es:
git branch <new_branch> [from_branch]
man git branch
lo muestra de la siguiente manera. Lo que yo llamo <new_branch>
es lo que ellos llaman <branchname>
, y lo que yo llamo [from_branch]
es lo que ellos llaman [<start-point>]
:
git branch [--track | --no-track] [-l] [-f] <branchname> [<start-point>]
2. Para crear una nueva sucursal a partir de la sucursal que ya ha retirado:
git branch new_branch
Esto es excelente para hacer copias de seguridad antes de cambiar la base, aplastar, restablecer por completo, etc., antes de hacer cualquier cosa que pueda estropear gravemente su rama.
Ejemplo: estoy en feature_branch1
y estoy a punto de convertir 20 confirmaciones en 1 usando git rebase -i master
. En caso de que alguna vez quiera "deshacer" esto, ¡primero hagamos una copia de seguridad de esta rama! Hago esto TODO...EL...TIEMPO y me resulta muy útil y reconfortante saber que siempre puedo volver fácilmente a esta rama de respaldo y volver a ramificarla para volver a intentarlo en caso de que me equivoque feature_branch1
en el proceso:
git branch feature_branch1_BAK_20200814-1320hrs_about_to_squash
La 20200814-1320hrs
parte es la fecha y hora en formato YYYYMMDD-HHMMhrs
, por lo que serían las 13:20 horas (1:20 p.m.) del 14 de agosto de 2020. De esta manera tengo una manera fácil de encontrar mis sucursales de respaldo hasta que esté seguro de que estoy listo para eliminarlos. Si no haces esto y te equivocas mucho, tienes que usar git reflog
para buscar tu rama antes de estropearla, lo cual es mucho más difícil, más estresante y más propenso a errores.
Interjección: notas sobre git checkout
vsgit switch
- La clásica y universal "navaja suiza" que puede hacer 1000 cosas:
git checkout
. - Los nuevos y experimentales comandos alternativos a
git checkout
:git switch
+git restore
.
git switch
se agregó recientemente en Git v2.23. Vea su versión de git con git --version
. Está diseñado para ser una forma extremadamente limitada de git checkout
, diseñado sólo para cambiar de rama en lugar de tener también la capacidad de extraer o restaurar archivos, como git checkout
puede hacer. Lea más aquí: https://www.git-tower.com/learn/git/commands/git-switch.
Ver también: ¿Qué sigue haciendo git checkout después de que se introdujo git switch? . git restore
ofrece algunas del resto de funcionalidades que git checkout
no git switch
contiene.
Ambos man git switch
y man git restore
precaución:
ESTE COMANDO ES EXPERIMENTAL. EL COMPORTAMIENTO PUEDE CAMBIAR.
Así que siéntete libre de seguir git checkout
si quieres. No es probable que su comportamiento cambie.
Prácticamente solo lo uso git checkout
yo mismo, pero puedes usarlo git switch
(y git restore
restaurar o "revisar" archivos) si lo deseas.
3. Para crear y retirar una nueva sucursal de la sucursal que ya ha retirado:
# the standard, "classic" command most people still use; `-b` stands
# for "create 'b'ranch"
git checkout -b new_branch
# the newer, "experimental" command now available as of Git v2.23; `-c` stands
# for "'c'reate branch"
git switch -c new_branch
Para que quede claro lo que está sucediendo allí, sepa que este comando anterior es equivalente a estos dos comandos separados:
# classic
git branch new_branch
git checkout new_branch
# OR: new/experimental as of Git v2.23
git branch new_branch
git switch new_branch
4. Para crear y retirar una nueva sucursal de una sucursal que no ha retirado:
# classic
git checkout -b new_branch from_branch
# OR: new/experimental as of Git v2.23
git switch -c new_branch from_branch
Para que quede claro lo que está sucediendo allí, sepa que este comando anterior es equivalente a estos tres comandos separados:
# classic
git checkout from_branch
git branch new_branch
git checkout new_branch
# OR: new/experimental as of Git v2.23
git switch from_branch
git branch new_branch
git switch new_branch
5. Para cambiar el nombre de una sucursal
Al igual que cambiar el nombre de un archivo o carpeta normal en la terminal, git
se considera que "cambiar el nombre" es más como un comando 'm'ove', por lo que se utiliza git branch -m
para cambiar el nombre de una rama. Aquí está el formato general:
git branch -m <old_name> <new_name>
man git branch
lo muestra así:
git branch (-m | -M) [<oldbranch>] <newbranch>
Ejemplo: cambiemos el nombre branch_1
a branch_1.5
:
git branch -m branch_1 branch_1.5
O, si ya ha realizado branch_1
el check-out, puede cambiar el nombre de la rama actualmente retirada para que branch_1.5
le guste esto:
git branch -m branch_1.5
6. Para crear una nueva rama de funciones ( feature2
) basada en los últimos cambios ascendentes del main
momento en que realizó feature1
el check-out actualmente
Juntemos mucho de lo que aprendimos anteriormente para presentar un ejemplo muy común que debemos ejecutar cada vez que finalizamos una función y necesitamos iniciar otra.
# The beginner/intermediate way
git checkout main # check out main branch
git pull # pull latest upstream changes down
git checkout -b feature2 # create branch `feature2` from `main`, and check
# it out, all in one step`
# The advanced way
# [this is what I do--I'll explain why, below]
git fetch origin main:main # pull latest upstream changes down from the
# remote `main` branch, to the
# locally-stored remote-tracking **hidden**
# branch named `origin/main`, **and** to
# the local `main` branch
git checkout -b feature2 main # create branch `feature2` from `main`, and
# check it out, all in one step`
# OR (nearly the same thing)
git fetch origin main # pull latest upstream changes down from the
# remote `main` branch, to the
# locally-stored remote-tracking **hidden**
# branch named `origin/main`. This does NOT
# update the local `main` branch though!
git checkout -b feature2 origin/main # create branch `feature2` from
# `origin/main`, and check it out, all
# in one step`
Entonces, cuando estoy en la rama feature1
, acabo de terminarla y estoy listo para comenzar con una nueva feature2
basada en la última main
rama, ¿por qué hago esto?
git fetch origin main:main
git checkout -b feature2 main
...¿en lugar de esto?:
git checkout main
git pull
git checkout -b feature2
La respuesta, sorprendentemente, es que git checkout
puede ser una operación terriblemente lenta y pesada. —toma más de 3 horas en un repositorio mono masivo utilizando git lfs
ganchos posteriores al pago en el .git/hooks/post-checkout
archivo del repositorio. Dejame explicar. El .git/hooks/post-checkout
archivo es un archivo ejecutable que contiene un script que git ejecutará cada vez que ejecute git checkout
. Si contiene una llamada a git lfs post-checkout "$@"
, entonces puede intentar descargar más de 20 GB de git lfs
datos (específicos del repositorio en el que trabajo; su escenario puede variar) después de ejecutar un archivo git checkout
. ¡No quiero hacer eso! Entonces, me salto el git checkout
proceso para evitar esa molestia y comienzo con mi feature2
sucursal inmediatamente sin descargar todas esas cosas que no necesito primero.
Ver también:
- Enlaces rápidos a mis respuestas a las que hago referencia con frecuencia y que considero "fundamentos de git":
- Varias formas de crear una rama en git desde otra rama
- Todo sobre consultar archivos o directorios en git
- ¿Quiénes somos "nosotros" y quiénes son "ellos" según Git?
- Cómo utilizar
git diff
filtros a través de--diff-filter=
- Todo sobre buscar (vía
grep
o similar) en tus repositorios de git - Cómo utilizarlo
git lfs
como usuario básico: ¿Cuál es la diferencia entregit lfs fetch
,git lfs fetch --all
ygit lfs pull
?
Crear una sucursal
Crear rama cuando la rama maestra esté desprotegida. Aquí las confirmaciones en master se sincronizarán con la rama que creó.
git branch branch1
Crear rama cuando rama1 esté desprotegida. Aquí las confirmaciones en rama1 se sincronizarán con rama2
git branch branch2
Pagar una sucursal
comando git checkout cambiar ramas o restaurar archivos de árbol de trabajo
git checkout branchname
Cambiar el nombre de una sucursal
git branch -m branch1 newbranchname
Eliminar una sucursal
git branch -d branch-to-delete
git branch -D branch-to-delete
( forzar la eliminación sin verificar el estado combinado )
Crear y cambiar de rama
git checkout -b branchname
Sucursales que están completamente incluidas
git branch --merged
Diferencias de rama [ git diff rama1..branch2 ]
diferencia multilínea
git diff master..branch1
diferencia de una sola línea
git diff --color-words branch1..branch2