Je voudrais savoir comment supprimer un commit.
Par delete
, je veux dire que c’est comme si je n’avais pas fait ce commit, et lorsque je ferai un Push dans le futur, mes modifications ne seront pas Push vers la branche distante.
Je lis git help, et je pense que la commande que je devrais utiliser est git reset --hard HEAD
. Est-ce correct?
Attention: git reset --hard
SUPPRIMERA VOS MODIFICATIONS DU REPERTOIRE DE TRAVAIL. Assurez-vous de cacher toutes les modifications locales que vous souhaitez conserver avant d'exécuter cette commande.
En supposant que vous soyez assis sur ce commit, alors cette commande le fera sauter ...
git reset --hard HEAD~1
Le HEAD~1
signifie le commit avant head.
Ou, vous pouvez regarder la sortie de git log
, trouver l'ID de validation du commit que vous souhaitez sauvegarder, puis procédez comme suit:
git reset --hard <sha1-commit-id>
Si vous l'avez déjà poussé, vous devrez faire une force Push pour vous en débarrasser ...
git Push Origin HEAD --force
Cependant , si d'autres l'ont fait, vous feriez mieux de créer une nouvelle branche. Parce que quand ils tireront, ça le fusionnera dans leur travail, et vous le ferez remonter à nouveau.
Si vous avez déjà poussé, il peut être préférable d'utiliser git revert
pour créer un commit "image miroir" qui annulera les modifications. Cependant, les deux commits seront dans le journal.
Pour votre information, git reset --hard HEAD
est idéal si vous souhaitez vous débarrasser de WORK IN PROGRESS. Cela vous ramènera au commit le plus récent et effacera toutes les modifications de votre arbre et index de travail.
Enfin, si vous avez besoin de trouver un commit que vous avez "supprimé", il est généralement présent dans git reflog
à moins que vous n'ayez collecté des ordures dans votre référentiel.
Si vous n'avez encore poussé la validation nulle part, vous pouvez utiliser git rebase -i
pour supprimer cette validation. Tout d’abord, déterminez la distance (approximative) de ce commit. Alors fais:
git rebase -i HEAD~N
Le ~N
signifie que le dernier changement de N
a été modifié (N
doit être un nombre, par exemple HEAD~10
). Ensuite, vous pouvez éditer le fichier que Git vous présente pour supprimer le commit en question. Lors de la sauvegarde de ce fichier, Git réécrira tous les commits suivants comme si celui que vous aviez supprimé n'existait pas.
Le Git Book a un bon { section sur le rebasement } avec des images et des exemples.
Soyez prudent avec cela, car si vous changez quelque chose que vous avez poussé ailleurs, une autre approche sera nécessaire à moins que vous ne envisagiez de pousser de force.
Une autre possibilité est l'une de mes commandes préférées personnelles:
git rebase -i <commit>~1
Ceci démarrera la base en mode interactif -i
juste avant le commit que vous voulez frapper. L'éditeur va commencer à lister tous les commits depuis lors. Supprimez la ligne contenant le commit que vous souhaitez effacer et enregistrez le fichier. Rebase fera le reste du travail, en supprimant uniquement ce commit et en relisant tous les autres dans le journal.
J'ajoute cette réponse car je ne vois pas pourquoi quelqu'un qui vient d'essayer de valider un travail voudrait supprimer tout ce travail à cause d'une erreur d'utilisation de Git!
Si vous souhaitez conserver votre travail et annuler simplement cette commande de commit (vous vous êtes fait prendre avant d'appuyer sur repo):
git reset --soft HEAD~1
N'utilisez pas l'option --hard sauf si vous souhaitez détruire votre travail en cours depuis le dernier commit.
Supprimer un commit entier
git rebase -p --onto SHA^ SHA
Évidemment, remplacez "SHA" par la référence dont vous souhaitez vous débarrasser. Le "^" dans cette commande est littéral.
Si vous n'avez pas publié les modifications, pour supprimer le dernier commit, vous pouvez le faire
$ git reset --hard HEAD^
(Notez que cela supprimerait également toutes les modifications non validées; utilisez-le avec précaution).
Si vous avez déjà publié une validation à supprimer, utilisez git revert
$ git revert HEAD
git reset --hard commitId
git Push <Origin> <branch> --force
PS: CommitId fait référence à celui sur lequel vous voulez revenir
Si vous souhaitez corriger votre dernier commit, vous pouvez annuler le commit et décomposer les fichiers qu'il contient en procédant comme suit:
git reset HEAD~1
Cela ramènera votre référentiel à son état avant que git ajoute les commandes qui ont stocké les fichiers. Vos modifications seront dans votre répertoire de travail. HEAD ~ 1 fait référence au commit sous la pointe actuelle de la branche.
Si vous souhaitez dégager des commits N, tout en conservant les modifications de code dans votre répertoire de travail:
git reset HEAD~N
Si vous souhaitez vous débarrasser de votre dernier commit et ne souhaitez pas conserver les modifications de code, vous pouvez effectuer une réinitialisation "matérielle".
git reset --hard HEAD~1
De même, si vous souhaitez ignorer les N derniers commits et ne pas conserver les modifications de code:
git reset --hard HEAD~N
Supposons que nous voulions supprimer les commits 2 et 4 du référentiel.
commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>
Remarque: Vous devez disposer de droits d’administrateur sur le référentiel puisque vous utilisez --hard
et -f
.
git checkout b3d92c5
Commander le dernier commit utilisable.git checkout -b repair
Créez une nouvelle branche sur laquelle travailler.git cherry-pick 77b9b82
exécuter à travers commit 3.git cherry-pick 2c6a45b
exécuter la validation 1.git checkout master
Master Checkout.git reset --hard b3d92c5
Réinitialiser le maître sur le dernier commit utilisable.git merge repair
Fusionner notre nouvelle branche sur le maître.git Push -f Origin master
Poussez maître dans le dépôt distant.Changer avec force l'histoire
En supposant que vous ne vouliez pas seulement supprimer le dernier commit, mais que vous vouliez supprimer des commits spécifiques des n derniers commits, allez avec
git rebase -i HEAD~<number of commits to go back>
, donc git rebase -i HEAD~5
si vous voulez voir les cinq derniers commits.
Ensuite, dans l'éditeur de texte, remplacez Word pick
par drop
à côté de chaque commit que vous souhaitez supprimer. Enregistrez et quittez l'éditeur. Voila!
Additively Change History
Essayez git revert <commit hash>
. Revert créera un nouveau commit qui annule le commit spécifié.
Pour supprimer dans une branche locale, utilisez
git reset --hard HEAD~1
Pour supprimer dans une branche distante, utilisez
git Push Origin HEAD --force
Voici une autre façon de faire ceci:
Vérifiez la branche que vous souhaitez rétablir, puis réinitialisez votre copie de travail locale sur le commit que vous souhaitez utiliser comme dernier en date sur le serveur distant (tout ce qui suivra sera répété). Pour ce faire, dans SourceTree, j'ai cliqué avec le bouton droit de la souris sur et sélectionné "Réinitialiser BRANCHNAME à ce commit". Je pense que la ligne de commande est la suivante:
git reset --hard COMMIT_ID
Comme vous venez de vérifier votre branche à distance, vous ne risquez pas de perdre des modifications locales. Mais cela les perdrait si vous le faisiez.
Ensuite, accédez au répertoire local de votre référentiel et exécutez cette commande:
git -c diff.mnemonicprefix=false -c core.quotepath=false \
Push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME
Cela effacera toutes les validations postérieures à celle en cours dans votre référentiel local mais uniquement pour cette branche.
L'erreur:
Je git rebase -i --root
'ed ma branche, pensant par ignorance que je pourrais reformuler le premier commit différant du maître (la vue par défaut GitHub pour Windows est la comparaison avec le maître, masquant son intégralité).
J'ai développé une barbe de la Silicon Valley alors que 900+ commits se sont chargés eux-mêmes dans Sublime. En sortant sans changement, j'ai rechargé ma batterie, puis je me suis rasé, les 900 personnes et plus commettant ayant été renvoyées nonchalamment - réinitialisant ainsi leurs temps de validation jusqu'à maintenant.
Déterminé à battre Git et à conserver les temps originaux, j'ai supprimé ce référentiel local et re-cloné à partir de la télécommande.
Maintenant, il avait rajouté un dernier engagement inutile à maîtriser que je souhaitais supprimer, donc procédé comme tel.
Épuiser les options:
Je ne souhaitais pas git revert
- cela créerait un commit supplémentaire, donnant à Git le dessus.
git reset --hard HEAD
n'a rien fait, après avoir vérifié la reflog
, la dernière et unique HEAD
était le clone - Git gagne.
Pour obtenir le SHA le plus récent, j'ai vérifié le référentiel distant sur github.com - victoire mineure.
Après avoir pensé que git reset --hard <SHA>
avait fonctionné, j'ai mis à jour une autre branche à maîtriser et 1 ... 2 ... pouf! le commit était de retour - Git l'emporte.
Il est temps d'essayer git rebase -i <SHA>
, puis de supprimer la ligne ... en vain, c'est triste à dire. "Si vous supprimez une ligne ici, CE COMMIT SERA PERDU". Ah ... passé en revue la nouvelle fonctionnalité troll le n00b dans les notes de version de 2.8.3 .
La solution:
git rebase -i <SHA>
puis d, drop = remove commit
.
Pour vérifier, j'ai vérifié dans une autre branche, et le tour est joué - aucun secret ne se commet de chercher/extraire du maître.
https://Twitter.com/holman/status/706006896273063936
Bonne journée.
Toutes les commandes ci-dessus restaurent l'état de votre arbre de travail et de votre index tels qu'ils étaient avant la validation, mais ne restaurent pas l'état du référentiel. Si vous le regardez, le commit "supprimé" n'est pas réellement supprimé, il ne s'agit tout simplement pas de celui qui se trouve au sommet de la branche actuelle.
Je pense qu'il n'y a aucun moyen de supprimer un commit avec commandes de porcelaine . Le seul moyen est de le supprimer du journal et du journal, puis d'exécuter un git Prune --expire -now
.
Si vous venez de gâcher votre dernier commit (message erroné, oublié d'ajouter quelques modifications) et que vous voulez le réparer avant de le placer dans un dépôt public, pourquoi ne pas utiliser:
git commit --amend -m "New message here"
Si vous avez récemment mis en place des modifications, elles seront combinées avec le dernier commit (que vous essayez de supprimer) et remplaceront ce commit.
Bien sûr, si vous modifiez un commit après l'avoir poussé, vous êtes en train de réécrire l'historique. Si vous le faites, veillez à en comprendre les implications.
Vous pouvez également passer l'option '--no-edit' à la place de '-m' si vous préférez utiliser le message du commit précédent.
Si vous souhaitez conserver l’historique, en affichant le commit et le revert, vous devez utiliser:
git revert GIT_COMMIT_HASH
entrez le message expliquant pourquoi vous revenez en arrière, puis:
git Push
Lorsque vous émettez git log
, vous verrez à la fois le "mauvais" commit et le message de journal de reprise.
Source: https://Gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8
Par exemple votre dernier commit
git Push Origin + aa61ab32 ^: maître
Maintenant, vous voulez supprimer ce commit, puis un moyen facile de le faire après
Pas
D'abord réinitialiser la branche sur le parent du commit en cours
Forcez-le sur la télécommande.
git reset HEAD^ --hard git Push Origin -f
Pour un commit particulier, vous souhaitez réinitialiser comme suit
git reset bb676878^ --hard
git Push Origin -f
Si vous avez déjà insisté, commencez par trouver le commit que vous souhaitez utiliser dans HEAD ($ GIT_COMMIT_HASH_HERE) , puis exécutez ce qui suit:
git reset --hard $GIT_COMMIT_HASH_HERE
git Push Origin HEAD --force
Ensuite, chaque endroit où le repo a été cloné, exécutez:
git reset --hard Origin/master
Ce que je fais habituellement quand je commets et Push (si quelqu'un le pousse, cela résout le problème)
git reset --hard HEAD~1
git Push -f Origin
espérons que cette aide
Réinitialiser sur une branche locale
git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3
Force Push to Origin
git Push -f Origin
// display git commit log
$ git log --pretty=oneline --abbrev-commit
// show last two commit and open in your default editor
// then delete second commit line and save it
$ git rebase -i HEAD~2
Référence: Comment supprimer un commit en git, local et distant
Faites une sauvegarde de votre code dans le dossier temporaire. La commande suivante sera réinitialisée de la même manière que le serveur.
git reset --hard HEAD
git clean -f
git pull
Si vous souhaitez conserver vos modifications et supprimer les commits récents
git reset --soft HEAD^
git pull
git reset --hard
git Push Origin HEAD --force
Si un ou plusieurs commits sont étiquetés, supprimez-les d'abord. Sinon, la validation étiquetée n'est pas supprimée.
Comme vous pouvez le voir sur l'image ci-dessus, je souhaite supprimer la validation "test change 2" commit (ID SHA1: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 (vous pouvez obtenir un ID SHA1 à l'aide de la commande gitk
dans git bash)).
Pour cela, je peux utiliser (toute la commande ci-dessous ne fonctionne que sur le local. Vous devez appuyer après la suppression):
git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2
/ il vous sauvegarde sur ce commit (l'ID SHA1 de _/test change 4 commit est 515b5220c50e3dfbb1063f23789d92ae1d3481a2) git reset --hard HEAD~1
// il vous sauvegarde avant un commit.git reset --hard HEAD^
// Pour supprimer le dernier commit de gitaprès suppression: