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 git@bitbucket.org:flimm/example.git (fetch)
bitbucket git@bitbucket.org:flimm/example.git (push)
origin git@github.com:Flimm/example.git (fetch)
origin git@github.com: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 master
está rastreando la rama de seguimiento remoto origin/master
, y la rama local new-feature
no 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 pull
y 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 pull
utiliza 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: git@github.com:Flimm/example.git
Push URL: git@github.com: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 remote
comando 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 fetch
o git pull
para 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 --track
bandera 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-kitty
y 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.