Je voudrais définir une nouvelle branche "racine" dans ce dépôt git. Par branche "racine", j'entends une branche qui est entièrement indépendante de toutes les autres branches du référentiel 1 .
Malheureusement, même le commit (appelons-le A
) à la base même de l'arborescence de commit du dépôt contient beaucoup de fichiers (il s'agissait d'un dépôt initialisé sur un projet déjà assez mature).
Cela signifie que même si je donnais A
comme nouvelle branche <start-point>
, cette nouvelle branche ne partirait pas d'une "table rase", mais contiendrait plutôt tous les fichiers qui ont été validés A
.
Existe-t-il un moyen de créer une branche complètement nue dans ce référentiel, avec le <start-point>
plus près A
possible?
1 BTW, c'est n'équivaut pas à créer un nouveau repo. Des dépôts séparés seraient moins pratiques pour de nombreuses raisons.
EDIT : OK, c'est ce que j'ai fait, basé sur la réponse de vcsjones :
# 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 soit un peu compliquée, le résultat final est un commit de base vide qui peut servir de <start-point>
pour toute nouvelle "branche propre"; tout ce que je devrais faire alors c'est
git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD)
À l'avenir, je créerai toujours de nouveaux référentiels comme celui-ci:
git init
git commit --allow-empty -m 'base commit (empty)'
... pour que le premier commit soit vide , et toujours disponible pour démarrer une nouvelle branche indépendante. (Ce serait, je sais, une installation très rarement nécessaire, mais il est assez facile de la rendre facilement disponible.)
git rebase --onto
, voir stackoverflow.com/questions/645450/...Réponses:
Utilisez le
--orphan
lors de la création de la branche:Cela créera une nouvelle branche avec zéro commit, mais tous vos fichiers seront mis en scène. À ce stade, vous pouvez simplement les supprimer.
("les supprimer": A
git reset --hard
videra l'index, vous laissant avec un arbre de travail vide)Jetez un œil à page de manuel de vérification pour plus d'informations sur --orphan.
la source
Pour ajouter à la réponse acceptée, la meilleure pratique pour revenir à l'état propre est de créer un commit initial vide afin que vous puissiez facilement rebaser lors de la configuration de vos branches pour la postérité. De plus, puisque vous voulez un état propre, vous avez probablement des fichiers validés que vous ne devriez pas, vous devez donc les supprimer de l'index. Dans cet esprit, vous devriez:
la source
Si vous utilisez git 2.23 ou supérieur, vous pouvez être habitué à
git switch
et à lagit restore
place degit checkout
. Si tel est le cas, le drapeau est le même que celui mentionné dans cette réponse .la source
La commande réelle à utiliser (avec Git 2.28+) est:
git switch
est disponible à partir de Git 2.23 (août 2019) et remplace l' anciennegit checkout
commande déroutante .Mais je recommanderais Git 2.28 (Q3 2020), car
git switch --discard-changes --orphan
a été optimisé dans cette version.Voir commit 8d3e33d , commit 8186128 (21 mai 2020) par brian m. Carlson (
bk2204
) .(Fusionné par Junio C Hamano -
gitster
- dans commit ded44af , 09 juin 2020)Tester:
la source