remote example delete git version-control git-branch git-remote

example - git push-u



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

Aquí está la respuesta larga.

Remotos:

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

$ git remote bitbucket origin

Puede ver para qué ubicaciones son estos nombres remotos los accesos directos 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 bajo git/refs/remotes/ :

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

Sucursales en su máquina:

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

1. Ramas 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 en .git/refs/heads/ :

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

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

1.1 Ramas locales sin seguimiento

Las sucursales locales sin seguimiento no están asociadas con ninguna otra rama. Usted crea uno ejecutando git branch <branchname> .

1.2. Seguimiento de sucursales locales

El seguimiento de las sucursales locales está asociado con otra sucursal, generalmente una sucursal de seguimiento remoto. Usted crea uno ejecutando 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 el master sucursal local está rastreando el origin/master sucursal de seguimiento remoto, y la new-feature sucursal local no está rastreando nada.

Otra forma de ver qué ramas son rastrear sucursales es echar un vistazo a .git/config .

El seguimiento de las sucursales locales es útil. Permiten ejecutar git pull y git push , sin especificar qué rama ascendente usar. Si la sucursal no está configurada para rastrear otra sucursal, 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 rastreo 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 memoria caché local para lo que contienen las máquinas remotas. Puede actualizar sus ramas de rastreo remoto usando git fetch , que git pull utiliza detrás de escena.

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

Sucursales 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 comando git remote consulta la máquina remota a través de la red sobre sus ramas. No actualiza las ramas de rastreo remoto en su máquina local, use git fetch o git pull para eso.

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

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

Hoja de trucos:

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

    git branch -d <branchname>

  • Para eliminar una rama local, ya sea de seguimiento o de no seguimiento, con fuerza:

    git branch -D <branchname>

  • Para eliminar una rama de seguimiento remoto:

    git branch -rd <remote>/<branchname>

  • Para crear una nueva rama local sin seguimiento:

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

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

    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 ya no existan las ramas correspondientes en la máquina remota:

    git remote prune <remote>

Puede haber notado que en algunos comandos, utiliza <remote>/<branch> y otros comandos, <remote> <branch> . Ejemplos: git branch origin/hello-kitty y git push --delete origin hello-kitty .

Puede parecer arbitrario, pero hay una manera simple de recordar cuándo usar una barra inclinada y cuándo usar un espacio. Cuando utiliza una barra inclinada, 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 sucursal en una máquina remota a través de la red.

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

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

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

Un código de demostración rápido será realmente útil, supongo.


Una sucursal local es una sucursal que solo usted (el usuario local) puede ver. Solo existe en tu 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 myNewBranch al 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 remoto es una copia local de una sucursal remota. Cuando myNewBranch se myNewBranch al origin utilizando el comando anterior, se crea una rama de seguimiento remoto denominada origin/myNewBranch en su máquina. Esta rama de seguimiento remoto rastrea la rama remota myNewBranch en el origin . Puede actualizar su rama de seguimiento remoto para que esté sincronizada con la sucursal remota usando git fetch o 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 sucursal de seguimiento local es una sucursal local que está rastreando otra sucursal. Esto es para que pueda empujar / tirar commits hacia / desde la otra rama. En la mayoría de los casos, las sucursales de seguimiento local rastrean una sucursal de seguimiento remoto. Cuando inserta una rama local en el origin utilizando el git push command con una opción -u (como se muestra arriba), configura la rama local myNewBranch para rastrear el origin/myNewBranch derivación de seguimiento remoto origin/myNewBranch . Esto es necesario para usar git push y git pull sin 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.


Sucursal local:

Una rama en su máquina en la que puede trabajar y agregar confirmaciones. Puede enumerar estas ramas con la 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 pull y git push sin tener que especificar el repositorio y el nombre de la rama. El seguimiento también hace que el git status informe cuando su rama está adelante o detrás del control remoto.

Sucursal remota:

Simplemente una rama en un repositorio remoto, normalmente 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 sucursal remota. Las ramas de seguimiento remotas se pueden ver con la git branch -r y, por lo general, se parecen a las de origin/master (nombre del repositorio seguido de una barra seguida del nombre de la rama). La ejecución de git fetch actualizará las ramas de seguimiento remoto para reflejar el estado de las ramas remotas correspondientes.

git branch -avv es mi favorito personal para mostrar una visión general 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 parte -a especifica que se deben mostrar todas las ramas (remota y local). Las v ''s en el extremo son verbosas (muestra el último hash de confirmación y el mensaje). Gracias a @Flimm para señalar que la segunda v agrega información acerca de qué rama local está rastreando qué control remoto.