En raison d'une mauvaise sélection de cerises, mon référentiel Git local a actuellement cinq commits d'avance sur l'origine et n'est pas en bon état. Je veux me débarrasser de tous ces commits et recommencer.
Évidemment, supprimer mon répertoire de travail et re-cloner le ferait, mais tout télécharger à nouveau depuis GitHub semble être exagéré, et pas une bonne utilisation de mon temps.
C'est peut git revert
- être ce dont j'ai besoin, mais je ne veux pas finir par 10 commits avant l'origine (ou même six), même si cela remet le code lui-même dans le bon état. Je veux juste prétendre que la dernière demi-heure ne s'est jamais produite.
Existe-t-il une commande simple qui fera cela? Cela semble être un cas d'utilisation évident, mais je n'en trouve aucun exemple.
Notez que cette question concerne spécifiquement les validations , pas :
- fichiers non suivis
- changements non planifiés
- Modifications par étapes, mais non validées
Réponses:
Si vos commits excédentaires ne sont visibles que pour vous, vous pouvez simplement faire
git reset --hard origin/<branch_name>
pour revenir à l'endroit où se trouve l'origine. Cela réinitialisera l'état du référentiel à la validation précédente et annulera toutes les modifications locales.Faire un
git revert
fait de nouveaux commits pour supprimer les anciens commits d'une manière qui garde l'histoire de chacun saine d'esprit.la source
git reset --hard <commit hash, branch, or tag>
si vous souhaitez accéder à une référence spécifique autre qu'une branche distante.master
sur une autre branche, vous devez exécutergit reset --hard origin/<your-branch-name>
git reset --hard origin/<branch_name>
Il réinitialisera également la configuration du projet, alors prenez soin de cela. J'ai un gros.cfg
fichier qui a été réinitialisé par défaut. J'ai dû à nouveau y consacrer des heures.Supprimez simplement votre branche principale locale et recréez-la comme suit:
la source
git reset --hard origin/<branch_name>
Essayer:
pour réinitialiser votre tête là où vous voulez être. Utilisez gitk pour voir à quel commit vous voulez être. Vous pouvez également réinitialiser dans gitk.
la source
Supprimez le commit le plus récent:
git reset --hard HEAD~1
Supprimez le commit le plus récent, sans détruire le travail que vous avez fait:
git reset --soft HEAD~1
la source
Si vous utilisez l' application Atlassian SourceTree , vous pouvez utiliser l'option de réinitialisation dans le menu contextuel.
la source
Lors de votre tentative de succursale:
Validez l'inversion (à l'état, sans commits locaux), en utilisant "
git log
" ou "git status
" par conséquent.la source
Just to be clear, if you're not working on master but on another branch, you should run git reset --hard origin/<your-branch-name>
git reset --hard @{u}
* supprime toutes vos modifications locales sur la branche actuelle, y compris les validations. Je suis surpris que personne n'ait encore posté cela, étant donné que vous n'aurez pas à chercher ce qui vous engage à revenir ou à jouer avec les branches.* Autrement dit, réinitialiser à la branche actuelle à -
@{upstream}
généralementorigin/<branchname>
, mais pas toujoursla source
Pour voir / obtenir l'ID SHA-1 du commit que vous souhaitez revenir également
Pour revenir à ce commit
!Remarque. Toutes les validations effectuées après cette validation seront supprimées (et toutes vos modifications apportées au projet). Il est donc préférable de cloner le projet dans une autre branche ou de le copier dans un autre répertoire.
la source
J'ai eu une situation où je voulais supprimer un commit qui n'a pas été poussé, mais le commit était avant un autre. Pour ce faire, j'ai utilisé la commande suivante
git rebase -i HEAD~2
-> il va rebaser les deux derniers commitsEt j'ai utilisé «drop» pour la signature de validation que je voulais supprimer.
la source
Supprimer les fichiers non suivis (modifications locales non validées)
Supprimer définitivement toutes les validations locales et obtenir la dernière validation à distance
la source
Pour les
git rebase -i
validations locales qui ne sont pas poussées, vous pouvez également utiliser pour supprimer ou écraser une validation.la source
git rebase -i
est un moyen plus générique pour résoudre de nombreux problèmes similaires et peut être utile dans une variété de situations.drop
mot - clé (au lieu de supprimer une ligne) lors de la suppression de toutes les validations pour éviter que le rebase soit abandonné.La solution simple consistera à faire correspondre la branche principale locale HEAD à l'origine / branche principale HEAD
PS: origin / master - est un pointeur distant vers la branche master. Vous pouvez remplacer le maître par n'importe quel nom de branche
la source
Avant de répondre, ajoutons un peu de contexte, expliquant ce que c'est
HEAD
. car certaines des options ci-dessous entraîneront une tête détachéeFirst of all what is HEAD?
HEAD
est simplement une référence au commit actuel (le plus récent) sur la branche courante.Il ne peut y en avoir qu'un seul
HEAD
à un moment donné. (à l'exclusiongit worktree
)Le contenu de
HEAD
est stocké à l'intérieur.git/HEAD
et contient les 40 octets SHA-1 de la validation en cours.detached HEAD
Si vous n'êtes pas sur le dernier commit - ce qui signifie qu'il
HEAD
pointe vers un commit antérieur dans l'historique, c'est appelédetached HEAD
.Sur la ligne de commande, il ressemblera à ceci - SHA-1 au lieu du nom de la branche car le
HEAD
ne pointe pas vers la pointe de la branche actuelleQuelques options sur la façon de récupérer à partir d'une tête détachée:
git checkout
Cela va extraire une nouvelle branche pointant vers le commit souhaité.
Cette commande extrait un commit donné.
À ce stade, vous pouvez créer une branche et commencer à travailler à partir de ce point.
git reflog
Vous pouvez également toujours utiliser le
reflog
.git reflog
affichera tout changement qui a mis à jour leHEAD
et vérifier l'entrée de reflog souhaitée mettra leHEAD
dos à ce commit.Chaque fois que le HEAD est modifié, il y aura une nouvelle entrée dans le
reflog
Cela vous ramènera à votre engagement souhaité
git reset --hard <commit_id>
"Déplacer" votre HEAD vers le commit souhaité.
vous pouvez également utiliser le
git rebase --no-autostash
.git revert <sha-1>
"Annuler" la validation ou la plage de validation donnée.
La commande de réinitialisation "annulera" toutes les modifications apportées au commit donné.
Un nouveau commit avec le patch d'annulation sera validé tandis que le commit d'origine restera également dans l'historique.
Ce schéma illustre quelle commande fait quoi.
Comme vous pouvez le voir,
reset && checkout
modifiez leHEAD
.la source
Pour ceux qui s'intéressent à la solution Visual Studio, voici l'exercice:
Team Explorer
fenêtre, connectez-vous au référentiel cible.Branches
, cliquez avec le bouton droit sur la branche d'intérêt et sélectionnezView history
.History
fenêtre et choisissezReset -> Delete changes (--hard)
.Cela supprimera vos commits locaux et réinitialisera l'état de votre dépôt sur le commit sélectionné. C'est-à-dire que vos modifications après avoir retiré le dépôt seront perdues.
la source
Si votre branche est en avance de '
origin/XXX
' de 5 commits.Vous pouvez émettre:
Et cela devrait supprimer les 5 derniers commits.
la source
Cela vous sera utile si vous avez fait des erreurs sur votre copie locale et que vous voulez vous assurer qu'elles ne sont pas transmises par erreur à votre succursale distante.
Le code SHA peut être obtenu en consultant la version Web de votre tableau de bord git pour le dernier commit de la branche.
De cette façon, vous pouvez être synchronisé avec le dernier commit de la branche.
Tu peux faire
git pull
après avoir terminé avec succès la réinitialisation matérielle pour confirmer rien de nouveau à synchroniser, c'est-à-dire que vous pouvez voir le message.Votre agence est à jour avec
Origin/<Branch Name>
la source
Si vous mettez votre dépôt local dans un désordre complet, alors un moyen fiable de supprimer les commits locaux dans Git est de ...
D'après mon expérience, Eclipse gère assez bien le monde qui change autour de lui. Cependant, vous devrez peut-être sélectionner des projets affectés dans Eclipse et les nettoyer pour forcer Eclipse à les reconstruire. Je suppose que d'autres IDE peuvent également avoir besoin d'une reconstruction forcée.
Un avantage secondaire de la procédure ci-dessus est que vous découvrirez si votre projet repose sur des fichiers locaux qui n'ont pas été mis dans git. Si vous trouvez qu'il vous manque des fichiers, vous pouvez les copier depuis "my_broken_local_repo" et les ajouter à git. Une fois que vous avez la certitude que votre nouveau référentiel local a tout ce dont vous avez besoin, vous pouvez supprimer "my_broken_local_repo".
la source
Si vous voulez simplement supprimer les validations locales et conserver les modifications effectuées dans les fichiers, faites
git reset @ ~
D'autres réponses traitaient de la réinitialisation matérielle
la source