402 votes

Dans git, existe-t-il un moyen simple d'introduire une branche sans rapport avec un dépôt ?

En aidant un ami à résoudre un problème de git aujourd'hui, j'ai du introduire une qui devait être totalement séparée de la branche master branche. Le contenu de cette branche avait réellement une origine différente de ce qui avait été développé sur le master mais ils allaient être fusionnés dans la master à un moment ultérieur.

Je me suis souvenu en lisant le livre de John Wiegley Git de bas en haut haut comment les branches sont essentiellement une étiquette pour un commit qui suit une certaine convention. convention et comment un commit est lié à une arborescence de fichiers et, optionnellement à des commits parents. Nous sommes allés créer un commit sans parent dans le dépôt existant en utilisant la plomberie de Git :

Donc, nous nous sommes débarrassés de tous les fichiers dans l'index ...

$ git rm -rf .

... extrait des répertoires et des fichiers d'une archive, les ajoute à l'index 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 commis l'arbre, sans spécifier les commits parents ...

$ 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 nouveau nouvellement créée.

$ git update-ref refs/heads/other-branch $COMMIT

Enfin, nous sommes retournés à la master pour continuer à y travailler.

$ 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 juste à utiliser l'utilisation de git, et c'est un euphémisme. Y a-t-il un moyen plus facile de créer une nouvelle branche qui n'est pas du tout liée à tout ce qui s'est passé dans le référentiel jusqu'à présent ?

594voto

tcovo Points 3290

Il y a une nouvelle fonctionnalité (depuis la V1.7.2) qui rend cette tâche un peu plus élevée que ce que l'on trouve dans les autres réponses.

git checkout prend désormais en charge le --orphan option. À partir de l'écran page de manuel :

git checkout [-q] [-f] [-m] --orphan <new_branch> [<start_point>]

Créer un nouveau orphelin branche, nommée <nouvelle_branche>, démarrée à partir de <start_point> et y passer. L'adresse premier commit effectué sur cette nouvelle branche n'aura pas de parents et il sera la racine d'un nouvel historique totalement totalement déconnectée de toutes les autres branches et commits.

Cela ne fait pas exactement ce que le demandeur voulait, parce qu'il remplit l'index et l'arbre de travail à partir de la base de données de l'entreprise. <start_point> (puisqu'il s'agit, après tout, d'une commande de sortie). La seule autre action nécessaire est de supprimer tous les éléments indésirables de l'arbre de travail et de l'index. Malheureusement, git reset --hard ne fonctionne pas, mais git rm -rf . peut être utilisé à la place (je crois que c'est équivalent à rm .git/index; git clean -fdx données dans d'autres réponses).


En résumé :

git checkout --orphan newbranch
git rm -rf .
<do work>
git add your files
git commit -m 'Initial commit'

J'ai laissé <start_point> non spécifié car il prend par défaut la valeur HEAD, et nous ne nous en soucions pas vraiment de toute façon. Cette séquence fait essentiellement la même chose que la séquence de commandes de la section Réponse d'Artem mais sans avoir recours à des commandes de plomberie effrayantes.

0 votes

Savez-vous s'il est possible de créer une branche orpheline qui reste visible lorsque vous éjectez une branche de l'autre "arbre" ?

1 votes

@JJD : Je pense que ce que vous voulez est git merge. ( git checkout master && git merge --no-commit "orphan-branch" ) Des astuces similaires fonctionneront en utilisant git-reset ou en jouant avec l'index. Mais cela dépend du flux de travail que vous souhaitez.

0 votes

36voto

Artem Tikhomirov Points 4501

De Livre de la communauté Git :

git symbolic-ref HEAD refs/heads/newbranch 
rm .git/index 
git clean -fdx 
<do work> 
git add your files 
git commit -m 'Initial commit'

1 votes

La réponse suivante est meilleure pour les versions modernes de git.

22 votes

@kikito : Re : "La réponse suivante est meilleure" ... La commande ici sur SO n'est pas stable. Pourriez-vous ajouter un lien pointant vers ce que vous pensez être une meilleure réponse.

2 votes

Je faisais référence à stackoverflow.com/a/4288660/312586 . Vous avez raison, je n'aurais pas dû dire "suivant". Elle avait moins de points que cette réponse quand j'ai commenté.

32voto

Jakub Narębski Points 87537

Bien que la solution avec git symbolic-ref et la suppression de l'index fonctionne, il se peut que conceptuellement plus propre pour créer nouveau dépôt

$ cd /path/to/unrelated
$ git init
[edit and add files]
$ git add .
$ git commit -m "Initial commit of unrelated"
[master (root-commit) 2a665f6] Initial commit of unrelated
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 foo

puis récupérez-le

$ cd /path/to/repo
$ git fetch /path/to/unrelated master:unrelated-branch
warning: no common commits
remote: Counting objects: 3, done.
Unpacking objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
From /path/to/unrelated
 * [new branch]      master     -> unrelated-branch

Maintenant vous pouvez supprimer /path/to/unrelated

1 votes

À mon avis, un concept propre impliquerait une option pour git branch ou git checkout . Je suis heureux que git rende ce genre de choses possible, mais pourquoi cela ne devrait-il pas être plus facile ?

4 votes

Parce que c'est, et devrait être, une chose rare. Si vous avez une branche sans rapport, elle appartient généralement à un dépôt sans rapport, au lieu de la fourrer dans un dépôt existant (bien qu'il y ait des exceptions).

2 votes

+1. Pour les autres novices de git, vous pouvez apparemment lister les branches via git branch et passer de l'un à l'autre via git checkout BRANCH_NAME .

21voto

unknownprotocol Points 195

La réponse actuellement sélectionnée est correcte, je voudrais juste ajouter que par coïncidence...

C'est en fait exactement la façon dont github.com permet aux utilisateurs de créer des pages Github pour leurs dépôts, par le biais d'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

En gros, les commandes git pour mettre en place ce système sont les suivantes :

  1. git checkout --orphan gh-pages (créer une branche sans parent appelée gh-pages sur votre dépôt)
  2. git rm -rf . (supprime tous les fichiers de l'arbre de travail de la branche)
  3. rm '.gitignore' (même le gitignore)
  4. Maintenant, ajoutez le contenu du site web (ajoutez index.html, etc) et faites un commit et un push.
  5. Profit.

Notez que vous pouvez également désigner un dossier /docs sur votre repo pour être la source du "site du projet" que Github utilise pour construire le site web.

J'espère que cela vous aidera !

13voto

Greg Hewgill Points 356191

Github a une fonction appelée Pages du projet où vous pouvez créer une branche particulière nommée dans votre projet pour fournir des fichiers qui seront servis par Github. Leurs instructions sont les suivantes :

$ cd /path/to/fancypants
$ git symbolic-ref HEAD refs/heads/gh-pages
$ rm .git/index
$ git clean -fdx

À partir de là, vous disposez d'un référentiel vide auquel vous pouvez ensuite ajouter votre nouveau contenu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X