web-dev-qa-db-fra.com

Réinitialisation de la télécommande à un certain commit

Je veux annuler toutes les modifications apportées après commit <commit-hash> ..____.

git reset --hard <commit-hash>

Maintenant, je veux faire la même chose avec ma télécommande. Comment puis-je faire ceci? J'ai fait quelques commits (et pousses) après <commit-hash> et je veux juste les supprimer tous. Est-ce juste que quelque chose a mal tourné terriblement et je ne veux pas aggraver la situation? ; (

Je veux fondamentalement rembobiner mon Origin/master à <commit-hash>

517
nacho4d

En supposant que votre branche s'appelle master à la fois ici et à distance, et que votre télécommande s'appelle Origin, vous pourriez faire:

 git reset --hard <commit-hash>
 git Push -f Origin master

Toutefois, vous devriez éviter cela si quelqu'un d'autre travaille avec votre référentiel distant et a extrait vos modifications. Dans ce cas, il serait préférable de revenir les commits que vous ne voulez pas, puis Push comme d'habitude.

Mise à jour: vous avez expliqué ci-dessous que d'autres personnes ont retiré les modifications que vous avez effectuées, c'est donc meilleur pour créer un nouveau commit qui annule toutes ces modifications . Il y a une bonne 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 commits que vous souhaitez annuler et de la méthode la plus logique pour vous.

Comme il ressort clairement de votre question que vous avez déjà utilisé git reset --hard pour réinitialiser votre branche master, vous devrez peut-être commencer par utiliser git reset --hard ORIG_HEAD pour ramener votre branche là où elle se trouvait auparavant. (Comme toujours avec git reset --hard, assurez-vous que git status est propre, que vous êtes sur la bonne branche et que vous êtes au courant de git reflog en tant qu'outil pour récupérer les commits apparemment perdus. ) Vous devriez également vérifier que ORIG_HEAD pointe vers le bon commit, avec git show ORIG_HEAD.

1046
Mark Longair

Utilisez les autres réponses si cela ne vous dérange pas de perdre des modifications locales. Cette méthode peut toujours détruire votre télécommande si vous choisissez le hachage de validation incorrect sur lequel vous souhaitez revenir.

Si vous voulez simplement faire en sorte que la télécommande corresponde à un commit déjà dans votre branche locale:

  1. Ne pas ne réinitialise pas.
  2. Utilisez git log pour trouver le hachage du commit que vous voulez utiliser pour la télécommande. git log -p pour voir les modifications, ou git log --graph --all --oneline --decorate pour voir un arbre compact. (Avoir ce dernier comme alias dans votre shell est très pratique.)
  3. Copiez le hachage.
  4. Exécutez une commande comme:

    git Push --force <remote> <the-hash>:<the remote branch>
    

    par exemple.

    git Push --force Origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master
    
84
Walf

J'ai résolu le problème comme le vôtre avec ces commandes:

git reset --hard <commit-hash> 
git Push -f <remote> <local branch>:<remote branch> 
53
Ibrohim Ermatov

Mes deux cents aux réponses précédentes: si 

git Push --force <remote> <the-hash>:<the remote branch>

ne fonctionne toujours pas, vous pouvez modifier la section de réception du fichier <your-remote-repo>.git/config:

[receive]
  #denyNonFastforwards = true
  denyNonFastforwards = false
5
badbishop

Si vous voulez une version précédente du fichier, je vous recommanderais d'utiliser git checkout.

git checkout <commit-hash>

Cela vous renverra dans le temps, cela n’affectera pas l’état actuel de votre projet, vous pourrez accéder à Mainline Git Checkout Mainline

mais lorsque vous ajoutez un fichier dans l'argument, ce fichier vous est renvoyé d'une heure antérieure à l'heure de votre projet actuel, c'est-à-dire que votre projet actuel est modifié et doit être validé.

git checkout <commit-hash> -- file_name
git add .
git commit -m 'file brought from previous time'
git Push

L’avantage de cela est qu’il ne supprime pas l’historique, ni annule les modifications de code particulières (git revert)

Vérifiez plus ici https://www.atlassian.com/git/tutorials/undoing-changes#git-checkout

4
priya khokher

Si votre branche n'est pas en développement ou en production, le moyen le plus simple d'y parvenir est de réinitialiser localement un certain commit et de créer une nouvelle branche à partir de là. Vous pouvez utiliser: 

git checkout 000000  

(où 000000 est l'identifiant de validation où vous voulez aller) dans votre branche problématique et créez simplement une nouvelle branche: 

git remote add [nom_de_votre_remote]

Ensuite, vous pouvez créer un nouveau PR et tout ira bien!

1
Gerardo Suarez

Sur GitLab, vous devrez peut-être définir votre branche sur sans protection avant de le faire. Vous pouvez le faire dans [référentiel]> Paramètres> Référentiel> Branches protégées. Ensuite, la méthode de la réponse de Mark fonctionne.

git reset --hard <commit-hash>
git Push -f Origin master
1
dudasaus

Section Apprendre: Annuler les commandes publiques avec Revert sur Atlasssian Blog https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting

0
CodeFarmer

Faites une chose, obtenez le n ° SHA du commit. tels que 87c9808 et ensuite,

  1. déplacez-vous, c'est votre tête au commit spécifié (en faisant git reset --hard 89cef43 // mentionnez votre numéro ici)
  2. Ensuite, faites quelques modifications dans un fichier aléatoire, de sorte que le git vous demande de le valider localement, puis à distance. m "trial commit"
  3. Poussez maintenant le commit suivant (s'il a été commis localement) Par Git Push Origin master
  4. Maintenant, ce que git va vous demander, c'est que

erreur: échec de pousser certains refs à ' https://github.com/YOURREPOSITORY/AndroidExperiments.git ' Astuce: les mises à jour ont été rejetées car le bout de votre branche actuelle est derrière indice: son homologue à distance. Intégrez les modifications à distance (par exemple .____. Indice: 'git pull ...') avant d'appuyer à nouveau. **

  1. Alors maintenant, ce que vous pouvez faire est

git Push --force Origin master

  1. Et donc, j'espère que ça marche :)
0