Comment puis-je passer à une autre branche dans git?

222

Laquelle de ces lignes est correcte?

git checkout 'another_branch'

Ou

git checkout origin 'another_branch'

Ou

git checkout origin/'another_branch'

Et quelle est la différence entre ces lignes?


Benyamin Jafari
la source
32
git checkout [branch]pour la plupart des utilisateurs qui viennent à cette question
JGallardo

Réponses:

225

Si another_branchexiste déjà localement et que vous n'êtes pas sur cette branche, git checkout another_branchbascule alors sur la branche.

Si another_branchn'existe pas mais existe origin/another_branch, alors git checkout another_branchest équivalent à git checkout -b another_branch origin/another_branch; git branch -u origin/another_branch. C'est de créer à another_branchpartir de origin/another_branchet de définir origin/another_branchen amont de another_branch.

Si aucun n'existe, git checkout another_branchrenvoie une erreur.

git checkout origin another_branchrenvoie une erreur dans la plupart des cas. S'il origins'agit d'une révision et d' another_branchun fichier, il extrait le fichier de cette révision, mais ce n'est probablement pas ce que vous attendez. originest principalement utilisé dans git fetch, git pullet git pushcomme une télécommande, un alias de l'URL du dépôt distant.

git checkout origin/another_branchréussit s'il origin/another_branchexiste. Il conduit à être dans un état HEAD détaché, pas sur une branche. Si vous effectuez de nouveaux validations, les nouvelles validations ne sont accessibles depuis aucune branche existante et aucune des branches ne sera mise à jour.

MISE À JOUR :

Comme la version 2.23.0 a été publiée, nous pouvons également l'utiliser git switchpour créer et changer de branche.

S'il fooexiste, essayez de basculer vers foo:

git switch foo

Si foon'existe pas et origin/fooexiste, essayez de créer à foopartir de origin/foo, puis basculez vers foo:

git switch -c foo origin/foo
# or simply
git switch foo

Plus généralement, s'il foon'existe pas, essayez de créer à foopartir d'une référence connue ou d'un commit, puis passez à foo:

git switch -c foo <ref>
git switch -c foo <commit>

Si nous maintenons un référentiel dans Gitlab et Github en même temps, le référentiel local peut avoir deux télécommandes, par exemple, originpour Gitlab et githubpour Github. Dans ce cas, le référentiel a origin/fooet github/foo. git switch foova se plaindre fatal: invalid reference: foo, car il ne sait pas à partir de quelle référence, origin/fooou github/foo, pour créer foo. Nous devons le spécifier avec git switch -c foo origin/fooou git switch -c foo github/fooselon le besoin. Si nous voulons créer des branches à partir des deux branches distantes, il est préférable d'utiliser des noms distinctifs pour les nouvelles branches:

git switch -c gitlab_foo origin/foo
git switch -c github_foo github/foo

S'il fooexiste, essayez de recréer / forcer la création à foopartir (ou de le réinitialiser foo) d'une référence ou d'une validation connue, puis passez à foo:

git switch -C foo <ref>
git switch -C foo <commit>

qui équivalent à:

git switch foo
git reset [<ref>|<commit>] --hard

Essayez de basculer vers un HEAD détaché d'une référence ou d'un commit connu:

git switch -d <ref>
git switch -d <commit>

Si vous souhaitez simplement créer une branche sans y basculer, utilisez git branchplutôt. Essayez de créer une branche à partir d'une référence connue ou d'un commit:

git branch foo <ref>
git branch foo <commit>
ElpieKay
la source
24
Cette réponse est correcte (comme d'habitude, et surévaluée), mais je vais ajouter un commentaire qui peut être utile: la git checkoutcommande fait trop de choses, à mon avis. C'est pourquoi il y a tant de modes de fonctionnement ici. Si la seule chose à git checkoutfaire était de changer de branche, la réponse serait simple, mais elle peut également créer des branches et même extraire des fichiers à partir de validations spécifiques sans changer de branche.
torek
11
c'est la bonne réponse, mais montre comment git est un peu foutu en ligne de commande. git checkout pour changer de branche?
thang
3
@thang Eh bien, avec la version 2.23.0, cela est résolu: vous pouvez maintenant utiliser git switchpour passer à une branche.
legends2k
Switch ne semble pas fonctionner pour cette version de git. Qu'est-ce que j'utilise pour passer à une autre branche dans cette version de git? C: \ widget> git --version git version 2.11.0.windows.3 C: \ widget> git switch master git: 'switch' n'est pas une commande git. Voir 'git --help'. C: \ widget>
John
1
@John utilise à la git checkoutplace les anciennes versions, qui fonctionnent également dans les versions modernes.
ElpieKay
66

Passer à une autre branche dans git. Réponse simple,

git-checkout - Changer de branche ou restaurer des fichiers d'arborescence de travail

git fetch origin         <----this will fetch the branch
git checkout branch_name <--- Switching the branch

Avant de changer de branche, assurez-vous de ne pas avoir de fichiers modifiés, dans ce cas, vous pouvez valider les modifications ou les cacher.

danglingpointer
la source
La dernière commande me met dans l'état HEAD détaché. Signifie que l'on ne peut pas modifier la branche.
2
La branche que vous essayez de commander n'est pas récupérée, vous devez donc la récupérer avant de procéder au paiement. Vous pouvez ignorer la récupération si la branche est à jour, puis utilisez simplement git checkout branchname.
danglingpointer
Ne suffirait-il pas d'effectuer un "git pull" après avoir basculé sur la branche?
tirer aussi ok, tirer fait la récupération et fusionne ensemble en arrière-plan. Je ne vois aucun diff.
danglingpointer
17

[ git checkout "branch_name"]

est une autre façon de dire:

[ git checkout -b branch_name origin/branch_name]

dans le cas où "nom_branche" n'existe qu'à distance.

[ git checkout -b branch_name origin/branch_name] est utile si vous avez plusieurs télécommandes.

Concernant [ git checkout origin 'another_branch'] je ne suis pas sûr que ce soit possible, AFAK vous pouvez le faire en utilisant la commande "fetch" - [ git fetch origin 'another_branch']

Mehdi
la source
Je connais la commande "git checkout -b branchName" pour créer une autre branche. Ce n'était pas la question!
10

Avec Git 2.23 , on peut utiliser git switch <branch name>pour changer de branche.

gkw
la source
6

Ce qui a fonctionné pour moi est le suivant:

Basculez vers la branche souhaitée:

git checkout -b BranchName

Et puis j'ai tiré le "maître" en:

git pull origin master
Karam Qusai
la source
6

Commandes utiles pour travailler au quotidien:

git checkout -b "branchname" ->  creates new branch
git branch                   ->  lists all branches
git checkout "branchname"    ->  switches to your branch
git push origin "branchname" ->  Pushes to your branch
git add */filename           -> Stages *(All files) or by given file name
git commit -m "commit message" -> Commits staged files
git push                     -> Pushes to your current branch
pola
la source
5

Si vous voulez que la branche suive la branche distante, ce qui est très important si vous allez valider des modifications dans la branche et tirer des modifications, etc., vous devez utiliser ajouter un -t pour le paiement réel, par exemple: git checkout -t branchname

Matthew Joughin
la source
4

Vérifier : git branch -a

Si vous n'obtenez qu'une seule succursale. Suivez ensuite les étapes ci-dessous.

  • Étape 1 : git config --list
  • Étape 2 : git config --unset remote.origin.fetch
  • Étape 3 : git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
pavan
la source
2
Je me demande comment cette série de commandes passerait à une autre branche.
Cela peut être utile lorsque vous avez fait un clone peu profond (en utilisant le depthparam) précédemment et que vous vous demandez maintenant pourquoi vous ne pouvez pas récupérer d'autres branches distantes en error: pathspec 'another_branch' did not match any file(s) known to gitutilisant les commandes suggérées ci-dessus. Ce n'est sûrement pas l'objet de la question d'origine, mais cela peut aider les autres à se gratter la tête ici.
luciash d 'étant le
0

J'utilise cela pour passer d'une branche à une autre, n'importe qui peut l'utiliser, cela fonctionne pour moi comme un charme.

git switch [branchName] OU git checkout [branchName]

ex: git switch develop OR
git checkout develop

Rohit Chaurasiya
la source