web-dev-qa-db-fra.com

Comment annuler le commit initial de git?

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?

253
Chau Chee Yang

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.

408
CB Bailey

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
41
frazras

Dans les conditions stipulées dans la question:

  • Le commit est le premier commit du référentiel.
  • Ce qui signifie que très peu de commandes ont été exécutées:
    • un git init,
    • probablement certaines opérations git add,
    • et un git commit,
    • et c'est tout!

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é.

9
Jonathan Leffler

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:

  1. Vous avez un seul commit sur votre branche master
  2. Il n'y a pas de branche appelée old_master donc je suis libre d'utiliser ce nom

Il 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.

9
nonsensickle

Tu ne peux pas. Alors:

rm -rf .git/
git init
git add -A
git commit -m 'Your new commit message'
3
ma11hew28

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.

0
edward

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.

0
damkrat

Tout ce que vous avez à faire est d’annuler le commit.

git revert {commit_id}'

Puis poussez

git Push Origin -f
0
abdallah Nofal