web-dev-qa-db-fra.com

Comment annuler le dépôt Git pour le premier engagement et supprimer tout l'historique

J'apprends à utiliser git ces temps-ci et j'ai dû faire de nombreuses tentatives. Il me fallait donc supprimer et recréer de nouveau mes dépôts à distance et locaux. Existe-t-il un moyen de revenir au premier commit du rapport et de supprimer tout l'historique par la suite? Fondamentalement, une ardoise propre à expérimenter.

16

Je ne connais aucun moyen de faire exactement ce que vous demandez (on peut revenir à la première validation, mais ne pas supprimer l'historique tout, car l'historique contiendra au moins cette validation initiale.)

Si j'étais vous, je supprimerais simplement le référentiel distant et le répertoire .git du référentiel local, puis recommencerais avec git init.

Le plus proche que je puisse obtenir de ce que vous demandez serait d'annuler tout sauf le premier commit. Pour ce faire, vous devez d'abord trouver le SHA1 du premier commit, par exemple:

% git rev-list --max-parents=0 --abbrev-commit HEAD
aa8119f

... et ensuite courir soit

% git reset aa8119f

...ou

% git reset --hard aa8119f

... selon que vous souhaitiez conserver ou rejeter toutes les modifications apportées depuis cette validation initiale. (Ce qui précède suppose que vous n’avez qu’une branche. Sinon, vous devrez également supprimer toutes les autres branches que vous avez avec git branch -d <BRANCHNAME>.)

Enfin, vous courriez

% git Push -f

(J'espère que vous réalisez que git Push -f est un non-non chaque fois que vous appuyez sur un dépôt partagé avec d'autres.)

Malheureusement, comme cela a déjà été expliqué, cette approche ne supprime pas l'historique tout.

Si c'est quelque chose que vous voudrez souvent faire, je vous recommanderais de lancer immédiatement après git init quelque chose comme:

% git commit --allow-empty --allow-empty-message -m ''
% git tag -a -m '' ROOT

Cela mettra un commit vide à la racine de votre historique et le balisera avec une balise nommée ROOT. Ensuite, vous pouvez faire quelque chose comme

% git reset ROOT

ou

% git reset --hard ROOT

pour vous ramener à ce premier commit vide.

Pour bien comprendre ce que git reset fait, je vous recommande de lire this .

27
kjo

Effacez simplement le répertoire .git une fois que votre premier commit a été extrait. En tant que tel:

git checkout <first-commit-sha>
rm -rf .git
git init
git add -A
git commit -m 'Initial Commit'
9
GoZoner

Vous pouvez réinitialiser le premier commit:

" Comment afficher le premier commit par 'git log'? " décrit comment trouver le premier commit:

git log --pretty=format:%H | tail -1

(fonctionne seulement s'il n'y a pas plusieurs branches racines)

git reset --hard yourFirstCommitSHA1

Notez qu'après la réinitialisation, pour vraiment obtenir une table rase, vous pouvez simplement git init un nouveau dépôt et copier le contenu de votre premier commit que vous venez de réinitialiser (et d'ajouter et commettre dans ce nouveau dépôt)

7
VonC

Pour effectuer une réinitialisation en mode minimal, vous souhaitez éliminer les journaux, les modifications de configuration et tout le reste. Pour ce faire, il suffit d'extraire la racine principale dans un nouveau référentiel:

git tag master-root $(git rev-list --topo-order master|sed '$!d')
git init ../reset-my-repo
cd ../reset-my-repo
git fetch $OLDPWD master-root
git checkout -B master FETCH_HEAD

(c'est-à-dire à peu près ce que VonC a dit )

(ajouté --topo-order pour se protéger contre les horodatages incorrects)

3
jthill

Vous pouvez certainement supprimer tout l'historique de la branche actuelle en utilisant:

git reset --hard <commit_id>

commit_id est sha1 d'un certain commit historique.

Cependant, cela est rarement nécessaire si vous apprenez et souhaitez expérimenter.

Au lieu de cela, vous pouvez simplement créer une nouvelle branche pour vos expériences, comme:

git branch experiment <commit_id>
git checkout experiment
...

Ce serait identique dans la plupart des cas à la première variante, mais vous pouvez revenir si vous le souhaitez.

Vous pouvez également renommer des branches, de sorte que vos expériences portent des noms de branche originaux, tels que:

git branch -m master backup
git branch master
git checkout master

Si vous voulez supprimer la branche backup, faites simplement:

git branch -D backup
0
mvp