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.
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
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.
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.
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 .
Je pense que vous recherchez la commande de plomberie Si vous souhaitez ensuite vous engager dans la branche que vous venez de lire, vous devrez également:git read-tree
git symbolic-ref HEAD références/têtes/branches
Vous pouvez écraser votre fichier HEAD avec un nom de branche différent:
echo "ref: refs/heads/MyOtherBranch"> .git/HEAD
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.
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.
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.