Voici la longue réponse.
Télécommandes:
Si vous utilisez Git en collaboration, vous devrez probablement synchroniser vos commits avec d'autres machines ou emplacements. Chaque machine ou emplacement est appelé un distant , dans la terminologie de Git, et chacun peut avoir une ou plusieurs branches. Le plus souvent, vous n'en aurez qu'un, nommé origin
. Pour lister toutes les télécommandes, exécutez git remote
:
$ git remote
bitbucket
origin
Vous pouvez voir les emplacements pour lesquels ces noms distants sont des raccourcis, en exécutant 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)
Chaque télécommande a un répertoire sous git/refs/remotes/
:
$ ls -F .git/refs/remotes/
bitbucket/ origin/
Branches sur votre machine:
TLDR: sur votre machine locale, vous avez trois types de succursales: les succursales locales sans suivi, les succursales locales de suivi et les succursales à distance. Sur une machine distante, vous n'avez qu'un seul type de branche.
1. Succursales locales
Vous pouvez afficher une liste de toutes les branches locales sur votre ordinateur en exécutant git branch
:
$ git branch
master
new-feature
Chaque succursale locale a un fichier sous .git/refs/heads/
:
$ ls -F .git/refs/heads/
master new-feature
Il existe deux types de succursales locales sur votre ordinateur: les succursales locales sans suivi et les succursales locales.
1.1 Succursales locales non suivies
Les succursales locales sans suivi ne sont associées à aucune autre succursale. Vous en créez un en courant git branch <branchname>
.
1.2. Suivi des succursales locales
Les succursales locales de suivi sont associées à une autre succursale, généralement une succursale de suivi à distance. Vous en créez un en courant git branch --track <branchname> [<start-point>]
.
Vous pouvez voir laquelle de vos succursales locales suit les succursales en utilisant git branch -vv
:
$ git branch -vv
master b31f87c85 [origin/master] Example commit message
new-feature b760e04ed Another example commit message
À partir de la sortie de cette commande, vous pouvez voir que la branche locale master
suit la branche de suivi à distance origin/master
et que la branche locale new-feature
ne suit rien.
Une autre façon de voir quelles branches suivent les branches est de jeter un œil à .git/config
.
Le suivi des succursales locales est utile. Ils vous permettent d'exécuter git pull
et git push
, sans spécifier quelle branche en amont utiliser. Si la branche n'est pas configurée pour suivre une autre branche, vous obtiendrez une erreur comme celle-ci:
$ 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. Branches de suivi à distance (toujours sur votre machine)
Vous pouvez afficher une liste de toutes les branches de suivi à distance sur votre machine en exécutant git branch -r
:
$ git branch -r
bitbucket/master
origin/master
origin/new-branch
Chaque branche de suivi à distance a un fichier sous .git/refs/<remote>/
:
$ tree -F .git/refs/remotes/
.git/refs/remotes/
├── bitbucket/
│ └── master
└── origin/
├── master
└── new-branch
Considérez vos branches de suivi à distance comme votre cache local pour ce que contiennent les machines distantes. Vous pouvez mettre à jour vos branches de suivi à distance en utilisant git fetch
, qui git pull
utilise les coulisses.
Même si toutes les données d'une branche de suivi à distance sont stockées localement sur votre machine (comme un cache), elles ne sont toujours jamais appelées une branche locale. (Au moins, je n'appellerais pas ça comme ça!) C'est juste appelé une branche de suivi à distance.
Branches sur une machine distante:
Vous pouvez afficher toutes les branches distantes (c'est-à-dire les branches sur la machine distante), en exécutant 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)
Cette git remote
commande interroge la machine distante sur le réseau sur ses branches. Il ne met pas à jour les branches de suivi à distance sur votre machine locale, utilisez git fetch
ou git pull
pour cela.
À partir de la sortie, vous pouvez voir toutes les branches qui existent sur la machine distante en regardant sous la rubrique "branches distantes" (ignorez les lignes marquées comme "périmées").
Si vous pouviez vous connecter à la machine distante et trouver le référentiel dans le système de fichiers, vous pourriez jeter un œil à toutes ses branches sous refs/heads/
.
Aide-mémoire:
Pour supprimer une succursale locale, qu'elle soit avec ou sans suivi, en toute sécurité:
git branch -d <branchname>
Pour supprimer une succursale locale, qu'elle soit avec ou sans suivi, de force:
git branch -D <branchname>
Pour supprimer une branche de suivi à distance:
git branch -rd <remote>/<branchname>
Pour créer une nouvelle branche locale sans suivi:
git branch <branchname> [<start-point>]
Pour créer une nouvelle branche de suivi locale: (Notez que si <start-point>
est spécifié et est une branche de suivi à distance comme origin/foobar
, alors l' --track
indicateur est automatiquement inclus)
git branch --track <branchname> [<start-point]
Exemple:
git branch --track hello-kitty origin/hello-kitty
Pour supprimer une branche sur une machine distante:
git push --delete <remote> <branchname>
Pour supprimer toutes les branches de suivi à distance qui sont périmées, c'est-à-dire là où les branches correspondantes sur la machine distante n'existent plus:
git remote prune <remote>
Vous avez peut - être remarqué que dans certaines commandes, utilisez - vous <remote>/<branch>
, et d' autres commandes, <remote> <branch>
. Exemples: git branch origin/hello-kitty
et git push --delete origin hello-kitty
.
Cela peut sembler arbitraire, mais il existe un moyen simple de se rappeler quand utiliser une barre oblique et quand utiliser un espace. Lorsque vous utilisez une barre oblique, vous faites référence à une branche de suivi à distance sur votre propre machine, tandis que lorsque vous utilisez un espace, vous avez en fait affaire à une branche sur une machine distante sur le réseau.