Y a-t-il une sorte de “rebit -dit-run”, qui m’indiquerait les conflits à l’avance?

J’essaie de réécrire le script et mon script prendra des chemins différents selon que la rebase génère des conflits.

Existe-t-il un moyen de déterminer si un rebase entraînerait des conflits avant d’exécuter le rebase?

Au moment de l’écriture (Git v2.6.1 v2.10.0), la commande git rebase n’offre aucune option --dry-run . Il n’ya aucun moyen de savoir, avant de tenter un rebase, si vous allez ou non rencontrer des conflits.

Cependant, si vous exécutez git rebase et que vous rencontrez un conflit, le processus s’arrêtera et quittera avec un statut différent de zéro. Ce que vous pouvez faire est de vérifier l’état de sortie de l’opération de rebase et, si elle est différente de zéro, d’exécuter git rebase --abort pour annuler le rebase:

 git rebase ... || git rebase --abort 

Si vous voulez simplement voir si la rebase a du succès mais que vous voulez “annuler”, vous pouvez toujours repositionner la twig vers la validation d’origine. Il suffit de marquer ou de noter le SHA original.

Ou peut-être plus facile, créez une nouvelle twig temporaire dans laquelle “mettre en scène” le rebase:

 git checkout your-branch git checkout -b tmp git rebase other-branch 

Si cela a réussi, mais que vous voulez “revenir en arrière”, your-branch est intacte. Il suffit de git branch -D tmp et vous revenez à votre sharepoint départ.

S’il y avait des conflits et que vous aviez travaillé pour les résoudre et que vous vouliez maintenant conserver le rebase, repositionnez simplement votre embout de twig sur tmp (puis git branch -D tmp ).

Je pense que git rebase ... --dry-run n’est pas possible pour la raison suivante.

Lorsque vous effectuez un git rebase , git va revenir au sharepoint départ, puis appliquer progressivement des correctifs pour chaque engagement afin de mettre la twig à jour. Si un conflit survient, il s’arrêtera et attendra que vous résolviez le conflit avant de continuer. Le chemin que prend le rebase après ce conflit dépend de la manière dont vous résolvez le conflit – si vous le résolvez d’une certaine manière, cela risque d’introduire (ou d’éliminer) des conflits ultérieurs.

Ainsi, git rebase ... --dry-run ne pourra vous donner que le premier conflit – les rapports de conflits ultérieurs dépendent de la façon dont ce premier conflit est résolu.

La seule façon dont je peux penser à cela serait via git diff entre la position actuelle et le dernier commit dans la twig à laquelle vous effectuez le changement. Mais cela ne vous donnera pas vraiment ce que vous cherchez – vous avez vraiment besoin d’une liste de changements contradictoires entre les deux points. Il y a peut- être un moyen de le faire avec git diff , mais ce n’est pas un patch normal.

Vous pouvez toujours faire un rebit, jouer avec ce que vous voulez, que de récupérer toutes les modifications d’avant. En supposant que vous avez fait votre rebase d’une twig dans le master , et que vous ne l’aimez pas:

  1. git reflog -20 – vous donne les 20 dernières positions de votre HEAD avec une petite description
  2. git checkout – place votre HEAD sur la twig
  3. git reset --hard – place votre HEAD et votre twig sur l’ancienne référence, vous pouvez ainsi récupérer l’ancienne twig.

Il y a des mécanismes à comprendre ici:

  1. Vous ne supprimez JAMAIS rien dans git, pas avec des commandes, de toute façon. C’est le garbage collector qui passe et supprime les twigs non référencées (par défaut 3 mois). Donc, votre twig, d’avant la rebase, existe toujours.
  2. Il en va de même pour le rebase sur la même twig, c’est juste un nouvel arbre réécrit à côté de l’ancien.
  3. Toute l’histoire de rebase et de vos autres manipulations HEAD est écrite dans le reflog
  4. Vous pouvez utiliser les annotations @{N} de reflog

Donc, rien n’est perdu après le rebase , il vous suffit de savoir comment le retrouver et le récupérer.

Par exemple, vous pouvez placer un tag avant le rebase que d’y revenir ou le supprimer. il vous échappe à toutes les étapes de la recherche SHA1.