191 votes

Comment créer une nouvelle (et vide!) Branche "racine"?

Je voudrais définir une nouvelle "racine" de la branche dans ce dépôt git. Par "racine" de la branche, je veux dire une branche qui est entièrement indépendante de toutes les autres branches dans le référentiel1.

Malheureusement, même le commit (appelons - A) à la base de l'opération commit arbre contient beaucoup de fichiers (ce qui était un référentiel qui a été initialisé sur une déjà assez de maturité du projet).

Cela signifie que même si j'ai donné l' A que la nouvelle branche de l' <start-point>, cette nouvelle direction ne serait pas démarrer à partir d'une "table rase", mais il contient tous les fichiers qui ont été commis en A.

Est-il possible que je peux créer complètement une branche nue dans ce référentiel, <start-point> comme près de A possible?


1BTW, c'est pas équivalent à la création d'un nouveau repo. Séparer repos serait moins pratique pour un tas de raisons.


EDIT: OK, c'est ce que j'ai fait, basé sur vcsjones' réponse:

# save rev of the current earliest commit
OLDBASE=$(git rev-list --max-parents=0 HEAD)

# create a new orphan branch and switch to it
git checkout --orphan newbranch
# make sure it's empty
git rm -rf .

# create a new empty commit in the new branch, and
# save its rev in NEWBASE
git commit --allow-empty -m 'base commit (empty)'
NEWBASE=$(git rev-list HEAD)

# specify $NEWBASE as the new parent for $OLDBASE, and
# run filter-branch on the original branch
echo "$OLDBASE $NEWBASE" > .git/info/grafts
git checkout master
git filter-branch

# NOTE: this assumes that the original repo had only one
# branch; if not, a git-filter-branch -f <branch> command
# need to be run for each additional branch.

rm .git/info/grafts

Bien que cette procédure est un peu impliqué, le résultat final est un vide de la base de commettre et qui peuvent servir de <start-point> pour tout nouveau "rase de la branche"; tout ce que j'avais besoin de faire est de

git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD)

Dans le futur, je vais toujours créer de nouveaux référentiels, comme ceci:

git init
git commit --allow-empty -m 'base commit (empty)'

...de sorte que le premier commit est vide, et toujours disponible pour le démarrage d'une nouvelle branche indépendante. (Ce serait, je le sais, très rarement besoin d'une installation, mais il est tout à fait sans effort de la rendre facilement accessible.)

290voto

vcsjones Points 51910

Utilisation du `` lors de la création de la branche :

Cela va créer une nouvelle branche avec zéro s’engage à ce sujet, mais tous vos fichiers seront organisées. À ce moment-là, vous pouvez supprimer juste eux.

Jetez un oeil à la page de manuel pour l’extraction pour plus d’informations sur--orphelin.

1voto

korCZis Points 197

Je préfère la solution suivante.

  • Créer une nouvelle branche à partir de la validation initiale (spécifiée par SHA)
  • Poussez nouvelle branche

Oui, attendez-vous à ce que votre commit initial soit vide ;-)

  # Show SHA of initial commit
 $ git rev-list HEAD | tail -n 1
 eae879bda573ea5d02573e5179307b84e6c333ec

 # Create new branch called 'loader' from commit with specified SHA
 $ git checkout -b loader eae879bda573ea5d02573e5179307b84e6c333ec

 # Push newly created branch as 'loader'
 $ git push origin loader
 Total 0 (delta 0), reused 0 (delta 0)
 To git@github.com:korczis/the-scratch.git
  * [new branch]      loader -> loader
 

Exemple Gist

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