switch git branche sans caisse de fichiers

est-il possible dans git de passer à une autre branche sans vérifier tous les fichiers? Après avoir changé de branche, j'ai besoin de supprimer tous les fichiers, de les régénérer, de les propager et de revenir en arrière. Donc la vérification des fichiers est juste une perte de temps (et il y a environ 14000 fichiers - c'est une longue opération).

Pour rendre les choses claires:

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

j'ai repo avec gh-pages de la branche. Lorsque je reconstruis la documentation localement, je la copie dans repo directory, commit et push vers github. Mais je n'étais pas content parce que j'avais deux copies de la documentation locale. Et j'ai décidé de créer une branche vide et après la propagation j'ai commuté pour vider et supprimer les fichiers. Mais revenir en arrière est une longue opération - donc j'ai posé cette question.

je sais que je peux simplement laisser sur la branche gh-pages et supprimer des fichiers, mais je n'aime pas les arbres de travail sales)

70
demandé sur Zoe 2009-08-15 23:32:01
la source

9 ответов

Oui, vous pouvez le faire.

git symbolic-ref HEAD refs/heads/otherbranch

si vous devez vous engager sur cette branche, vous voudrez réinitialiser l'index trop sinon vous finirez par commettre quelque chose basé sur la dernière branche cochée.

git reset
79
répondu CB Bailey 2009-08-16 01:29:30
la source

utilisant uniquement les commandes git de base:

cette réponse est un peu plus longue que celle de Charles, mais elle se compose uniquement de commandes git de base que je peux comprendre et donc me souvenir, éliminant la nécessité de continuer à la chercher.

Marquer votre emplacement actuel (commettre d'abord si nécessaire):

git checkout -b temp

réinitialiser (déplacer) le marqueur à l'autre branche sans changer le dir de travail:

git reset <branch where you want to go>

maintenant temp et d'autres branches pointent vers le même commit, et votre dir de travail est intact.

git checkout <branch where you want to go>

puisque votre tête pointe déjà vers le même commit, dir 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.

29
répondu 2016-07-15 01:23:36
la source

ne serait-il pas une meilleure solution pour avoir deux répertoires de travail (deux zones de travail) avec un dépôt, ou même deux dépôts?

Il y a git-nouvelle-workdir outil contrib/ de cet article pour vous aider avec ceci.

14
répondu Jakub Narębski 2009-08-16 12:54:36
la source

Pour le bénéfice du lecteur:

bien que je pense que la solution de Charles Bailey est correcte, Cette solution a besoin d'un tweak lorsque l'on passe à quelque chose, qui n'est pas une branche locale. Aussi il devrait y avoir une façon de faire avec les commandes qui est facile à comprendre. Voici ce que j'ai trouvé:

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

expliquée:

  • git checkout --detach est le identique à git checkout HEAD^{} qui laisse la branche actuelle derrière et va dans"l'état de tête détaché". Ainsi la prochaine modification de HEAD n'affecte plus aucune branche. Le fait de détacher HEAD n'affecte ni la worktree ni l'index.
  • git reset --soft commitish puis déplace HEAD vers la SHA de la donnée commitish . Si vous voulez mettre à jour l'index, aussi, laissez --soft loin, mais je ne recommande pas de le faire. Ceci, encore une fois, ne touche pas la worktree, et ( --soft ) pas l'indice.
  • git checkout commitish puis attache HEAD à la donnée commitish (branche) à nouveau. (Si commitish est un SHA rien se passe.) Cela non plus n'affecte pas index ni worktree.

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

cela conduit à la suite de git switch treeish alias:

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

POUR INFORMATION, Vous pouvez le trouver dans ma liste de git alias .

9
répondu Tino 2017-07-12 17:18:16
la source

vous pouvez écraser votre fichier principal avec un nom de branche différent:

echo "réf: refs/heads/MyOtherBranch" > .git / HEAD

8
répondu user157005 2009-08-15 23:55:05
la source

je pense que vous cherchez le commandement de la plomberie git read-tree . Ceci mettra à jour l'index mais ne mettra pas à jour les fichiers de votre répertoire de travail. Par exemple, en supposant que branch est le nom de la succursale à lire:

git read-tree branch

si vous voulez ensuite vous engager à la branche que vous venez de lire, vous aurez également besoin de:

git symbolic-ref HEAD refs/heads/branch
8
répondu Greg Hewgill 2009-08-16 01:39:35
la source

avec autant de dossiers, il est peut-être préférable de simplement garder deux repos, un pour chaque branche. Vous pouvez extraire les modifications dès que nécessaire. Cela va être moins surprenant que d'essayer de jouer le scorbut astuces avec git.

0
répondu Norman Ramsey 2009-08-16 02:15:49
la source

si vous êtes simplement en train d'essayer de changer où une branche distante pointe, 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 est un plus + optionnel, suivi de la source ref , suivi de deux points :, suivi de la destination ref . Il est utilisé pour spécifier avec quel objet < src> la réf dans le dépôt distant doit être mise à jour.

par exemple, pour mettre à jour foo de commettre c5f7eba procédez de la manière suivante:

git push origin c5f7eba:foo

Je ne sais pas si c'est ce que vous vouliez ou non.

0
répondu Tim Abell 2010-02-04 19:16:20
la source

vous pouvez utiliser

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

précédent-branche-commit-id est la validation de l'endroit où vous voulez copier les anciennes données.

0
répondu Haseena Parkar 2017-02-22 08:22:11
la source

Autres questions sur git git-checkout branch