web-dev-qa-db-fra.com

Quelles sont les différences entre une branche locale, une branche de suivi local, une branche distante et une branche de suivi distante?

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?

  • branches locales
  • branches de suivi locales
  • branches éloignées
  • branches de suivi à distance

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.

134
eded

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.
100
SNce

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é 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/

Branches sur votre machine:

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.

1. branches locales

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.

1.1 branches locales non dépistées

Les branches locales non suivies ne sont associées à aucune autre branche. Vous en créez un en exécutant git branch <branchname>.

1.2. Suivi des branches locales

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>

2. Suivre les branches à distance (toujours sur votre machine)

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.

Branches sur une machine distante:

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/.

Aide-mémoire:

  • 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.

169
Flimm

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 -apart 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.

12
Eric Mathison