J'ai un référentiel dans Git. J'ai créé une branche, puis j'ai apporté des modifications à la fois au maître et à la branche.
Ensuite, des dizaines de commits plus tard, j'ai réalisé que la branche est dans un bien meilleur état que le maître, donc je veux que la branche "devienne" le maître et ignore les changements sur le maître.
Je ne peux pas le fusionner, car je ne veux pas conserver les modifications sur master. Que devrais-je faire?
Extra : Dans ce cas, le «vieux» maître a déjà été push
-ed dans un autre référentiel tel que GitHub. Comment cela change-t-il les choses?
Réponses:
Le problème avec les deux autres réponses est que le nouveau maître n'a pas l'ancien maître comme ancêtre, donc quand vous le poussez, tout le monde sera foiré. Voici ce que vous voulez faire:
Si vous souhaitez que votre historique soit un peu plus clair, je vous recommande d'ajouter des informations au message de validation de fusion pour clarifier ce que vous avez fait. Remplacez la deuxième ligne par:
la source
--strategy=ours
est différent de--strategy=recursive -Xours
. C'est-à-dire que "la nôtre" peut être une stratégie en soi (le résultat sera la branche actuelle quoi qu'il arrive), ou passé en option à la stratégie "récursive" (apportez les changements d'autres branches, et préférez automatiquement les changements de la branche actuelle en cas de conflit) ).git merge --strategy=ours master -m "new master"
pour que ça marche.git push
droit après cela si vous voulez que votre code soit poussé à distance. Vous pouvez voir un avertissement comme celui-Your branch is ahead of 'origin/master' by 50 commits.
ci est attendu. Poussez-le! : DAssurez-vous que tout est poussé vers votre référentiel distant (GitHub):
Remplacez "master" par "better_branch":
Forcez le push vers votre référentiel distant:
la source
git reset --hard origin/master
prochaine fois qu'elles veulent être extraites, sinon git essaiera de fusionner les modifications dans leur (maintenant) divergence locale. Les dangers de ceci sont expliqués plus dans cette réponseEdit: Vous n'avez pas dit que vous aviez poussé à un repo public! Cela fait toute une différence.
Il y a deux façons, la voie "sale" et la voie "propre". Supposons que votre branche soit nommée
new-master
. C'est la voie propre:Cela fera changer les fichiers de configuration pour correspondre aux branches renommées.
Vous pouvez également le faire de manière sale, qui ne mettra pas à jour les fichiers de configuration. C'est un peu ce qui se passe sous le capot de ce qui précède ...
la source
git branch old-master master; git branch -f master new-master
. Créez une nouvelle branche de sauvegarde, puis déplacez directement le maître vers le nouveau maître. (Et désolé d'avoir mal orthographié votre nom, je viens de le remarquer)Renommez la branche
master
en:la source
git checkout master&&git reset --hard better_branch
?D'après ce que je comprends, vous pouvez brancher la branche actuelle dans une branche existante. En substance, cela remplacera
master
tout ce que vous avez dans la branche actuelle:Une fois que vous avez fait cela, vous pouvez normalement pousser votre
master
branche locale , nécessitant éventuellement le paramètre force ici également:Pas de fusion, pas de longues commandes. Simplement
branch
etpush
- mais, oui, cela réécrira l'historique de lamaster
branche, donc si vous travaillez en équipe, vous devez savoir ce que vous faites.Alternativement, j'ai trouvé que vous pouvez pousser n'importe quelle branche vers n'importe quelle branche distante, donc:
la source
J'ai trouvé la réponse que je voulais dans le blog Remplacez la branche principale par une autre branche dans git :
C'est essentiellement la même chose que la réponse de Cascabel . Sauf que l '"option" qu'il a ajoutée en dessous de sa solution est déjà intégrée dans mon bloc de code principal.
C'est plus facile à trouver de cette façon.
J'ajoute cela comme une nouvelle réponse, car si j'ai besoin de cette solution plus tard, je veux avoir tout le code que je vais utiliser dans un bloc de code.
Dans le cas contraire, je copier-coller, puis lire les détails ci - dessous pour voir la ligne que je devrais avoir changé - après avoir déjà exécutaient.
la source
Les solutions données ici (renommer la branche en 'master') n'insistent pas sur les conséquences pour le dépôt distant (GitHub):
Si d'autres ont déjà retiré votre référentiel, ils ne pourront pas extraire ce nouvel historique de maître sans remplacer leur propre maître par cette nouvelle branche principale de GitHub (ou gérer de nombreuses fusions).
Il existe des alternatives à git push --force pour les dépôts publics .
La réponse de Jefromi (fusionner les bons changements de retour au maître d'origine) est l'un d'entre eux.
la source
J'ai trouvé que cette méthode simple fonctionnait le mieux. Il ne réécrit pas l'historique et tous les enregistrements précédents de la branche seront ajoutés au maître. Rien n'est perdu et vous pouvez voir clairement ce qui s'est passé dans le journal de validation.
Objectif: faire de l'état actuel de la "branche" le "maître"
Travailler sur une branche, valider et pousser vos modifications pour vous assurer que vos référentiels locaux et distants sont à jour:
Après cela, votre maître sera l'état exact de votre dernière validation de branche et votre journal de validation maître affichera tous les enregistrements de la branche.
la source
On peut également extraire tous les fichiers de l'autre branche dans master:
puis validez toutes les modifications.
la source
Pour ajouter à la réponse de Jefromi, si vous ne voulez pas placer une fusion vide de sens dans l'historique de la
source
branche, vous pouvez créer une branche temporaire pour laours
fusion, puis la jeter:De cette façon, le commit de fusion n'existera que dans l'historique de la
target
branche.Alternativement, si vous ne voulez pas créer de fusion du tout, vous pouvez simplement récupérer le contenu de
source
et les utiliser pour un nouveau commit surtarget
:la source
Pour moi, je voulais que mon devl soit de retour au maître après qu'il était en avance.
Pendant le développement:
la source
Ma façon de faire est la suivante
la source
Si vous utilisez eGit dans Eclipse :
la source
Les étapes suivantes sont effectuées dans le navigateur Git alimenté par Atlassian (serveur Bitbucket)
Faire {current-branch} comme
master
master
et nommez-la «master-duplicate».la source