Création d'une nouvelle branche vide pour un nouveau projet

351

Nous utilisons un référentiel git pour stocker notre projet. Nous avons nos succursales au départ de la succursale d'origine. Mais maintenant, nous voulons créer un petit nouveau projet pour suivre la documentation. Pour cela, nous voudrions créer une nouvelle branche vide pour commencer à stocker nos fichiers, et je voudrais que d'autres utilisateurs du réseau clonent cette branche.

Comment pouvons-nous faire cela?

J'ai essayé certaines choses, mais elles n'ont pas fonctionné.

$ mkdir proj_doc; cd proj_doc
$ git init
$ git add .
$ git commit -m 'first commit'
$ git br proj_doc
$ git co proj_doc
$ git br -d master
$ git push origin proj_doc

Cela semble pousser la branche ok, mais quand je fais une extraction ou une extraction, elle télécharge des informations à partir d'autres branches, puis j'obtiens également des fichiers supplémentaires à partir d'autres projets. Quelle est la meilleure solution?

fazineroso
la source
11
Pourquoi avez-vous besoin de stocker cela dans une succursale? Les branches correspondent généralement à certains écarts par rapport à la même base de code. Peut-être que le démarrage d'un nouveau référentiel serait une meilleure solution.
Benjamin Bannier
2
Eh bien, nous l'avons fait avant, IIRC, et j'aimerais le refaire, donc je suis curieux;)
fazineroso
3
"pour un nouveau projet" - En tant que @honk, je suggère de le mettre dans un nouveau référentiel. Deux options à partir de là pour les intégrer. Faites-en un submoduledans le projet d'origine, par exemple en docs/pointant vers cet autre dépôt. Ou, si vous souhaitez fusionner le code ultérieurement, ajoutez-le en tant que télécommande.
gertvdijk
1
Un autre inconvénient de l' approche orpheline est que vous devez conserver vos .gitignorefichiers et également basculer constamment entre les deux racines (branches). Je suis donc également pour la nouvelle approche repo, dans un nouveau dossier, ayant les mêmes télécommandes et poussant vers une autre branche.
simo

Réponses:

666

Vous pouvez créer une branche en tant qu'orphelin:

git checkout --orphan <branchname>

Cela va créer une nouvelle branche sans parents. Ensuite, vous pouvez effacer le répertoire de travail avec:

git rm --cached -r .

et ajoutez les fichiers de documentation, validez-les et poussez-les vers github.

Un pull ou fetch mettra toujours à jour les informations locales sur toutes les branches distantes. Si vous souhaitez uniquement extraire / récupérer les informations d'une seule branche distante, vous devez le spécifier.

Hiery Nomus
la source
18
Bonne réponse, mais c'est un peu ennuyeux que la nouvelle branche démarre avec tous les fichiers (de la branche précédente) mis en scène.
Matt Fenwick
12
Lors de l'émission git checkout --orphan <branch>; Je ne vois aucune liste de <branch> dans git branch.
Santosh Kumar
51
Après git checkout --orphanon peut utiliser git reset --hardpour supprimer les fichiers restants.
Ilya Kozhevnikov
16
La raison pour laquelle vous ne voyez pas la branche après git checkout --orphan <branch>est parce qu'elle n'a pas encore de commit. Après le premier commit git branchimprime la nouvelle branche.
Krøllebølle
13
git clean -fd supprime les fichiers non suivis.
stefgosselin
71

La bonne réponse est de créer une branche orpheline. J'explique comment faire cela en détail sur mon blog. (Lien archivé)

...

Avant de commencer, passez à la dernière version de GIT. Pour vous assurer que vous exécutez la dernière version, exécutez

which git

S'il crache une ancienne version, vous devrez peut-être augmenter votre PATH avec le dossier contenant la version que vous venez d'installer.

D'accord, nous sommes prêts. Après avoir fait un cd dans le dossier contenant votre git checkout, créez une branche orpheline. Pour cet exemple, je nommerai la branche «mybranch».

git checkout --orphan mybranch

Supprimer tout dans la branche orpheline

git rm -rf .

Apportez quelques modifications

vi README.txt

Ajouter et valider les modifications

git add README.txt
git commit -m "Adding readme file"

C'est ça. Si vous courez

git log

vous remarquerez que l'historique des validations commence à zéro. Pour revenir à votre branche principale, exécutez simplement

git checkout master

Vous pouvez retourner dans la branche orpheline en exécutant

git checkout mybranch
Sid Jain
la source
16
Les réponses en lien uniquement ne sont pas encouragées. Si le lien est déplacé ou supprimé, votre réponse devient sans valeur. Pensez à ajouter des pièces essentielles directement dans cette réponse. Portez une attention particulière aux problèmes non couverts par les réponses précédentes.
bytebuster
3
Le lien n'est plus valide, malheureusement.
Alexey
1
Les archives sont une chose merveilleuse.
lucid_dreamer
3
Il est DANGEREUX de simplement supprimer tout dans le répertoire de travail, car tout projet non trivial aura des fichiers non suivis (configuration, environnement, cache, etc.).
Slava Fomin II
12

Créez une nouvelle branche vide comme ceci:

true | git mktree | xargs git commit-tree | xargs git branch proj-doc

Si vos fichiers proj-doc sont déjà dans un commit sous un seul sous-répertoire, vous pouvez créer la nouvelle branche de cette façon:

git commit-tree thatcommit:path/to/dir | xargs git branch proj-doc

qui pourrait être plus pratique que git branch --orphansi cela vous laisse avec beaucoup de git rmet git mving à faire.

Essayer

git branch --set-upstream proj-doc origin/proj-doc

et voyez si cela vous aide à résoudre votre problème de récupération. De plus, si vous ne voulez vraiment récupérer qu'une seule branche, il est plus sûr de simplement la spécifier sur la ligne de commande.

jthill
la source
1
Cette réponse est intéressante car elle vous permet de démarrer une autre branche / racine avec un premier commit totalement vide.
Stéphane Gourichon
Une autre façon de créer une branche vide si cela ne vous dérange pas de passer à elle estgit checkout --orphan new-branch; git reset --hard
jthill
À quoi sert le xargs?
Flux
@Flux, c'est juste une autre façon d'obtenir l'ID de l'arborescence sous la forme d'un argument d'arbre de validation.
14h14
J'aime vraiment cette approche, car cela permet de créer une nouvelle branche vide, sans quitter votre branche actuelle, plus ce fait, il y a un commit vide comme point de départ.
Brice
8

Si votre version git n'a pas l'option --orphan, cette méthode doit être utilisée:

git symbolic-ref HEAD refs/heads/<newbranch> 
rm .git/index 
git clean -fdx 

Après avoir fait du travail:

git add -A
git commit -m <message>
git push origin <newbranch>
cyb0k
la source
2
Attention, vous git cleanpouvez supprimer des fichiers que vous ne souhaitez pas supprimer! Exécutez d' git clean -ndxabord pour voir quels fichiers il supprimera avant de l'exécuter pour de vrai avec l' -foption.
Lassi
7

Disons que vous avez une masterbranche avec des fichiers / répertoires:

> git branch  
master
> ls -la # (files and dirs which you may keep in master)
.git
directory1
directory2
file_1
..
file_n

Étape par étape, comment créer une branche vide:

  1. git checkout —orphan new_branch_name
  2. Assurez-vous que vous êtes dans le bon répertoire avant d'exécuter la commande suivante:
    ls -la |awk '{print $9}' |grep -v git |xargs -I _ rm -rf ./_
  3. git rm -rf .
  4. touch new_file
  5. git add new_file
  6. git commit -m 'added first file in the new branch'
  7. git push origin new_branch_name

À l'étape 2, nous supprimons simplement tous les fichiers localement pour éviter toute confusion avec les fichiers de votre nouvelle branche et ceux que vous gardez en masterbranche. Ensuite, nous dissocions tous ces fichiers à l'étape 3. Enfin, les étapes 4 et suivantes fonctionnent avec notre nouvelle branche vide.

Une fois que vous avez terminé, vous pouvez facilement basculer entre vos succursales:

git checkout master 
git checkout new_branch
user1723157
la source
1

Sur la base de cette réponse de Hiery Nomus .

Vous pouvez créer une branche en tant qu'orphelin:

git checkout --orphan <branchname>

Cela va créer une nouvelle branche sans parents. Ensuite, vous pouvez effacer le répertoire de travail avec:

git rm --cached -r .

Et puis vous validez simplement la branche avec un commit vide, puis poussez

git commit -m <commit message> --allow-empty
git push origin <newbranch>
Doublure
la source
1

Consultez cette documentation , elle contient des détails clairs sur

--orphan <new_branch>
Créez une nouvelle branche orpheline, nommée <new_branch>, à partir de <start_point>et basculez vers celle-ci. Le premier commit effectué sur cette nouvelle branche n'aura pas de parents et ce sera la racine d'une nouvelle histoire totalement déconnectée de toutes les autres branches et commits.

L'index et l'arborescence de travail sont ajustés comme si vous aviez précédemment exécuté git checkout. Cela vous permet de démarrer un nouvel historique qui enregistre un ensemble de chemins similaires à en exécutant facilement git commit -a pour valider la racine.

Kamal Hossain
la source
1
Un lien vers une solution est le bienvenu, mais assurez-vous que votre réponse est utile sans elle: ajoutez du contexte autour du lien pour que vos collègues aient une idée de ce que c'est et pourquoi il est là, puis citez la partie la plus pertinente de la page que vous '' relier à au cas où la page cible n'est pas disponible. Les réponses qui ne sont guère plus qu'un lien peuvent être supprimées.
Yunnosch
1

j'ai trouvé cette aide:

git checkout --orphan empty.branch.name
git rm --cached -r .
echo "init empty branch" > README.md
git add README.md
git commit -m "init empty branch"
齐 化 恒
la source