¿Cuáles son las diferencias entre la sucursal local, la sucursal de seguimiento local, la sucursal remota y la sucursal de seguimiento remoto?

158

Acabo de comenzar a usar Git y me confundí mucho entre las diferentes ramas. ¿Alguien puede ayudarme a descubrir cuáles son los siguientes tipos de ramas?

  • sucursales locales
  • sucursales locales de seguimiento
  • ramas remotas
  • ramas de seguimiento remoto

¿Cuál es la diferencia entre ellos? ¿Y cómo trabajan entre ellos?

Supongo que un código de demostración rápido será realmente útil.

eded
fuente

Respuestas:

123

Una sucursal local es una sucursal que solo usted (el usuario local) puede ver. Existe solo en su máquina local.

git branch myNewBranch        # Create local branch named "myNewBranch"

Una rama remota es una rama en una ubicación remota (en la mayoría de los casos origin). Puede empujar la rama local recién creada myNewBrancha origin. Ahora otros usuarios pueden rastrearlo.

git push -u origin myNewBranch   # Pushes your newly created local branch "myNewBranch"
                                 # to the remote "origin".
                                 # So now a new branch named "myNewBranch" is
                                 # created on the remote machine named "origin"

Una rama de seguimiento remota es una copia local de una rama remota. Cuando myNewBranchse presiona para originusar el comando anterior, origin/myNewBranchse crea una rama de seguimiento remota llamada en su máquina. Esta rama de seguimiento remoto rastrea la rama remota myNewBranchen origin. Puede actualizar su rama de seguimiento remoto para que esté sincronizada con la rama remota usando git fetcho git pull.

git pull origin myNewBranch      # Pulls new commits from branch "myNewBranch" 
                                 # on remote "origin" into remote tracking
                                 # branch on your machine "origin/myNewBranch".
                                 # Here "origin/myNewBranch" is your copy of
                                 # "myNewBranch" on "origin"

Una rama de seguimiento local es una rama local que rastrea otra rama. Esto es para que pueda empujar / extraer confirmaciones hacia / desde la otra rama. Las sucursales de rastreo locales en la mayoría de los casos rastrean una sucursal de rastreo remota. Cuando se presiona una rama local para originutilizar el git push commandcon una -uopción (como se muestra arriba), se configura la rama local myNewBranchde rastrear la rama seguimiento remoto origin/myNewBranch. Esto es necesario para usar git pushy git pullsin especificar un flujo ascendente para empujar o extraer.

git checkout myNewBranch      # Switch to myNewBranch
git pull                      # Updates remote tracking branch "origin/myNewBranch"
                              # to be in sync with the remote branch "myNewBranch"
                              # on "origin".
                              # Pulls these new commits from "origin/myNewBranch"
                              # to local branch "myNewBranch which you just switched to.
SNce
fuente
Para la definición de bifurcación de seguimiento local, ¿no es lo mismo que una bifurcación local después de llevarlo a control remoto?
mskw
2
@mskw No, una rama de seguimiento local y una rama local (sin seguimiento) difieren en asociación. Una sucursal local NO está asociada con ninguna sucursal. Es simplemente una rama existente en su máquina local de forma aislada. Una rama de seguimiento local está asociada con una rama de seguimiento remota. Por lo tanto, puede empujar / extraer confirmaciones entre sí.
SNce
196

Aquí está la respuesta larga.

Controles remotos:

Si está utilizando Git en colaboración, probablemente necesite sincronizar sus confirmaciones con otras máquinas o ubicaciones. Cada máquina o ubicación se llama remoto , en la terminología de Git, y cada una puede tener una o más ramas. Muy a menudo, solo tendrá uno, llamado origin. Para enumerar todos los controles remotos, ejecute git remote:

$ git remote
bitbucket
origin

Puede ver para qué ubicaciones son atajos estos nombres remotos, ejecutando git remote -v:

$ git remote -v
bitbucket [email protected]:flimm/example.git (fetch)
bitbucket [email protected]:flimm/example.git (push)
origin [email protected]:Flimm/example.git (fetch)
origin [email protected]:Flimm/example.git (push)

Cada control remoto tiene un directorio en git/refs/remotes/:

$ ls -F .git/refs/remotes/
bitbucket/ origin/

Ramas en su máquina:

TLDR: en su máquina local, tiene tres tipos de ramas: ramas locales sin seguimiento, ramas de seguimiento local y ramas de seguimiento remoto. En una máquina remota, solo tiene un tipo de rama.

1. sucursales locales

Puede ver una lista de todas las sucursales locales en su máquina ejecutando git branch:

$ git branch
master
new-feature

Cada sucursal local tiene un archivo debajo de .git/refs/heads/:

$ ls -F .git/refs/heads/
master new-feature

Existen dos tipos de sucursales locales en su máquina: sucursales locales sin seguimiento y sucursales locales con seguimiento.

1.1 Sucursales locales sin seguimiento

Las sucursales locales sin seguimiento no están asociadas con ninguna otra sucursal. Creas uno corriendo git branch <branchname>.

1.2. Seguimiento de sucursales locales

Las ramas locales de seguimiento están asociadas con otra rama, generalmente una rama de seguimiento remoto. Creas uno corriendo git branch --track <branchname> [<start-point>].

Puede ver cuál de sus sucursales locales está rastreando sucursales usando git branch -vv:

$ git branch -vv
master      b31f87c85 [origin/master] Example commit message
new-feature b760e04ed Another example commit message

Desde la salida de este comando, puede ver que la rama local masterestá rastreando la rama de seguimiento remoto origin/master, y la rama local new-featureno está rastreando nada.

Otra forma de ver qué ramas están rastreando ramas es echar un vistazo .git/config.

El seguimiento de las sucursales locales es útil. Le permiten ejecutar git pully git push, sin especificar qué rama ascendente utilizar. Si la rama no está configurada para rastrear otra rama, obtendrá un error como este:

$ git checkout new-feature
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream new-feature <remote>/<branch>

2. Ramas de seguimiento remoto (todavía en su máquina)

Puede ver una lista de todas las ramas de seguimiento remoto en su máquina ejecutando git branch -r:

$ git branch -r
bitbucket/master
origin/master
origin/new-branch

Cada rama de seguimiento remoto tiene un archivo en .git/refs/<remote>/:

$ tree -F .git/refs/remotes/
.git/refs/remotes/
├── bitbucket/
│   └── master
└── origin/
    ├── master
    └── new-branch

Piense en sus ramas de seguimiento remoto como su caché local para lo que contienen las máquinas remotas. Puede actualizar sus ramas de seguimiento remoto utilizando git fetch, que git pullutiliza detrás de escena.

A pesar de que todos los datos de una rama de seguimiento remoto se almacenan localmente en su máquina (como una caché), nunca se llama una rama local. (¡Al menos, no lo llamaría así!) Se llama una rama de seguimiento remoto.

Ramas en una máquina remota:

Puede ver todas las ramas remotas (es decir, las ramas en la máquina remota), ejecutando git remote show <remote>:

$ git remote show origin
* remote origin
  Fetch URL: [email protected]:Flimm/example.git
  Push  URL: [email protected]:Flimm/example.git
  HEAD branch: master
  Remote branches:
    io-socket-ip            new (next fetch will store in remotes/origin)
    master                  tracked
    new-branch              tracked
  Local ref configured for 'git pull':
    master     merges with remote master
    new-branch merges with remote new-branch
  Local ref configured for 'git push':
    master     pushes to master     (up to date)
    new-branch pushes to new-branch (fast-forwardable)

Este git remotecomando consulta a la máquina remota a través de la red sobre sus ramas. No actualiza las ramas de seguimiento remoto en su máquina local, use git fetcho git pullpara eso.

Desde la salida, puede ver todas las ramas que existen en la máquina remota mirando debajo del encabezado "Ramas remotas" (ignore las líneas marcadas como "obsoletas").

Si pudiera iniciar sesión en la máquina remota y encontrar el repositorio en el sistema de archivos, podría echar un vistazo a todas sus ramas refs/heads/.

Hoja de trucos:

  • Para eliminar una sucursal local, ya sea de seguimiento o no, de forma segura:

    git branch -d <branchname>
    
  • Para eliminar una sucursal local, ya sea de seguimiento o no, de manera forzada:

    git branch -D <branchname>
    
  • Para eliminar una rama de seguimiento remoto:

    git branch -rd <remote>/<branchname>
    
  • Para crear una nueva sucursal local sin seguimiento:

    git branch <branchname> [<start-point>]
    
  • Para crear una nueva rama de seguimiento local: (Tenga en cuenta que si <start-point>se especifica y es una rama de seguimiento remoto como origin/foobar, entonces la --trackbandera se incluye automáticamente)

    git branch --track <branchname> [<start-point]
    

    Ejemplo:

    git branch --track hello-kitty origin/hello-kitty
    
  • Para eliminar una rama en una máquina remota:

    git push --delete <remote> <branchname>
    
  • Para eliminar todas las ramas de seguimiento remoto que están obsoletas, es decir, donde las ramas correspondientes en la máquina remota ya no existen:

    git remote prune <remote>
    

Es posible que haya notado que en algunos comandos, se utiliza <remote>/<branch>, y otros comandos, <remote> <branch>. Ejemplos: git branch origin/hello-kittyy git push --delete origin hello-kitty.

Puede parecer arbitrario, pero hay una manera simple de recordar cuándo usar una barra diagonal y cuándo usar un espacio. Cuando usa una barra oblicua, se refiere a una rama de seguimiento remoto en su propia máquina, mientras que cuando usa un espacio, en realidad está tratando con una rama en una máquina remota a través de la red.

Flimm
fuente
Solía ​​crear una rama e ir a la rama en un cmd como: git checkout -b mynewbranch
Zeta
¡Me encantó el último punto sobre la diferencia entre el espacio y la barra!
aderchox
12

Sucursal local:

Una rama en su máquina en la que puede trabajar y agregar commits. Puede enumerar estas ramas con git branch.

Sucursal local (con seguimiento):

Una rama local ordinaria configurada para corresponder a una rama remota. Esto tiene beneficios como la capacidad de git pully git pushsin tener que especificar el repositorio y el nombre de la sucursal. El seguimiento también hace git statusque te informe cuando tu sucursal está adelante o detrás del control remoto.

Rama remota:

Simplemente una sucursal en un repositorio remoto, generalmente en un servidor como GitHub, etc.

Rama de seguimiento remoto:

Una copia local de una sucursal remota. Esta rama nunca debe ser editada. Su propósito es hacer un seguimiento del estado actual de una rama remota. Las ramas de seguimiento remoto se pueden ver git branch -ry, por lo general, tienen un aspecto similar origin/master(nombre del repositorio seguido de una barra inclinada seguida del nombre de la rama). La ejecución git fetchactualizará las ramas de seguimiento remoto para reflejar el estado de las ramas remotas correspondientes.

git branch -avves mi favorito personal para mostrar una descripción rápida de qué ramas están en mi máquina, qué ramas están en el control remoto y la última confirmación en cada una. La -aparte especifica que se deben mostrar todas las ramas (remotas y locales). Los v's en el extremo significan detallado (muestra el último hash y mensaje de confirmación). Gracias a @Flimm por señalar que el segundo vagrega información sobre qué sucursal local está rastreando qué control remoto.

Eric Mathison
fuente
1
No entiendo la diferencia entre el seguimiento local y las ramas de seguimiento remoto: el primero corresponde al origen y el segundo a la máquina remota. pero no son lo mismo? ¿No es ese el repositorio que generalmente está en Github?
akantoword
1
@akantoword Actualicé la respuesta para intentar aclarar un poco. Básicamente la rama de seguimiento remoto es simplemente una copia local de la rama remota que no está destinado a trabajar en una rama local con seguimiento es para trabajar en..
Eric Mathison