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?
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
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
).
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.
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:
git reflog -20
- vous donne les 20 dernières positions de votre HEAD avec une petite descriptiongit checkout <the_branch_name>
- place votre HEAD sur la branchegit 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:
rebase
et vos autres sur HEAD manipulations est écrit dans le reflog
@{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.