Je souhaite ignorer toutes les modifications effectuées après la validation <commit-hash>
. J'ai donc fait:
git reset --hard <commit-hash>
Maintenant, je veux faire de même avec ma télécommande. Comment puis-je faire ceci? J'ai fait quelques commits (et push) après <commit-hash>
et je veux juste les supprimer tous. C'est juste que quelque chose s'est terriblement mal passé et je ne veux pas empirer les choses. ; (
Je veux essentiellement pour revenir en arrière mon origin/master
à<commit-hash>
origin/master
n'a pas été tiré et poussé par d'autres utilisateurs? La modification de l'historique d'un référentiel public (c'est-à-dire non local) est quelque chose que vous souhaitez éviter à tout moment.Réponses:
En supposant que votre branche est appelée
master
ici et à distance, et que votre télécommande est appelée,origin
vous pouvez faire:Cependant, vous devez éviter de le faire si quelqu'un d'autre travaille avec votre référentiel distant et a retiré vos modifications. Dans ce cas, il serait préférable de revenir sur les commits que vous ne voulez pas, puis de pousser comme d'habitude.
Mise à jour: vous avez expliqué ci-dessous que d'autres personnes ont retiré les modifications que vous avez poussées, il est donc préférable de créer un nouveau commit qui annule toutes ces modifications . Il y a une belle explication de vos options pour ce faire dans cette réponse de Jakub Narębski . La méthode la plus pratique dépend du nombre de validations que vous souhaitez annuler et de la méthode qui vous convient le mieux.
Depuis votre question, il est clair que vous avez déjà utilisé
git reset --hard
pour réinitialiser votremaster
branche, vous devrez peut-être commencer par utilisergit reset --hard ORIG_HEAD
pour ramener votre branche à son emplacement précédent. (Comme toujours avecgit reset --hard
, assurez-vous quegit status
c'est propre, que vous êtes sur la bonne branche et que vous êtesgit reflog
un outil pour récupérer desORIG_HEAD
validations apparemment perdues.) Vous devriez également vérifier que cela pointe vers la bonne validation, avecgit show ORIG_HEAD
.Dépannage:
Si vous obtenez un message du type " ! [Rejeté à distance] a60f7d85 -> maître (crochet de pré-réception refusé) "
vous devez alors autoriser la réécriture de l'historique des branches pour la branche spécifique. Dans BitBucket, par exemple, il est dit "La réécriture de l'historique des branches n'est pas autorisée". Il y a une case à cocher nommée
Allow rewriting branch history
que vous devez cocher.la source
git update-ref
au lieu dereset --hard
; il vous permettra de faire la même chose sans avoir un arbre de travail / vérifié brancherevert
mais disons que je veux revenir sur les 4 derniers commits donc je dois le fairegit revert comit1; git push; git revert comit2; git push; ...
ou simplementgit revert commit4; git push
?git revert commit4
créer un nouveau commit qui annule uniquement les modifications introduites danscommit4
. Comme le souligne la réponse que j'ai liée à, vous pouvez les regrouper en un seul commit.git reset --hard
mais j'ai supprimé mon local et retiré à nouveau de l'origine, donc je peux fairegit revert ...
mon doute maintenant: dois-je revenir sur chaque commit et pousser (un par un) ou simplement annuler le premier commit après le bon engagement seulement?.git
répertoire avec des références qu'ils ne voulaient pas créer. J'avais cependant tort de dire qu'il n'y a pas de contrôles de sécurité. Vous pouvez trouver la classification en commandes "plomberie" et "porcelaine" dans la page de manuel git .Utilisez les autres réponses si cela ne vous dérange pas de perdre les modifications locales.Cette méthode peut toujours détruire votre télécommande si vous choisissez le mauvais hachage de validation pour y revenir.
Si vous souhaitez simplement faire de la correspondance à distance un commit qui se trouve n'importe où dans votre référentiel local:
git log
pour trouver le commit auquel vous voulez que la télécommande se trouve.git log -p
pour voir les changements ougit log --graph --all --oneline --decorate
pour voir un arbre compact.Exécutez une commande comme:
par exemple
ou
J'utilise un alias (
git go
) pratique pour afficher l'historique comme à l'étape 2, qui peut être ajouté comme suit:la source
git config --global alias.graph 'log --graph --all --decorate --oneline'
est moins salissant et vous pouvez toujours le limiter, par exemple:git graph -5
q
pour quitter le journal git. 2 minutes je ne reviendrai jamais.less
etq
est le moyen normal de le quitter. Git Bash est comme un terminal * nix.J'ai résolu un problème comme le vôtre par ces commandes:
la source
Sur GitLab, vous devrez peut-être définir votre branche sur non protégé avant de le faire. Vous pouvez le faire dans [repo]> Paramètres> Référentiel> Branches protégées. Ensuite, la méthode de la réponse de Mark fonctionne.
la source
Si vous voulez une version précédente du fichier, je recommanderais d'utiliser git checkout.
Faire cela vous renverra dans le temps, cela n'affecte pas l'état actuel de votre projet, vous pouvez venir sur mainline git checkout mainline
mais lorsque vous ajoutez un fichier dans l'argument, ce fichier vous est ramené d'une heure précédente à l'heure de votre projet actuel, c'est-à-dire que votre projet actuel est modifié et doit être validé.
L'avantage de ceci est qu'il ne supprime pas l'historique, et ne rétablit pas non plus les modifications d'un code particulier (git revert)
Vérifiez plus ici https://www.atlassian.com/git/tutorials/undoing-changes#git-checkout
la source
Mes deux cents aux réponses précédentes: si
ne fonctionne toujours pas, vous pouvez modifier
<your-remote-repo>.git/config
la section de réception du fichier:la source
Si votre branche n'est pas en développement ou en production, la façon la plus simple d'y parvenir est de réinitialiser un certain commit localement et de créer une nouvelle branche à partir de là. Vous pouvez utiliser:
git checkout 000000
(où 000000 est l'ID de validation où vous voulez aller) dans votre branche problématique, puis créez simplement une nouvelle branche:
git remote add [nom_de_votre_remote]
Ensuite, vous pouvez créer un nouveau PR et tout fonctionnera bien!
la source
Faites une chose, obtenez le numéro SHA du commit. comme 87c9808 et ensuite,
git push --force origin master
la source
Sourcetree: réinitialiser la télécommande à un certain commit
Poussez ce commit vers une nouvelle origine / fonctionnalité / 1337_MyAwesomeFeature
Votre branche de fonctionnalité locale et votre branche de fonctionnalité distante sont désormais sur le commit précédent (de votre choix)
la source