web-dev-qa-db-fra.com

Existe-t-il une sorte de «git rebase --dry-run», qui m'informerait à l'avance des conflits?

J'essaie de rebaser le script et mon script prendra des chemins différents selon que le rebase entraîne des conflits.

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

56
Jonathan.Brink

Au moment de la rédaction (Git v2.6.1 v2.10.0), le git rebase la commande n'offre pas --dry-run option. Il n'y a aucun moyen de savoir, avant d'essayer de rebaser, si vous allez ou non rencontrer des conflits.

Cependant, si vous exécutez git rebase et en cas de conflit, le processus s'arrête et se termine avec un état 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, exécutez git rebase --abort pour annuler le rebase:

git rebase ... || git rebase --abort
36
jub0bs

Si vous voulez juste voir si le rebase serait réussi mais alors vous voulez "reculer" vous pouvez toujours repositionner la branche astuce retour au commit d'origine. Il suffit de marquer ou de noter le SHA d'origine.

Ou peut-être plus simple, créez une nouvelle branche temporaire dans laquelle "mettre en scène" le rebase:

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

S'il a réussi, mais que vous souhaitez "revenir en arrière", your-branch est intact. Juste git branch -D tmp et vous revenez à votre point de départ.

S'il y avait des conflits et que vous avez fait un travail pour les résoudre et que vous voulez maintenant conserver la rebase, repositionnez simplement votre astuce-branche sur tmp (puis git branch -D tmp).

20
joneit

Je soupçonne que git rebase ... --dry-run n'est pas possible, pour la raison suivante.

Lorsque vous faites un git rebase, git reviendra au point de départ, puis appliquera de manière incrémentielle des correctifs pour chaque commit afin de mettre la branche à jour. S'il frappe un conflit, il s'arrêtera et attendra que vous résolviez le conflit avant de continuer. Le chemin emprunté par le rebasage après ce conflit dépend de la façon dont vous résolvez le conflit - si vous le résolvez d'une certaine manière, cela pourrait introduire (ou éliminer) des conflits ultérieurs.

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

La seule façon de penser à cela serait via git diff entre la position actuelle et le dernier commit de la branche vers laquelle vous rebasez. Mais cela ne vous donnera pas vraiment ce que vous cherchez - vous avez juste besoin d'une liste de conflits changements entre les deux points. Il pourrait être un moyen de le faire avec git diff, mais ce n'est pas un patch normal.

7
Kryten

Vous pouvez toujours faire git rebase, jouer avec comme vous voulez, puis récupérer toutes les modifications d'avant. En supposant que vous avez fait votre rebase d'une branche 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 <the_branch_name> - place votre HEAD sur la branche
  3. git reset --hard <old_sha1_found_in_reflog> - place votre HEAD et branchez-vous sur l'ancienne référence, de cette façon vous pouvez récupérer l'ancienne branche.

Il y a quelques 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 branches non référencées (par défaut 3 mois). Votre branche, d'avant le rebase, existe donc toujours.
  2. Il en va de même pour le rebase sur la même branche, c'est juste un nouvel arbre réécrit à côté de l'ancien.
  3. Tout l'historique de rebase et vos autres sur HEAD manipulations est écrit dans le reflog
  4. Vous pouvez utiliser @{N} annotations de reflog

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

Par exemple, vous pouvez vous placer une balise avant le rebase pour y revenir ou la supprimer. il vous élude toute l'étape de recherche SHA1.

4
Lukasz Kruszyna