Est-il possible dans Git de passer à une autre branche sans extraire tous les fichiers?
Après avoir changé de branche, je dois supprimer tous les fichiers, les régénérer, valider et revenir en arrière. Donc, extraire des fichiers n'est qu'une perte de temps (et il y a 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 la documentation sur GitHub.
J'ai un référentiel avec la branche gh-pages . Lorsque je reconstruis la documentation localement, je la copie dans le répertoire du référentiel, je la valide et la pousse sur 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 m'être engagé, passer à vide et supprimer des fichiers. Mais revenir en arrière est une longue opération - j'ai donc 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 sales.
Réponses:
Oui, vous pouvez le faire.
Si vous devez vous engager sur cette branche, vous voudrez également réinitialiser l'index, sinon vous finirez par commettre quelque chose en fonction de la dernière branche extraite.
la source
echo "ebff34ffb665de0694872dceabe0edeaf50ec5a9" > .git/HEAD
suivi degit reset
pour pointer vers une référence au lieu d'une branche.git update-ref HEAD refs/heads/otherbranch
git stash
2.git checkout -b otherBranch
3.git stash pop
git update-ref
est utile, mais il déplace également la pointe de la branche courante.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 souvenir, ce qui élimine le besoin de continuer à la chercher.
Marquez votre emplacement actuel (validez d'abord si nécessaire):
Réinitialisez (déplace) le marqueur vers l'autre branche sans changer de répertoire de travail:
maintenant temp et d'autres branches pointent vers le même commit, et votre répertoire de travail n'est pas touché.
puisque votre HEAD pointe déjà vers le même commit, le répertoire de travail n'est pas touché
Notez que ces commandes sont également facilement disponibles à partir de n'importe quel client graphique.
la source
git reset --soft <branch where you want to go>
éviter de mettre à jour l'indexPour le bénéfice du lecteur:
Bien que je pense que la solution de Charles Bailey est correcte, cette solution nécessite un ajustement lors du passage à quelque chose, qui n'est pas une branche locale. Il devrait également y avoir un moyen de le faire avec des commandes régulières faciles à comprendre. Voici ce que j'ai trouvé:
Expliqué:
git checkout --detach
est le même que celuigit checkout HEAD^{}
qui laisse la branche actuelle derrière et entre dans «l'état de tête détaché». Ainsi, la prochaine modification deHEAD
no plus n'affecte aucune branche. LeHEAD
détachement n'affecte ni l'arbre de travail ni l'index.git reset --soft commitish
puis passeHEAD
au SHA du donnécommitish
. Si vous souhaitez également mettre à jour l'index, laissez de--soft
côté, mais je ne recommande pas de le faire. Ceci, encore une fois, ne touche pas l'arbre de travail et (--soft
) pas l'index.git checkout commitish
puis s'attache à nouveauHEAD
à lacommitish
(branche) donnée . (Sicommitish
est un SHA, rien ne se passe.) Cela n'affecte pas non plus l'index ni l'arbre de travail.Cette solution accepte tout ce qui fait référence à un commit, c'est donc idéal pour certains
git
alias. Ce quirev-parse
suit est juste un test pour s'assurer que rien ne casse la chaîne, de sorte que les fautes de frappe ne passent pas accidentellement à l'état de tête détachée (la récupération d'erreur serait beaucoup plus complexe).Cela conduit à l'
git hop treeish
alias suivant :FYI, vous pouvez le trouver dans ma liste d'
git
alias .la source
$@
plutôt que$*
? La différence est que $ @ avec des arguments non développés entre guillemets, qui ont des espaces à l'intérieur.$@
n'est définitivement pas ici.$*
est utilisé à la place de$1
, de sorte que celagit switch -f b
devient le même quegit switch '-f b'
ce qui devrait être une erreur. De cette façon, je peux raccourcir l'alias en laissant de côté une gestion des erreurs comme!f() { [ 1 = $# ] || { echo 'WTF!'; return 1; }; ..
Ne serait-il pas une meilleure solution d'avoir deux répertoires de travail (deux zones de travail) avec un référentiel, voire deux référentiels?
Il existe un outil git-new-workdir dans la
contrib/
section pour vous aider.la source
git-new-worktree
script est antérieur à lagit worktree
sous-commande; cette commande n'était pas disponible lorsque la réponse a été écrite. Le script, par exemple, nécessite la prise en charge des liens symboliques; IMHO, il est préférable d'utiliser le support natif.Je pense que vous recherchez la commande de plomberie
git read-tree
. Cela mettra à jour l'index mais ne mettra à jour aucun fichier dans votre répertoire de travail. Par exemple, en supposant quebranch
le nom de la branche à lire est:Si vous souhaitez ensuite vous engager dans la branche que vous venez de lire, vous devrez également:
la source
read-tree
génère l'erreur:fatal: Not a valid object name branch
s'il n'y en avait pasgit switch branch
encoreVous pouvez écraser votre fichier HEAD avec un nom de branche différent:
echo "ref: refs / heads / MyOtherBranch"> .git / HEAD
la source
git symbolic-ref HEAD refs/heads/MyOtherBranch
kernel.org/pub/software/scm/git/docs/git-symbolic-ref.htmlgit symbolic-ref
?Avec autant de fichiers, il vaut peut-être mieux garder deux dépôts, un pour chaque branche. Vous pouvez extraire les modifications selon vos besoins. Cela va être moins surprenant que d'essayer de jouer des tours de scorbut avec git.
la source
git-new-worktree
pour cela à la place (incontrib/
)Si vous essayez simplement de changer où pointe 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
Par exemple, pour mettre à jour foo pour valider c5f7eba, procédez comme suit:
Je ne sais pas si c'est ce que vous recherchiez ou non.
la source
vous pouvez utiliser
previous-branch-commit-id est le commit à partir duquel vous voulez copier les anciennes données.
la source
Ou utilisez simplement un fichier de patch pour patcher de votre autre branche à votre maître
la source
disons que vous voulez être dans la branche A, mais avec les fichiers de la branche B
trouver le commit ref actuel de la branche A avec git log, par exemple "99ce9a2",
vous devriez maintenant être sur la branche A, avec une structure de dossiers correspondant à B, qui apparaissent comme des changements non étagés (un historique n'a pas changé).
la source