Comment supprimer les commits locaux dans Git?

264

J'avais travaillé sur quelque chose et j'ai décidé qu'il était complètement foutu ... après en avoir commis une partie. J'ai donc essayé la séquence suivante:

git reset --hard
git rebase origin
git fetch
git pull
git checkout

À quel moment j'ai reçu le message

Your branch is ahead of 'origin/master' by 2 commits.

Je veux supprimer mes validations locales , sans avoir à effacer mon répertoire local et tout télécharger à nouveau. Comment puis-je y parvenir?

Daniel C. Sobral
la source
6
Il n'est pas nécessaire de faire les deux git fetchet git pull- pull est une combinaison de récupération et de fusion.
Ether
12
Note aux utilisateurs: le problème principal de cette question n'a rien à voir avec le message "Votre branche est en avance sur 'origine / master' par N commits." . Veuillez arrêter de fermer d'autres questions en tant que doublons de celle-ci en raison de ce message.

Réponses:

582
git reset --hard origin/master

supprimera toutes les validations qui ne se origin/mastertrouvent pas où se origintrouve le nom du référentiel et masterle nom de la branche.

mipadi
la source
1
Je pensais que la syntaxe "origine / master", avec une barre oblique, renvoyait à un dépôt local?
Daniel C.Sobral
9
mipadi: Plus correctement, il réinitialisera la branche actuelle pour pointer vers le même commit que origin / master.
Christoffer Hammarström
Il s'agit d'une branche. origin/masterest une branche qui suit la masterbranche du originréférentiel distant.
mipadi
@ DanielC.Sobral Non, origin/masterest une référence à la masterbranche de la télécommande appelée origin.
Matthew
1
@littletiger git ne suit pas les dossiers, seulement les fichiers et leurs chemins. Par conséquent, il ignorera complètement les dossiers vides (dossiers sans fichiers ou uniquement les fichiers ignorés). Ils n'apparaissent nulle part car il n'y a rien à y entrer.
Mumbleskates
33

En passant, à part la réponse de mipadi (qui devrait d'ailleurs fonctionner), vous devez savoir que faire:

git branch -D master
git checkout master

fait également exactement ce que vous voulez sans having to redownload everything(votre devis paraphrasé). En effet, votre référentiel local contient une copie du référentiel distant (et cette copie n'est pas la même que votre répertoire local, elle n'est même pas la même que votre branche extraite).

L'effacement d'une branche est parfaitement sûr et la reconstruction de cette branche est très rapide et n'implique aucun trafic réseau. N'oubliez pas que git est avant tout un dépôt local par conception. Même les succursales distantes ont une copie sur le local. Il n'y a qu'un peu de métadonnées qui indiquent à git qu'une copie locale spécifique est en fait une branche distante. Dans git, tous les fichiers sont constamment sur votre disque dur.

Si vous n'avez pas de succursales autres que master, vous devez:

git checkout -b 'temp'
git branch -D master
git checkout master
git branch -D temp
Slebetman
la source
4
Mais comment cela différencie-t-il les commits effectués localement des commits effectués à l'origine? En fait, cela me dit queCannot delete the branch 'master' which you are currently on.
Daniel C. Sobral
1. Fondamentalement, tous les commits sont les mêmes, qu'ils soient effectués localement ou à l'origine. L'important est que les historiques soient synchronisés correctement. Votre commit local n'existera à l'origine qu'après que vous les ayez poussés et par défaut git refusera la poussée si l'historique à l'origine peut se retrouver dans un état qui n'a pas de sens.
slebetman
2
2. Bien sûr, vous ne pouvez pas supprimer la branche actuellement extraite. Pour supprimer le maître, consultez d'abord une autre branche. S'il n'y a pas d'autre branche, créez-en simplement une temporaire:git checkout -b temp;git branch -D master;git checkout master;git branch -D temp
slebetman
Notez également ce que j'ai dit à propos de la différence de votre copie locale du référentiel distant: git ne vous permettra pas de modifier ou même d'afficher les fichiers de votre copie de la branche distante. Il vous permettra uniquement de créer une autre branche à partir de la branche distante que vous pourrez ensuite visualiser et modifier. Par convention, cette branche locale porte le même nom que la branche distante. Vous avez partiellement raison, c'est origin/mastersur votre machine locale. C'est votre copie locale (complète) de la branche distante. La vraie branche distante est origin master.
slebetman
Cela a fonctionné pour moi. Peut-être que ce git branch -D mastern'était pas nécessaire, car comme indiqué, cela génère une erreur.
Alexis Wilke
15

Ce que je fais, c'est que j'essaie de réinitialiser dur à HEAD. Cela effacera tous les commits locaux:

git reset --hard HEAD^
giang nguyen
la source
C'est la meilleure réponse qui a vraiment fonctionné. Ignoré toutes les validations locales et réinitialisé à HEAD. Quelle est l'utilité de ^ char?
karim
@karim le '^' est probablement un truc regex, qui est probablement quelque chose d'assez profond que je ne connais pas ou que j'ai lu il y a longtemps dans le fichier manuel .. désolé mec :)
giang nguyen
1
Tard, mais ^représente le commit parent, donc la réinitialisation HEAD^annule les modifications non validées et déplace la branche vers le commit précédent, "supprimant" effectivement le commit le plus récent (bien que le commit existe toujours, la branche ne le pointe pas). La réponse n'aura qu'une seule validation locale et les autres sont des modifications non validées. @karim @giang
QuantumQuaver
3

Vous devez courir

git fetch

Pour obtenir toutes les modifications, vous ne recevrez pas de message avec "votre succursale est en avance".

Володимир Пасіка
la source
5
La récupération n'a rien à voir avec le principal problème du demandeur, qui est de se débarrasser des commits locaux.
1
que se passe-t-il si j'ai déjà validé des fichiers en local et que j'essaie ensuite de lancer la commande mentionnée Il affichera le même message d'erreur. J'ai aussi essayé git fetch et git fetch -p. mais montrant la même erreur
Morez
1

J'ai vu des cas où la télécommande n'était plus synchronisée et devait être mise à jour. Si un reset --hardou un branch -Dne fonctionne pas, essayez

git pull origin
git reset --hard 
Jim Clouse
la source
cela ne répond pas à la question, reset --hardça marche dans cette situation
CharlesB
1
Salut Charles, tu as raison qui reset --harddevrait fonctionner ici. Cependant, je souligne simplement qu'il échoue parfois à réinitialiser correctement la branche et que la git pull originsynchronisation de la télécommande et le reset --hardfonctionnement correct seront effectués .
Jim Clouse
0

Je devais faire un:

git checkout -b master

comme git a dit qu'il n'existe pas, car il a été essuyé avec le

git -D master
rampe
la source