J'ai lu des articles similaires sur ce sujet et je ne peux pas pour la vie de moi comprendre comment le faire correctement.
J'ai archivé environ 1000 fichiers dont je ne veux pas et je préfère ne pas avoir à passer par 1by1 et à les supprimer tous du dépôt.
- J'ai une
master
succursale éloignée . - J'ai la
master
succursale locale .
Ils sont tous les deux à la même révision.
Je veux restaurer ma télécommande d'un commit.
Dites que mon histoire master
est A--B--C--D--E
.
Je souhaite restaurer mon fichier local sur D
.
Ensuite, poussez-le sur remote pour que mon hachage actuel soit D à la fois distant et local.
J'ai des problèmes pour faire ça.
J'utilise Git Tower mais je suis à l'aise avec la ligne de commande. De l'aide?
MISE À JOUR: Grands commentaires ci-dessous. L'utilisation d'une réinitialisation semble être partiellement déconseillée, surtout si le référentiel est partagé avec d'autres utilisateurs. Quelle est la meilleure façon d'annuler les modifications du commit précédent sans utiliser une réinitialisation matérielle ? Y a-t-il un moyen?
git revert
pour se passer de réinitialisations matérielles et sans déranger les utilisateurs.Réponses:
Si personne n'a encore retiré votre repo distant, vous pouvez changer votre branche HEAD et forcer le pousser vers ledit repo distant:
(ou, si vous avez un accès direct au repo distant, vous pouvez modifier sa référence HEAD même s'il s'agit d'un repo nu )
Notez, comme commenté par alien-technology dans les commentaires ci - dessous , sous Windows (session CMD), vous auriez besoin de
^^
:Mise à jour depuis 2011: l'
utilisation
git push --force-with-lease
( que je présente ici , introduite en 2013 avec Git 1.8.5) est plus sûre.Voir la réponse de Schwern pour illustration.
Ensuite, je suggérerais quelque chose qui ne réécrit pas l'histoire:
git revert
localement votre dernier commit (création d'un nouveau commit qui inverse ce que le commit précédent a fait)git revert
.la source
reset --hard HEAD^
et nonreset --hard HEAD^^
à réinitialiser le dernier commit.Définissez la branche locale une révision en arrière (
HEAD^
signifie une révision en arrière):Poussez les modifications à l'origine:
Vous devrez forcer le push car sinon, git reconnaîtrait que vous êtes en retard
origin
par un commit et rien ne changera.Le faire avec
--force
dit à git d'écraserHEAD
dans le référentiel distant sans respecter aucune avancée.la source
git push origin master
, Git est capable de créer un nouveau commit à distance parce que la branche locale est en avance d'au moins une fois? En outre, ce dernier doit être substantiellement différent de ce que pointe la tête du repo distant?Si vous voulez revenir au dernier commit écoutez:
Étape 1:
Vérifiez vos engagements locaux avec des messages
Étape 2:
Supprimer le dernier commit sans réinitialiser les modifications de la branche locale (ou du maître)
OU si vous ne voulez pas que les derniers fichiers de commit et les mises à jour écoutent
Étape 3:
Nous pouvons mettre à jour les fichiers et les codes et à nouveau besoin de pousser avec force, cela supprimera le commit précédent. Il conservera un nouveau commit.
C'est tout!
la source
En entrant la commande ci-dessous, vous pouvez voir votre historique de validation git -
$ git log
Disons que votre historique sur cette branche particulière est comme - commit_A, commit_B, commit_C, commit_D. Où, commit_D est le dernier commit et c'est là que HEAD reste. Maintenant, pour supprimer votre dernier commit local et distant, vous devez procéder comme suit:
Étape 1: supprimer le dernier commit localement par -
$ git reset --hard HEAD ~
Cela changera votre commit HEAD en commit_C
Étape 2: Poussez votre changement pour un nouveau commit HEAD à distance
$ git push origin + HEAD
Cette commande supprimera le dernier commit de la télécommande.
PS cette commande est testée sur Mac OSX et devrait également fonctionner sur d'autres systèmes d'exploitation (sans prétendre à d'autres OS)
la source
Pour les machines Windows, utilisez:
la source
Voici une version mise à jour de la procédure qui est plus sûre.
git push -f
remplacera sans discernement le référentiel distant par vos propres modifications. Si quelqu'un d'autre a poussé des changements, ils seront perdus.git push --force-with-lease
ne poussera votre rebase que si le référentiel est comme prévu. Si quelqu'un d'autre a déjà poussé, votre push échouera.Voir –force considérée comme nuisible; comprendre git's –force-with-bail .
Je recommande d'aliaser ceci comme
repush = push --force-with-lease
.Dites-leur
git pull --rebase=merges
. Au lieu d'ungit fetch origin
etgit merge origin/master
il le feragit fetch origin
etgit rebase -r origin/master
. Cela réécrira tous leurs changements locauxmaster
en plus du nouveau rebaséorigin/master
.-r
conservera toutes les fusions qu'ils ont pu effectuer.Je recommande d'en faire le comportement par défaut pour tirer. Il est sûr, gère le rebasage des autres et entraîne moins de fusions inutiles.
la source
--force-with-lease
option.J'ai résolu un problème comme le vôtre par ces commandes:
la source
Si vous avez un accès direct au référentiel distant, vous pouvez toujours utiliser:
Cela fonctionne car il n'y a aucune tentative de modifier le répertoire de travail inexistant. Pour plus de détails, veuillez consulter la réponse originale:
Comment puis-je annuler la validation du dernier commit dans un dépôt nu git?
la source
Je voulais juste supprimer le dernier commit de l'historique des commit distant et effacer également. Ce qui suit a fonctionné comme un charme
la source
La façon de réinitialiser la tête et de revenir au commit précédent est de
Mais parfois, cela peut ne pas être accepté dans la branche distante:
alors l'autre façon de faire est
Cela fonctionne très bien.
REMARQUE: rappelez-vous si l'
git push -f <force>
échec et que vous essayez de revenir en arrière. Faites ungit pull
avant, pour que la télécommande et le local soient synchronisés, puis essayezgit revert
.Vérifiez avec
git log
pour vous assurer que le distant et le local sont au même point de validation avec le même SHA1.la source
sur le maître local
Pas besoin de s'inquiéter si l'autre a tiré ou non.
Terminé!
la source
Si vous souhaitez uniquement supprimer le dernier commit du référentiel distant sans gâcher votre référentiel local, voici un one-liner:
Cela utilise la syntaxe suivante:
Voici,
<remote>
estorigin
et<refspec>
a la structure suivante:Les détails peuvent être trouvés dans
git-push(1)
. La précédente+
signifie "forcer cette ref", et l'autre partie signifie "deorigin/master~
àmaster
(de la télécommandeorigin
)". Il n'est pas difficile de savoir queorigin/master~
c'est le dernier commit avantorigin/master
, non?la source
pour moi fonctionne ces deux commandes:
la source
Vous pouvez également faire ceci:
et faites réinitialiser tous les autres utilisateurs qui ont reçu les derniers mauvais commits:
la source