Comment écraser le contenu d'une branche avec celui d'une autre?

Trop de conflits pour peu de modifications qui, en plus, ne sont plus pertinentes

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour tout le monde !

J’ai une interrogation à vous soumettre sur des manipulations avec git aujourd’hui.

J’ai une branche sur laquelle j’avais préparé une fonctionnalité. Suite à un changement de priorités, cette branche n’a pas été maintenue à jour régulièrement, et la PR n’a bougé que dernièrement pour être rejetée en l’état, les spécifications n’étaient pas complètes alors (!).

Le hic, c’est que le changement de priorités a évidemment fait évoluer la branche master, à tel point qu’il y a un très grand nombre de conflits pour ces deux branches désormais, et ce pour des modifications plutôt mineures au départ, mais qui sont caduques avec l’évolution principale.

Du coup, j’aurais souhaité pouvoir "écraser" le contenu de la branche avec celui de master. Seulement, j’aimerais pouvoir mettre à jour uniquement le code de ma branche afin de pouvoir repartir depuis master. rebase et reset ne me permettent pas de pousser le nouvel état du code, parce que j’ai déjà quelques commits de poussés sur la branche, donc les changements ne sont plus "fast-forward" (pour reset, c’est le même souci que ce soit soft, mixed ou hard).

Est-ce qu’il y a une méthode autre que supprimer/recréer la branche afin de repartir depuis une version master "propre" ?

Merci d’avance  :)

Evitez qu’on vous dise de les lire : FAQ PHP et SymfonyTutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0

Salut,

git checkout branch
git reset --hard master

Après si tu souhaites quand même récupérer tes commits, tu peux essayer de faire un git rebase --onto (le manuel explique bien comment il fonctionne, avec des dessins).

Pour ce genre de rebase fastidieux, je te conseille d’activer rerere (git config --global rerere.enabled true) qui te permettra de le faire en plusieurs fois, ou de d’économiser du temps si tu as plusieurs branches à rebaser.

+3 -0

Salut !

Si j’ai bien compris, tu voudrais rebaser ta branche sur master en ignorant les conflits et en privilégiant les modifications côté master ? Si oui, tu peux jeter un coup d’oeil du côté des paramètres -Xtheirs et -Xours, qui permettent de privilégier une version (la leur ou la nôtre) plutôt que de marquer les différences comme des conflits de fusion. ;)

"Les accidents dans un système doivent se produire, mais il n’est pas obligatoire qu’ils produisent pour vous et moi." Laurence Gonzales - Deep Survival

+1 -0

Salut !

Si j’ai bien compris, tu voudrais rebaser ta branche sur master en ignorant les conflits et en privilégiant les modifications côté master ? Si oui, tu peux jeter un coup d’oeil du côté des paramètres -Xtheirs et -Xours, qui permettent de privilégier une version (la leur ou la nôtre) plutôt que de marquer les différences comme des conflits de fusion. ;)

rezemika

À noter que c’est relativement dangereux si tu n’as pas prévu de tout squasher pour tester le commit en question et que tu n’as pas de tests automatique, puisque tu ne sais pas ce qui va introduire une régression ou pas.

+0 -0

Ah en effet, tu as raison. Je mentionnais ça juste parce que ça m’avait bien aidé dans un cas particulier (où j’avais des tests unitaires). Ton approche est en effet bien meilleure.

Édité par rezemika

"Les accidents dans un système doivent se produire, mais il n’est pas obligatoire qu’ils produisent pour vous et moi." Laurence Gonzales - Deep Survival

+0 -0
Auteur du sujet

Merci pour vos réponses.

Je n’ai rien qui risque de sauter, et les commits précédemment pushés ne me servent plus à rien. J’avais justement déjà tenté un reset --hard, mais le résultat semble être le même que si j’avais fait un rebase (cf. mon explication dans le premier message).
De ce que je comprends de git, je souhaite ne pas modifier l’index, et probablement pas HEAD non-plus1, comme si le code actuel de master (modulo les quelques changements que je souhaiterais faire à partir de celui-ci) était le fruit d’un nouveau travail à pousser tel-quel dans la branche, en fait.


  1. Ce que font rebase comme reset, sauf erreur

Édité par Ymox

Evitez qu’on vous dise de les lire : FAQ PHP et SymfonyTutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0

Cette réponse a aidé l’auteur du sujet

Si tu fais git reset --hard sans indiquer de référence, ça supprime juste les dernières modifications depuis ton dernier commit.

Si les commits sur ta branche de fonctionnalité ne servent à rien, tu peux faire le git reset --hard master depuis ta branche et ta branche sera au même niveau que master. Il faudra probablement faire un push --force pour partager ton travail par contre.

+1 -0
Auteur du sujet

Cette réponse a aidé l’auteur du sujet

Je fais un reset en référençant le dernier commit sur la branche master, je pense que c’est bon de ce côté-là.

Mais c’est donc --force pour le push qui me manquait, au final. Je n’ai pas pensé que je pourrais forcer l’envoi, je bloquais sur un état local "clean"…

Merci !

Édité par Ymox

Evitez qu’on vous dise de les lire : FAQ PHP et SymfonyTutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0

Après avoir fait ça, il est possible de cleaner le repo pour supprimer les commits déréférencés

git reflog expire --expire-unreachable=now --all
git gc --prune=now

Édité par SylafrsOne

C’est en se plantant qu’on devient cultivé.

+0 -0

Après avoir fait ça, il est possible de cleaner le repo pour supprimer les commits déréférencés

git reflog expire --expire-unreachable=now --all
git gc --prune=now

SylafrsOne

Ça me parait étrange de vouloir se tirer une balle dans le pieds comme ça.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte