Je m'engage dans un dépôt git pour la première fois; Je regrette alors le commit et souhaite le rétablir. J'essaie
# git reset --hard HEAD~1
Je reçois ce message:
fatal: ambiguous argument 'HEAD~1': unknown revision or path not in the working tree.
Ce commit est le premier commit du référentiel. Avez-vous une idée de comment annuler le commit initial de git?
Vous devez simplement supprimer la branche sur laquelle vous vous trouvez. Vous ne pouvez pas utiliser git branch -D
car cela comporte un contrôle de sécurité. Vous pouvez utiliser update-ref
pour le faire.
git update-ref -d HEAD
Faites pas utilisez rm -rf .git
ou quelque chose du genre, car cela effacera complètement votre référentiel entier, y compris toutes les autres branches, ainsi que la branche que vous essayez de réinitialiser.
Vous pouvez supprimer le HEAD et restaurer votre référentiel dans un nouvel état, dans lequel vous pouvez créer un nouveau commit initial:
git update-ref -d HEAD
Après avoir créé un nouveau commit, si vous avez déjà poussé sur remote, vous devrez le forcer sur le remote pour écraser le commit initial précédent:
git Push --force Origin
Dans les conditions stipulées dans la question:
git init
,git add
,git commit
,Si ces conditions préalables sont remplies, le moyen le plus simple d'annuler le commit initial serait:
rm -fr .git
depuis le répertoire où vous avez fait git init
. Vous pouvez ensuite refaire le git init
pour recréer le référentiel Git, refaire les ajouts avec les modifications jugées raisonnables que vous avez regrettées de ne pas avoir faites la première fois, et refaire le commit initial.
DANGER! Ceci supprime le répertoire du référentiel Git.
Il supprime le répertoire du référentiel Git de façon permanente et irrécupérable, sauf si vous avez des sauvegardes quelque part. Dans les conditions préalables, vous ne souhaitez rien conserver dans le référentiel, vous ne perdez donc rien. Tous les fichiers que vous avez ajoutés sont toujours disponibles dans les répertoires de travail, en supposant que vous ne les ayez pas encore modifiés, ni supprimés, etc. Toutefois, cela n’est sécurisé que si vous n’avez rien d’autre dans votre référentiel. Dans les circonstances décrites dans la question "Commencez le dépôt du référentiel - alors, regrettez-le", il est sécurisé. Très souvent, cependant, ce n'est pas sûr.
Ceci est également sûr pour supprimer un référentiel cloné indésirable; cela n'endommage pas le référentiel à partir duquel il a été cloné. Cela jettera tout ce que vous avez fait dans votre copie, mais n'affectera pas le référentiel d'origine autrement.
Soyez prudent, mais c'est sûr et efficace lorsque les conditions préalables sont remplies.
Si vous souhaitez conserver d'autres éléments de votre référentiel, cette technique n'est pas appropriée. Votre référentiel ne remplit plus les conditions préalables pour que cela soit approprié.
Cette question était liée à cet article de blog et une solution alternative a été proposée pour les versions les plus récentes de Git:
git branch -m master old_master
git checkout --Orphan master
git branch -D old_master
Cette solution suppose que:
master
old_master
donc je suis libre d'utiliser ce nomIl renommera la branche existante en old_master
et créera une nouvelle branche orpheline master
(comme pour les nouveaux référentiels), après quoi vous pourrez supprimer ou non old_master
... Dépend de vous.
Remarque: le déplacement ou la copie d’une branche git conserve son identité (voir ce code ) lors de la suppression puis de la création d’une nouvelle branche. Étant donné que vous souhaitez revenir à l'état d'origine sans historique, vous souhaiterez probablement supprimer la branche, mais d'autres voudront peut-être prendre en compte cette petite note.
Tu ne peux pas. Alors:
rm -rf .git/
git init
git add -A
git commit -m 'Your new commit message'
Je vais ajouter ce qui a fonctionné pour moi à la fin. Je devais supprimer le commit initial sur un référentiel car les données en quarantaine avaient été égarées, le commit avait déjà été poussé.
Assurez-vous que vous êtes actuellement sur la bonne branche.
git checkout master
git update-ref -d HEAD
git commit -m "Initial commit
git Push -u Origin master
Cela a permis de résoudre le problème.
Important
Il s'agissait d'un référentiel interne qui n'était pas accessible publiquement. Si votre référentiel était accessible publiquement, supposez que tout ce que vous avez besoin de restaurer a déjà été retiré par quelqu'un d'autre.
git reset --hard faites les modifications, puis faites
git add -A
git commit --amend --no-edit
ou
git add -A
git commit --amend -m "commit_message"
et alors
git Push Origin master --force
--force réécrira le commit que vous avez restauré à la première étape. </ strike>
Ne faites pas cela, parce que vous êtes sur le point de vous opposer à l’idée même des systèmes VCS et de git en particulier. La seule bonne méthode consiste à créer une nouvelle branche et à la supprimer. Voir git help branch
pour plus d'informations.
Tout ce que vous avez à faire est d’annuler le commit.
git revert {commit_id}'
Puis poussez
git Push Origin -f