web-dev-qa-db-fra.com

changer de branche sans chercher les fichiers

Est-il possible de changer de branche sans avoir à extraire tous les fichiers? Après avoir changé de branche, je dois supprimer tous les fichiers, les régénérer, les valider et les rétablir. Ainsi, extraire des fichiers n’est qu’une perte de temps (et il ya environ 14 000 fichiers - c’est une longue opération).

Pour que tout soit clair:

J'ai besoin de tout cela pour télécharger documentation sur github.

J'ai repo avec la branche gh-pages. Lorsque je reconstruis la documentation localement, je la copie dans le répertoire repo, commit et Push to github. Mais je n'étais pas content car j'avais deux copies de la documentation localement. Et j'ai décidé de créer une branche vide et après avoir validé de changer de fichiers. Mais revenir en arrière est une opération longue - j'ai donc posé cette question.

Je sais que je peux simplement laisser sur gh-pages branch et supprimer des fichiers, mais je n'aime pas les arbres sales.

78
tig

Oui, tu peux faire ça.

git symbolic-ref HEAD refs/heads/otherbranch

Si vous devez vous engager sur cette branche, vous devrez également réinitialiser l'index, sans quoi vous devrez commettre un acte basé sur la dernière branche extraite.

git reset
87
CB Bailey

Utilisation des commandes git de base uniquement:

Cette réponse est un peu plus longue que celle de Charles, mais elle consiste uniquement en des commandes git de base que je peux comprendre et donc me rappeler, éliminant ainsi la nécessité de continuer à chercher.

Marquez votre emplacement actuel (commettez d'abord si nécessaire):

git checkout -b temp

Réinitialise (déplace) le marqueur vers l’autre branche sans changer de répertoire de travail:

git reset <branch where you want to go>

à présent, temp et une autre branche pointent vers le même commit et votre répertoire de travail n’est pas modifié.

git checkout <branch where you want to go>

puisque votre HEAD pointe déjà sur le même commit, le répertoire de travail n'est pas touché

git branch -d temp

Notez que ces commandes sont également facilement disponibles à partir de n'importe quel client graphique.

33
user1115652

Ne serait-il pas préférable d’avoir deux répertoires de travail (deux zones de travail) avec un référentiel, voire deux 

Il y a git-new-workdir tool dans la section contrib/ pour vous aider.

14
Jakub Narębski

Pour le bénéfice du lecteur:

Bien que je pense que la solution de Charles Bailey est une solution correcte, cette solution nécessite un tweak lors du passage à quelque chose qui n’est pas une branche locale. En outre, il devrait y avoir un moyen de le faire avec des commandes régulières, ce qui est facile à comprendre. Voici ce que je suis venu avec:

git checkout --detach
git reset --soft commitish
git checkout commitish

A expliqué:

  • git checkout --detach est identique à git checkout HEAD^{}, ce qui laisse la branche actuelle derrière et passe à l'état "tête détachée". La prochaine modification de HEAD n'affecte donc plus aucune branche. Le détachement de HEAD n'affecte ni l'arborescence de travail ni l'index.
  • git reset --soft commitish déplace ensuite HEAD vers le SHA de la commitish donnée. Si vous souhaitez également mettre à jour l'index, laissez --soft de côté, mais je ne le recommande pas. Ceci, encore une fois, ne touche pas l'arbre de travail et (--soft) pas l'index.
  • git checkout commitish attache ensuite HEAD à la commitish (branche) donnée à nouveau. (Si commitish est un SHA, rien ne se passe.) Cela non plus n'affecte ni l'index ni la structure de travail.

Cette solution accepte tout ce qui fait référence à un commit, elle est donc idéale pour un alias git. Le rev-parse ci-dessous est juste un test pour s'assurer que rien ne se casse dans la chaîne, de sorte que les fautes de frappe ne basculent pas accidentellement dans l'état de tête détachée (la récupération d'erreur serait beaucoup plus complexe).

Cela conduit à l’alias git switch treeish suivant:

git config --global alias.switch '!f() { git rev-parse --verify "$*" && git checkout "HEAD^{}" && git reset --soft "$*" && git checkout "$*"; }; f'

FYI, vous pouvez le trouver dans ma liste de git aliases .

9
Tino

Vous pouvez écraser votre fichier HEAD avec un nom de branche différent:

echo "ref: refs/heads/MyOtherBranch"> .git/HEAD

8
user157005

Si vous essayez simplement de changer l’emplacement d’une branche distante, vous pouvez le faire avec "git Push" sans toucher à votre copie locale.

http://kernel.org/pub/software/scm/git/docs/git-Push.html

Le format d'un paramètre <refspec> est un plus +, suivi de la référence de source <src>, suivi de deux points:, suivi de la destination de référence <dst>. Il est utilisé pour spécifier avec quel objet <src> la référence <dst> du référentiel distant doit être mise à jour.

par exemple, pour mettre à jour foo et valider c5f7eba, procédez comme suit:

git Push Origin c5f7eba:foo

Vous ne savez pas si c'est ce que vous recherchiez ou non.

0
Tim Abell

Avec autant de fichiers, il est préférable de ne conserver que deux pensions, une pour chaque branche. Vous pouvez tirer les changements en arrière au besoin. Cela va être moins surprenant que d'essayer de jouer des tours avec le scorbut avec git.

0
Norman Ramsey

vous pouvez utiliser 

      1. git checkout -f <new-branch>
      2. git cherry-pick -x <previous-branch-commit-id>

previous-branch-commit-id est la validation à partir de laquelle vous souhaitez copier les anciennes données.

0
Haseena Parkar