Quelles sont les différences entre la succursale locale, la succursale de suivi locale, la succursale distante et la succursale de suivi à distance?

158

Je viens de commencer à utiliser Git et je suis vraiment confus entre les différentes branches. Quelqu'un peut-il m'aider à comprendre quels sont les types de branches suivants?

  • succursales locales
  • succursales locales de suivi
  • succursales distantes
  • succursales 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.

eded
la source

Réponses:

123

Une branche locale est une branche que vous seul (l'utilisateur local) pouvez voir. Il n'existe que sur votre machine locale.

git branch myNewBranch        # Create local branch named "myNewBranch"

Une succursale distante est une succursale située sur un site distant (dans la plupart des cas origin). Vous pouvez pousser la branche locale nouvellement créée myNewBranchvers origin. Maintenant, d'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"

Une branche de suivi à distance est une copie locale d'une branche distante. Lorsque myNewBranchest poussé à originutiliser la commande ci-dessus, une branche de suivi à distance nommée origin/myNewBranchest créée sur votre machine. Cette branche de suivi à distance suit la branche distante myNewBranchsur origin. Vous pouvez mettre à jour votre branche de suivi à distance pour qu'elle soit synchronisée avec la branche distante à l' aide de git fetchou 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"

Une succursale de suivi locale est une succursale locale qui suit une autre succursale. Ceci afin que vous puissiez pousser / tirer des commits vers / depuis l'autre branche. Les branches de suivi locales dans la plupart des cas suivent une branche de suivi à distance. Lorsque vous pousser une branche locale à originutiliser l' option git push commandavec une -u(comme illustré ci-dessus), vous configurez la branche locale myNewBranchpour suivre la branche de suivi à distance origin/myNewBranch. Ceci est nécessaire pour utiliser git pushet git pullsans spécifier d'amont vers lequel pousser ou tirer.

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.
SNce
la source
Pour la définition de la branche de suivi locale, n'est-ce pas la même chose qu'une branche locale après l'avoir poussée vers remote?
mskw
2
@mskw Non, une branche locale de suivi et une branche locale (sans suivi) diffèrent par association. Une succursale locale n'est associée à aucune succursale. Il s'agit simplement d'une branche existant sur votre machine locale de manière isolée. Une branche de suivi locale est associée à une branche de suivi à distance. Ainsi, vous pouvez pousser / tirer des commits l'un vers l'autre.
SNce
196

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 [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 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 mastersuit la branche de suivi à distance origin/masteret que la branche locale new-featurene 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 pullet 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 pullutilise 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: [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 remotecommande 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 fetchou git pullpour 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' --trackindicateur 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-kittyet 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.

Flimm
la source
J'utiliserais pour créer une branche et aller à la branche dans un cmd comme: git checkout -b mynewbranch
Zeta
J'ai adoré le dernier point sur la différence entre l'espace et la barre oblique!
aderchox le
12

Branche locale:

Une branche sur votre machine dans laquelle vous pouvez travailler et ajouter des validations. 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 tels que la possibilité de spécifier le référentiel et le nom de la branche git pullet git pushsans avoir à spécifier. Le suivi a également git statuspour effet de vous informer lorsque votre succursale est devant ou derrière la télécommande.

Succursale 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 doit jamais être modifiée. Son objectif 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 -ret ressemblent généralement à quelque chose comme origin/master(nom du dépôt suivi d'une barre oblique suivie du nom de la branche). L'exécution git fetchmettra à jour les branches de suivi distantes pour refléter l'état des branches distantes correspondantes.

git branch -avvest mon préféré pour afficher un aperçu rapide des branches sur ma machine, des branches sur la télécommande et du dernier commit de chacune. La -apartie spécifie que toutes les branches doivent être affichées (distantes et locales). Les v's à la fin signifient verbose (il montre le dernier hachage et message de validation). Merci à @Flimm d'avoir signalé que le second vajoute des informations sur quelle branche locale suit quelle télécommande.

Eric Mathison
la source
1
Je ne comprends pas la différence entre le suivi local et les branches de suivi à distance - le premier correspond à l'origine et le second à la machine distante. mais n'est-ce pas la même chose? n'est-ce pas juste le dépôt qui est habituellement sur github?
akantoword
1
@akantoword J'ai mis à jour la réponse pour essayer de clarifier un peu. Fondamentalement, la branche de suivi à distance est simplement une copie locale de la branche distante qui n'est pas destinée à fonctionner. Une branche locale avec suivi est destinée à travailler.
Eric Mathison