web-dev-qa-db-fra.com

Git change de branche quand un fichier du même nom est présent

J'ai dans mon dépôt Git, un fichier nommé xyz. Par coïncidence, j'ai aussi une branche appelée xyz. Actuellement, je suis maître, mais je souhaite passer à la succursale xyz. La commande à utiliser est simple

$ git checkout xyz

Mais ceci extrairait le fichier xyz dans le HEAD actuel. Comment changerais-je de succursale en succursale xyz?

34
venky

Comme illustré par commit a047faf (git 1.8.4.3+), vous pouvez également essayer:

git checkout xyz --

(Remarque: le message d'erreur sera plus clair avec Git 2.21, T1 2019 )

Cela indiquerait clairement que la partie xyz est une branche ou un commit, tandis que tout ce qui suit le -- doit être un chemin (ici, aucun chemin n'est fourni). Voir plus ici sur la convention de double trait d'union .

Si vous essayez sans '--', cela pourrait ou non fonctionner, comme indiqué dans " Pourquoi git checkout <remote_branchname> ne crée-t-il pas de nouvelle branche de suivi? ":

git checkout name fait:

  • si c'est une branche locale ou une branche distante explicite, basculez-y.
  • si c'est un chemin suivi, réinitialisez-le
  • s'il s'agit d'une branche distante, créez une branche de suivi et passez à celle-ci.

Et son comportement n'est pas toujours le même. D'où le '--' pour fournir une claire ambiguïté.

46
VonC

Bien que la solution de VonC fonctionne, je ne me souviens jamais de la syntaxe. J'utilise donc généralement une solution plus low-tech:

$ (cd somedir && git checkout my-branch)

Ou, si vous n'avez pas de sous-répertoires:

$ (cd .git && git -C .. checkout my-branch)

C'est plus facile à retenir et ça marche ;-)

1
Martin Tournoij

Git 2.21 (Q1 2019, 4 ans et plus après) va clarifier le message d'erreur et faire des suggestions

"git checkout frotz" ( sans le double tiret que j'ai suggéré initialement ) évite les ambiguïtés en s'assurant que 'frotz' ne peut pas être interprété à la fois comme une révision et un chemin d'accès.

Cette sécurité a été mise à jour pour vérifier également une branche unique de suivi à distance 'frotz' dans une télécommande lorsque dwimming _ crée une branche locale 'frotz' à partir d'une branche de suivi à distance 'frotz' à partir d'une commande à distance. .

Remarque: "dwim" (utilisé ci-dessous) est "fais ce que je veux dire" lorsqu'un ordinateur tente d'anticiper ce que les utilisateurs ont l'intention de faire, corrige automatiquement les erreurs triviales plutôt que d'exécuter aveuglément les utilisateurs de manière explicite mais potentiellement incorrecte. contributions.

Voir commit be4908f (13 nov. 2018) de Nguyễn Thái Ngọc Duy (pclouds) .
(Fusionnée par Junio ​​C Hamano - gitster - dans commit 8d7f9db , 4 janvier 2019)

checkout: ne pas faire l'ambiguïté des branches de suivi de Dwim et des fichiers locaux

Lorsque dwim checkout est ajouté dans commit 70c9ac2 , il est limité à dwim uniquement lorsque certaines conditions sont remplies. Dans le cas contraire, le comportement d'extraction est rétabli.

Il s'avère que tomber peut être déroutant.

Une des conditions pour tourner

git checkout frotz

à

git checkout -b frotz Origin/frotz

est-ce que frotz ne doit pas exister sous forme de fichier.

Mais lorsque l'utilisateur en vient à s'attendre à ce que "git checkout frotz" crée la branche "frotz" et qu'il se trouve qu'il existe un fichier nommé "frotz", le contenu de fichier "frotz" de git n'aide pas.
Ceci est rapporté dans liste de diffusion Git et est même utilisé comme un exemple de "Git is bad" ailleurs }.

Nous essayons normalement de faire ce qui est bien, mais quand il y a plusieurs "bonnes choses" à faire, il est préférable de laisser le choix à l'utilisateur.

Cochez cette case, demandez à l'utilisateur de lever la ambiguïté:

  • "git checkout -- foo" va vérifier le chemin "foo"
  • "git checkout foo --" dwim et créera une branche "foo" _ 6

Pour les utilisateurs qui ne veulent pas dwim, utilisez --no-guess. C'est inutile dans ce cas particulier car "git checkout --no-guess foo --" va simplement échouer.
Mais il pourrait être utilisé par des scripts.

La page de manuel pour git checkout inclut désormais:

--no-guess:

Ne tentez pas de créer une branche s'il existe une branche de suivi distante du même nom.

0
VonC