web-dev-qa-db-fra.com

Comment conserver uniquement les changements de tête dans un rebase git

Je suis actuellement au milieu d'un long rebase passant par une douzaine de commits. J'ai structuré les choses dans mon processus de développement de telle sorte que seules les modifications de HEAD sont ce que je veux garder - tous les autres conflits (par exemple, le hachage de validation b06a1dd) doit être supprimé.

Existe-t-il un moyen de supprimer simplement toutes les modifications liées au >>>>>>> b06a1dd et conservez les modifications que Git appellera <<<<<<< HEAD d'un seul coup, donc je n'ai pas à taper git rebase --continue, gérer plus de conflits à partir de plus de hachages de validation et ne conserver que les modifications de HEAD?

17
Smee

Si vous souhaitez recommencer le rebase (git rebase --abort), alors cela devrait faire ce dont vous avez besoin:

git rebase -X ours upstream

upstream est la branche sur laquelle vous rebasez.

Comme indiqué dans cette réponse et ailleurs, les étiquettes ours vs theirs sont légèrement plus déroutantes pour le rebasage que pour la fusion. Après avoir démarré un rebase, Git crée une branche anonyme et commence à lui appliquer des validations. Puisque ours signifie "conserver les modifications de la branche actuelle", cette branche actuelle sera HEAD, qui contient upstream et toutes les modifications déjà appliquées par rebase.

25
Scott Weldon

Par souci d'exhaustivité, voici ce que j'apprends de la réponse et des commentaires précédents dans les questions et réponses actuelles (le mérite revient à leurs auteurs):

  • Si vous êtes prêt à recommencer et choisissez le même côté pour TOUS les commits , la réponse actuellement choisie git rebase --abort puis git rebase -X ours upstream peut faire l'affaire.
  • Mais je suppose que dans la pratique, vous ne voudrez pas utiliser aveuglément ours ou theirs sans regarder chaque validation. Vous voudriez prendre une décision au cas par cas pour chaque commit , quand "au milieu d'un long rebase". Ainsi, vos options réelles seront:

    1. Pour utiliser l'amont:

      git checkout --ours path/to/a/specific/file
      git add path/to/a/specific/file
      

      ou encore mieux, dans ce cas, vous utilisez simplement ceci:

      git reset HEAD path/to/a/specific/file
      
    2. Utilisez votre branche de fonctionnalités:

      git checkout --theirs path/to/a/specific/file
      
    3. ou faites-le de manière manuelle pour répondre à chaque <<<< ... ==== ... >>>> dans votre éditeur.

PS: Les ours et theirs ont une signification particulière lors du rebase. :

Notez que pendant git rebase et git pull --rebase, les nôtres et les leurs peuvent apparaître échangés; --ours donne la version de la branche sur laquelle les modifications sont rebasées, tandis que - theirs donne la version de la branche qui contient votre travail qui est rebasé.

En effet, le rebase est utilisé dans un flux de travail qui traite l'historique sur la télécommande comme un canonique partagé et traite le travail effectué sur la branche que vous rebasmez comme le travail tiers à intégrer, et vous assumez temporairement le rôle du gardien de l'histoire canonique lors du rebase. En tant que gardien de l'histoire canonique, vous devez voir l'histoire de la télécommande comme la nôtre (c'est-à-dire "notre histoire canonique partagée"), tandis que ce que vous avez fait sur votre branche latérale comme la leur (c'est-à-dire "le travail d'un contributeur en plus") ).

5
RayLuo