2010-08-08 2 views
7

Supposons que nous avons un dépôt et 5 commits:Est-il possible de révoquer les commits?

  • commettras 1
  • commettras 2
  • commettras 3
  • commettras 4
  • commettras 5

Et maintenant, je me rends compte engage 4 et 5 sont une mauvaise idée. Je veux supprimer complètement toutes les modifications validées dans le commit 4 et 5. Comment le faire?

+0

J'irais avec revenir si vous avez poussé vers un référentiel public. sinon les autres options sont bien. – xenoterracide

Répondre

4

git revert commit_hash

Il Revient donné commettras. Notez que revert est un autre commit qui ignore les modifications de commit_hash, et ne supprime pas la validation donnée du dépôt.

3

Je serais probablement créer une nouvelle branche de commettre 3.

git checkout -b commit3 

puis maître de rebasage qui commettent

http://git-scm.com/docs/git-rebase

bien sûr, vous utilisez des branches de sujet pour garder votre branches de dev séparer jusqu'à ce que vous sachiez qu'ils sont une bonne idée, non?

6

Si engage 4 et 5 sont dans votre dépôt seulement et n'ont pas été poussé ou tiré par un autre dépôt, vous pouvez simplement:

git reset --hard SHA1_HASH_OF_COMMIT_3

Vous peut trouver le hachage SHA1 d'un commit en utilisant git log ou vous pouvez utiliser des techniques de dénomination plus avancées, voir git help rev-parse en particulier la section 'SPECIFYING REVISIONS'.

L'utilisation de cette commande laissera les commits 4 et 5 inaccessibles à partir de la pointe de la branche. Les commits ne seront toutefois pas perdus, car ces commits sont conservés dans la refonte de la branche. Vous pouvez utiliser git reflog pour identifier une validation inaccessible. La restauration peut alors être effectuée avec une autre git reset --hard. Cette page here décrit tout cela plutôt bien. Il est recommandé de lancer régulièrement git gc. certaines commandes le font aussi pour vous automatiquement. Cela effectue essentiellement une gestion interne sur le référentiel, par exemple "compresser les révisions de fichiers (pour réduire l'espace disque et augmenter les performances) et supprimer les objets inaccessibles". Les objets inaccessibles sont supprimés du référentiel après (par défaut) 30 jours. Cela peut être modifié en utilisant l'option de configuration gc.reflogExpireUnreachable.

+0

"jusqu'à ce que vous exécutiez' git gc' "est trompeur - il s'auto invoque automatiquement, et l'utilisateur n'a généralement jamais besoin de l'exécuter. Le commit ne sera pas non plus considéré comme inaccessible tant qu'il est dans les reflogs, qui prennent 90 jours pour expirer. Même si vous supprimez la branche (et avec elle ses reflogs), la valeur par défaut est uniquement d'élaguer les objets de plus de 30 jours. Upshot: ça ne partira pas bientôt. – Cascabel

+0

@Jefromi Je suis d'accord, c'est trompeur. Toutes mes excuses pour une réponse assez rapide. J'ai mis à jour ma réponse avec un peu plus de détails. –

Questions connexes