Question

Je l'ai rencontré un peu d'un problème: j'avais une branche spécifique à problème dans Git 28s, que je fusionné dans la branche générale develop. Il se trouve que je l'avais fait trop vite, donc j'utilisé git-revert pour annuler la fusion. Maintenant, cependant, le temps est venu de fusionner en <=> <=>, mais commande git-fusion voit la fusion d'origine, et annonce joyeusement que tout va bien et les branches ont déjà été fusionnées. Qu'est-ce que je fais maintenant? Créer un 'Revert "Revert "28s -> développer""' commit? Ne semble pas être une bonne façon de le faire, mais je ne peux pas imaginer un autre pour le moment.

Qu'est-ce que la structure de l'arbre ressemble à:

sortie du journal Git

Était-ce utile?

La solution

Vous devez "rétablir le Revert". Cela dépend de comment avez-vous rétablissez que, il ne peut pas être aussi facile que cela puisse paraître. Regardez le document officiel sur cette sujet .

---o---o---o---M---x---x---W---x---Y
              /
      ---A---B-------------------C---D

pour permettre:

---o---o---o---M---x---x-------x-------*
              /                       /
      ---A---B-------------------C---D
  

Mais ça fonctionne? Bien sûr, il le fait. Vous pouvez annuler une fusion et d'une   angle purement technique, git fait très naturellement et n'a eu aucun réel   ennuis.
  Il considère juste un changement de « état avant fusion » pour   « État après fusion », et qui était.
  Rien de bien compliqué, rien d'étrange,   rien de vraiment dangereux. Git fera sans même y penser.

     

Donc, d'un angle technique, il n'y a rien de mal à revenir d'une fusion,   mais à partir d'un angle de flux de travail, il est quelque chose que vous devriez généralement essayer de   éviter .

     

Dans la mesure du possible, par exemple, si vous trouvez un problème qui nous avait fusionné   dans l'arbre principal, plutôt que de revenir à la fusion, essayez vraiment difficile à :

     
      
  • bisect le problème vers le bas dans la branche vous avez fusionné, et juste le corriger,
  •   
  • ou essayer de revenir l'individu commettre qui l'a causé.
  •   
     

Oui, il est plus complexe, et non, ce n'est pas toujours d'aller travailler (parfois   la réponse est: « Oh là là, je ne devrais pas avoir fusionné, car il n'a pas été   encore prêt, et je vraiment besoin de défaire tous de la fusion "). Alors vous   devrait vraiment revenir à la fusion, mais quand vous voulez refaire la fusion, vous   maintenant besoin de le faire en retournant le Revert.

Autres conseils

Supposons que vous avez une telle histoire

---o---o---o---M---W---x-------x-------*
              /                      
      ---A---B

dans laquelle A, B et W a échoué commits - est de revenir M

Alors avant que je commencer à réparer les problèmes que je ne trouve écrémer de W commets ma branche

git cherry-pick -x W

Alors je reviens sur ma W engage la branche

git revert W 

Après que je peux continuer à fixer.

L'histoire finale pourrait ressembler à:

---o---o---o---M---W---x-------x-------*
              /                       /     
      ---A---B---W---W`----------C---D

Lorsque j'envoie un PR il sera montre clairement que PR est défaire Revert et ajoute quelques nouveaux commits.

Pour revenir le revert sans visser votre flux de travail trop:

  • Créer une copie trash locale de développer
  • Revert le revert commis sur la copie locale de développement
  • Fusionner cette copie dans votre branche de fonction, et poussez votre branche de fonction à votre serveur git.

Votre branche de fonctionnalité devrait maintenant pouvoir être fusionné normalement lorsque vous êtes prêt pour cela. Le seul inconvénient est que vous avez une quelques fusion supplémentaire / revert commits dans votre histoire.

Pour revenir un revert en GIT:

git revert <commit-hash-of-previous-revert>

Au lieu d'utiliser git-revert vous auriez pu utiliser cette commande dans la branche à devel jeter (undo) la mauvaise commit de fusion (au lieu de simplement revenir il).

git checkout devel
git reset --hard COMMIT_BEFORE_WRONG_MERGE

Cela permettra également d'ajuster le contenu du répertoire de travail en conséquence. Attention :

  • Enregistrer vos modifications dans la branche développement (depuis la mauvaise fusion) parce qu'ils trop seront effacés par le git-reset. Tous les engage après celui que vous spécifiez comme l'argument sera git reset parti!
  • En outre, ne pas le faire si vos modifications ont déjà été tirés d'autres dépôts parce que la réinitialisation de réécrire l'histoire.

Je recommande d'étudier l'homme pages 28s attentivement avant d'essayer cela.

Maintenant, après la remise à zéro, vous pouvez ré-appliquer vos modifications à faire et <=>

git checkout devel
git merge 28s

Ce sera une véritable fusion de <=> dans comme celui <=> initial (qui est maintenant effacé de l'histoire de git).

Je viens de découvrir ce poste face au même problème. Je trouve ci-dessus wayyy à peur de faire hards reset etc. Je vais finir par supprimer quelque chose que je ne veux pas, et ne sera pas en mesure de le récupérer.

Au lieu de cela, je vérifié la commettras que je voulais la branche revenir à par exemple git checkout 123466t7632723. Ensuite converti en une branche git checkout my-new-branch. Je puis supprimé la branche que je ne voulais plus. Bien sûr, cela ne fonctionnera que si vous êtes en mesure de jeter la branche vous foiré.

Je vous suggère de suivre les étapes ci-dessous pour récupérer un revert, dire SHA1.

git checkout develop #go to develop branch
git pull             #get the latest from remote/develop branch
git branch users/yourname/revertOfSHA1 #having HEAD referring to develop
git checkout users/yourname/revertOfSHA1 #checkout the newly created branch
git log --oneline --graph --decorate #find the SHA of the revert in the history, say SHA1
git revert SHA1
git push --set-upstream origin users/yourname/revertOfSHA1 #push the changes to remote

Maintenant, créez PR pour la branche users/yourname/revertOfSHA1

  1. créer une nouvelle branche à engager avant la fusion originale - appeler ce développement base '
  2. effectuer rebasage interactif de « développer » au-dessus de « développer base » (même si elle est déjà au-dessus). Au cours de rebasage interactif, vous aurez la possibilité de supprimer à la fois la fusion commit et le commit qui a renversé la fusion, à savoir supprimer les événements de l'histoire git

À ce stade, vous aurez une branche propre « développer » auquel vous pouvez fusionner votre fonction Brach comme vous le faites régulièrement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top