Faire de la twig Git actuelle une twig maîtresse

J’ai un repository dans Git. J’ai créé une succursale, puis apporté des modifications à la fois au maître et à la twig.

Ensuite, des dizaines de commits plus tard, j’ai réalisé que la twig est en meilleur état que le maître, donc je veux que la twig «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 le maître. Que devrais-je faire?

Extra : Dans ce cas, l’ancien maître a déjà été transféré vers un autre référentiel tel que GitHub. Comment cela change-t-il les choses?

Le problème avec les deux autres réponses est que le nouveau maître n’a pas l’ancien maître en tant qu’ancêtre, alors quand vous le poussez, tout le monde va se faire avoir. C’est ce que vous voulez faire:

 git checkout better_branch git merge --strategy=ours master # keep the content of this branch, but record a merge git checkout master git merge better_branch # fast-forward master up to the merge 

Si vous voulez que votre historique soit un peu plus clair, je vous recommande d’append des informations au message de validation de fusion afin de clarifier ce que vous avez fait. Changer la deuxième ligne à:

 git merge --strategy=ours --no-commit master git commit # add information to the template merge message 

Assurez-vous que tout est transféré dans votre référentiel distant (GitHub):

 git checkout master 

Ecraser “master” avec “better_branch”:

 git reset --hard better_branch 

Forcez la poussée sur votre référentiel distant:

 git push -f origin master 

Edit: Vous n’avez pas dit que vous aviez poussé à un repo public! Cela fait un monde de différence.

Il y a deux manières, la manière “sale” et la manière “propre”. Supposons que votre twig soit nommée new-master . C’est la manière propre:

 git checkout new-master git branch -m master old-master git branch -m new-master master # And don't do this part. Just don't. But if you want to... # git branch -d --force old-master 

Cela fera que les fichiers de configuration changeront pour correspondre aux twigs renommées.

Vous pouvez aussi le faire à la va-vite, 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 …

 mv -i .git/refs/new-master .git/refs/master git checkout master 

Renommez la twig à master par:

 git branch -M branch_name master 

Les solutions données ici (renommer la twig dans ‘master’) n’insistent pas sur les conséquences pour le référentiel distant (GitHub):

  • Si vous n’avez rien poussé depuis la création de cette twig, vous pouvez la renommer et la pousser sans problème.
  • Si vous aviez un maître push sur GitHub, vous devrez pousser la nouvelle twig: vous ne pouvez plus pousser en mode avance rapide .
     -F
     --Obliger

Habituellement, la commande refuse de mettre à jour une référence distante qui n’est pas un ancêtre de la référence locale utilisée pour la remplacer. Ce drapeau désactive le contrôle. Cela peut entraîner une perte de validation pour le référentiel distant. utilisez-le avec précaution.

Si d’autres ont déjà retiré votre repository, ils ne pourront pas récupérer ce nouvel historique sans remplacer leur propre maître par cette nouvelle twig principale GitHub (ou gérer de nombreuses fusions).
Il existe des alternatives à la poussée des git –force pour les repos publics .
La réponse de Jefromi (la fusion des bons changements au master original) en fait partie.

D’après ce que j’ai compris, vous pouvez diviser la twig actuelle en une twig existante. En résumé, cela écrasera master avec tout ce que vous avez dans la twig en cours:

 git branch -f master HEAD 

Une fois que vous avez fait cela, vous pouvez normalement pousser votre twig master locale, nécessitant éventuellement le paramètre de force ici aussi:

 git push -f origin master 

Pas de fusion, pas de commandes longues. Simplement branch et push – mais, oui, cela réécrira l’historique de la twig principale, donc si vous travaillez en équipe, vous devez savoir ce que vous faites.




Alternativement, j’ai trouvé que vous pouvez pousser n’importe quelle twig vers n’importe quelle twig distante, donc:

 # This will force push the current branch to the remote master git push -f origin HEAD:master # Switch current branch to master git checkout master # Reset the local master branch to what's on the remote git reset --hard origin/master 

On peut aussi extraire tous les fichiers de l’autre twig dans master:

 git checkout master git checkout better_branch -- . 

puis validez tous les changements.

J’ai trouvé cette méthode simple pour travailler le mieux. Il ne réécrit pas l’historique et tous les enregistrements antérieurs de la twig seront ajoutés au fichier maître. Rien n’est perdu et vous pouvez voir clairement ce qui s’est passé dans le journal de validation.

Objectif: Rendre l’état actuel de “twig” le “maître”

En travaillant sur une twig, validez et poussez vos modifications pour vous assurer que vos référentiels locaux et distants sont à jour:

 git checkout master # Set local repository to master git reset --hard branch # Force working tree and index to branch git push origin master # Update remote repository 

Après cela, votre maître sera l’état exact de votre dernière validation de twig et votre journal de validation maître affichera toutes les entrées de la twig.

Pour append à la réponse de Jefromi, si vous ne voulez pas placer de fusion insignifiante dans l’historique de la twig source , vous pouvez créer une twig temporaire pour ours fusion, puis la jeter:

 git checkout  git checkout -b temp # temporary branch for merge git merge -s ours  # create merge commit with contents of  git checkout  # fast forward  to merge commit git merge temp # ... git branch -d temp # throw temporary branch away 

De cette façon, la validation de fusion n’existera que dans l’historique de la twig target .

Alternativement, si vous ne voulez pas créer de fusion du tout, vous pouvez simplement saisir le contenu de la source et l’utiliser pour une nouvelle validation sur la target :

 git checkout  # fill index with contents of  git symbolic-ref HEAD  # tell git we're committing on  git commit -m "Setting contents to " # make an ordinary commit with the contents of  

J’ai trouvé la réponse que je voulais dans l’article de blog Remplacez la twig principale par une autre twig dans git :

 git checkout feature_branch git merge -s ours --no-commit master git commit # Add a message regarding the replacement that you just did git checkout master git merge feature_branch 

C’est essentiellement la même que la réponse de Cascabel . Sauf que l’option qu’il a ajoutée sous 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 ceci 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.

Sinon, je peux copier-coller, puis lire les détails ci-dessous pour voir la ligne que j’aurais dû changer – après l’avoir déjà exécutée.

Ma façon de faire les choses est la suivante

 #Backup branch git checkout -b master_backup git push origin master_backup git checkout master #Hard Reset master branch to the last common commit git reset --hard e8c8597 #Merge git merge develop 

Si vous utilisez eGit dans Eclipse :

  • Faites un clic droit sur le noeud du projet.
  • Choisissez Equipe → puis Avancé → puis Renommez la twig
  • Ensuite, développez le dossier de suivi à distance .
  • Choisissez la twig avec le mauvais nom, puis cliquez sur le bouton Renommer, renommez-le quel que soit le nouveau nom.
  • Choisissez le nouveau maître, puis renommez-le en maître.

Les étapes suivantes sont effectuées dans le navigateur Git optimisé par Atlassian (serveur Bitbucket).

Créer {twig-actuelle} comme master

  1. Faites une twig de master et nommez-la «master-duplicate».
  2. Créez une twig à partir de {current-branch} et nommez-la “{current-branch} -copy”.
  3. Dans le paramètre de référentiel (Bitbucket), remplacez «Branche par défaut» par «Master-duplicate» (sans cette étape, vous ne pourrez pas supprimer le master – «Dans l’étape suivante»).
  4. Supprimer la twig «master» – J’ai fait cette étape depuis l’arbre source (vous pouvez le faire depuis le navigateur CLI ou Git)
  5. Renommez “{current-branch}” en “master” et poussez dans le repository (cela créera une nouvelle twig “master” mais “{current-branch}” existera).
  6. Dans les parameters du référentiel, changez «Branche par défaut» pour pointer sur «maître».