Je viens juste de commencer à utiliser Git et je suis vraiment confus entre différentes branches. Quelqu'un peut-il m'aider à comprendre quels sont les types de branches suivants?
Quelle est la différence entre eux? Et comment travaillent-ils les uns avec les autres?
Un code de démonstration rapide sera vraiment utile, je suppose.
Un branche locale est une branche que seul l'utilisateur local peut voir. Il n'existe que sur votre ordinateur local.
git branch myNewBranch # Create local branch named "myNewBranch"
A branche distante est une branche située sur un emplacement distant (dans la plupart des cas, Origin
). Vous pouvez pousser la branche locale nouvellement créée myNewBranch
vers Origin
. Maintenant, les autres utilisateurs peuvent le suivre.
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"
A branche de suivi à distance est une copie locale d'une branche à distance. Lorsque myNewBranch
est poussé sur Origin
à l'aide de la commande ci-dessus, une branche de suivi distante nommée Origin/myNewBranch
est créé sur votre machine. Cette branche de suivi à distance suit la branche distante myNewBranch
sur Origin
. Vous pouvez mettre à jour votre branche de suivi à distance pour qu'il soit synchronisé avec la branche distante à l'aide de git fetch
ou 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"
Un branche de suivi local est un branche locale qui suit une autre branche. C’est pour que vous puissiez pousser/tirer les commits vers/depuis l’autre branche. Les branches de suivi locales suivent dans la plupart des cas une branche de suivi à distance. Lorsque vous poussez une branche locale vers Origin
à l’aide de la touche git Push command
avec un -u
Option (comme indiqué ci-dessus), vous configurez la branche locale myNewBranch
pour suivre la branche de suivi distante Origin/myNewBranch
. Ceci est nécessaire pour utiliser git Push
et git pull
sans spécifier en amont à Push to ou pull from.
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.
Voici la longue réponse.
Si vous utilisez Git en collaboration, vous devrez probablement synchroniser vos commits avec d'autres machines ou emplacements. Chaque machine ou emplacement est appelé 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, lancez git remote
:
$ git remote
bitbucket
Origin
Vous pouvez voir à quels emplacements ces noms distants sont des raccourcis, en exécutant 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)
Chaque télécommande a un répertoire sous git/refs/remotes/
:
$ ls -F .git/refs/remotes/
bitbucket/ Origin/
TLDR: sur votre machine locale, vous avez trois types de branches: les branches locales non suivies, les branches locales de suivi et les branches distantes. Sur un ordinateur distant, vous n’avez qu’un type de branche.
Vous pouvez afficher une liste de toutes les branches locales de votre ordinateur en exécutant git branch
:
$ git branch
master
new-feature
Chaque branche locale a un fichier sous .git/refs/heads/
:
$ ls -F .git/refs/heads/
master new-feature
Il existe deux types de branches locales sur votre machine: les branches locales non suivies et les branches locales.
Les branches locales non suivies ne sont associées à aucune autre branche. Vous en créez un en exécutant git branch <branchname>
.
Les branches locales de suivi sont associées à une autre branche, généralement une branche de suivi à distance. Vous en créez un en exécutant git branch --track <branchname> [<start-point>]
.
Vous pouvez voir laquelle de vos succursales locales surveille les succursales à l'aide de git branch -vv
:
$ git branch -vv
master b31f87c85 [Origin/master] Example commit message
new-feature b760e04ed Another example commit message
Dans la sortie de cette commande, vous pouvez voir que la branche locale master
suit la branche de suivi à distance Origin/master
, et la branche locale new-feature
ne suit rien.
Une autre façon de voir quelles branches suivent les branches est de jeter un coup d'œil à .git/config
.
Le suivi des branches locales est utile. Ils vous permettent de courir 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>
Vous pouvez afficher une liste de toutes les branches de suivi à distance sur votre ordinateur en exécutant git branch -r
:
$ git branch -r
bitbucket/master
Origin/master
Origin/new-branch
Chaque branche de télé-suivi 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 ordinateurs distants. Vous pouvez mettre à jour vos branches de télé-suivi à l’aide de git fetch
, lequel git pull
utilise en coulisse.
Même si toutes les données d'une branche de suivi à distance sont stockées localement sur votre ordinateur (comme un cache), elles ne sont toujours pas appelées une branche locale. (Du moins, je n'appellerais pas ça comme ça!) C'est simplement une branche de télé-suivi.
Vous pouvez afficher toutes les branches distantes (c’est-à-dire les branches de la machine distante) en exécutant 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)
Cette git remote
La commande interroge la machine distante du réseau sur ses branches. Il ne met pas à jour les branches de télé-suivi sur votre ordinateur local, utilisez git fetch
ou git pull
pour ça.
A partir de la sortie, vous pouvez voir toutes les branches qui existent sur la machine distante en regardant dans la rubrique "branches distantes" (ignorer 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 pouvez consulter toutes ses branches sous refs/heads/
.
Pour supprimer une branche locale, avec ou sans suivi, en toute sécurité:
git branch -d <branchname>
Pour supprimer une branche locale, avec ou sans suivi, avec 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 local: (Notez que si <start-point>
est spécifié et constitue une branche de suivi à distance telle que Origin/foobar
, puis le --track
le drapeau 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 obsolètes, c'est-à-dire où les branches correspondantes sur l'ordinateur distant n'existent plus:
git remote Prune <remote>
Vous avez peut-être remarqué que dans certaines commandes, vous utilisez <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 ordinateur, alors que lorsque vous utilisez un espace, vous utilisez une branche sur une machine distante via le réseau.
succursale locale:
Une branche de votre machine sur laquelle vous pouvez travailler et ajouter des commits. Vous pouvez lister ces branches avec git branch
.
succursale locale (avec suivi):
Une branche locale ordinaire configurée pour correspondre à une branche distante. Cela a des avantages comme la capacité à git pull
et git Push
sans avoir à spécifier le référentiel et le nom de la branche. Le suivi provoque également git status
pour vous informer lorsque votre succursale est en avance ou derrière la télécommande.
branche distante:
Simplement une branche sur un référentiel distant, généralement sur un serveur tel que GitHub, etc.
Branche de suivi à distance:
Une copie locale d'une branche distante. Cette branche ne devrait jamais être modifiée. Son but est de garder une trace de l'état actuel d'une branche distante. Les branches de suivi à distance peuvent être visualisées avec git branch -r
et ressemblent généralement à quelque chose comme Origin/master
_ (nom du dépôt suivi d'une barre oblique suivi du nom de la branche). Fonctionnement git fetch
mettra à jour les branches de suivi à distance pour refléter l'état des branches à distance correspondantes.
git branch -avv
est mon favori personnel pour afficher un aperçu rapide des branches qui se trouvent sur ma machine, des branches de la télécommande et des dernières mises à jour de chacune. Le -a
part spécifie que toutes les branches doivent être affichées (distantes et locales). Les v
à la fin représentent "verbose" (ils indiquent le dernier hachage et le dernier message de validation). Merci à @Flimm pour avoir signalé que le second v
ajoute des informations sur la branche locale qui suit quelle télécommande.