Tout en aidant un ami avec un problème git aujourd'hui, j'ai dû introduire une branche qui devait être totalement séparée de la master
branche. Le contenu de cette branche avait vraiment une origine différente de ce qui avait été développé sur la master
branche, mais ils allaient être fusionnés dans la master
branche ultérieurement.
Je me suis souvenu de la lecture de Git de John Wiegley de bas en haut comment les branches sont essentiellement une étiquette pour un commit qui suit une certaine convention et comment un commit est lié à une arborescence de fichiers et, éventuellement, aux commit parents. Nous sommes allés créer un commit sans parent dans le dépôt existant en utilisant la plomberie de git:
Nous nous sommes donc débarrassés de tous les fichiers de l'index ...
$ git rm -rf .
... extrait les répertoires et fichiers d'une archive tar, ajouté ceux-ci à l'index ...
$ git add .
... et créé un objet arbre ...
$ git write-tree
( git-write-tree
nous a indiqué le sha1sum de l'objet arbre créé.)
Ensuite, nous avons validé l'arborescence, sans spécifier les validations parentales ...
$ echo "Imported project foo" | git commit-tree $TREE
( git-commit-tree
nous a indiqué le sha1sum de l'objet commit créé.)
... et créé une nouvelle branche qui pointe vers notre commit nouvellement créé.
$ git update-ref refs/heads/other-branch $COMMIT
Enfin, nous sommes retournés à la master
succursale pour continuer à travailler là-bas.
$ git checkout -f master
Cela semble avoir fonctionné comme prévu. Mais ce n'est clairement pas le genre de procédure que je recommanderais à quelqu'un qui commence tout juste à utiliser git, c'est un euphémisme. Existe-t-il un moyen plus simple de créer une nouvelle branche sans aucun rapport avec tout ce qui s'est passé dans le référentiel jusqu'à présent?
( git checkout master && git merge --no-commit "orphan-branch" )
Certaines astuces similaires fonctionneront en utilisant git-reset ou en jouant avec l'index. Mais cela dépend de votre flux de travail souhaité.--no-commit
ongit merge
y parviendra. Vous devrez peut-être effectuer un suivigit reset origin/master
pour que votre prochain commit se rend où vous le souhaitez, mais les fichiers de votre branche orpheline apparaîtront comme des "fichiers non suivis", sauf si vous les incluez également dans votre fichier .gitignore.De Git Community Book :
la source
rm .git/index
est moche :-)Bien que la solution avec
git symbolic-ref
et suppression de l'index fonctionne, il peut être conceptuellement plus propre de créer un nouveau référentielpuis en chercher
Vous pouvez maintenant supprimer / chemin / vers / sans rapport
la source
git branch
ougit checkout
. Je suis content que git rend ce genre de choses possible, mais pourquoi ne serait-il pas plus facile?git branch
et basculer entre elles viagit checkout BRANCH_NAME
.Github a une fonctionnalité appelée Pages de projet où vous pouvez créer une branche nommée particulière dans votre projet pour fournir des fichiers qui seront servis par Github. Leurs instructions sont les suivantes:
De là, vous avez un référentiel vide auquel vous pouvez ensuite ajouter votre nouveau contenu.
la source
La réponse actuellement sélectionnée est correcte, je voudrais juste ajouter que par coïncidence ...
C'est en fait exactement comment github.com permet aux utilisateurs de créer des pages Github pour leurs dépôts, via une branche orpheline appelée
gh-pages
. Les jolies étapes sont données et expliquées ici:https://help.github.com/articles/creating-project-pages-manually
Fondamentalement, les commandes git pour configurer cela sont les suivantes:
git checkout --orphan gh-pages
(créez une branche sans parents appelée gh-pages sur votre repo)git rm -rf .
(supprime tous les fichiers de l'arborescence de travail de la branche)rm '.gitignore'
(même le gitignore)Notez que vous pouvez également désigner un dossier / docs sur votre référentiel pour être la source du «site du projet» que Github utilise pour créer le site Web.
J'espère que cela t'aides!
la source
Parfois, je veux juste créer une branche vide dans le projet instantanément, puis commencer à travailler, je vais simplement exécuter la commande suivante:
la source
Si votre contenu existant a déjà été validé, vous pouvez maintenant (Git 2.18 Q2 2018) l'extraire dans sa propre nouvelle branche orpheline, car l'implémentation de "
git rebase -i --root
" a été mise à jour pour utiliser davantage la machinerie du séquenceur.Ce séquenceur est celui qui permet maintenant de transplanter toute la topologie du graphe de validation ailleurs .
Voir commit 8fa6eea , commit 9c85a1c , commit ebddf39 , commit 21d0764 , commit d87d48b , commit ba97aea (03 mai 2018) par Johannes Schindelin (
dscho
) .(Fusionné par Junio C Hamano -
gitster
- en commit c5aa4bc , 30 mai 2018)la source
J'ai trouvé ce script sur http://wingolog.org/archives/2008/10/14/merging-in-unrelated-git-branches et cela fonctionne très bien!
la source
git fetch $REMOTE $REMOTE_BRANCH:$LOCAL_BRANCH
. Suis-je en train de manquer quelque chose?Dans les versions récentes de Git, 2.27 au moins, cela peut être réalisé en utilisant la
switch
commande:Documentation officielle: https://www.git-scm.com/docs/git-switch
la source