web-dev-qa-db-fra.com

Faire de la branche Git actuelle une branche principale

J'ai un référentiel dans Git. J'ai créé une branche, puis apporté quelques modifications à la fois au maître et à la branche.

Puis, des dizaines d’engagements plus tard, j’ai réalisé que la branche était dans un état bien meilleur que le maître; j’aimerais donc que la branche "devienne" le maître et ne tienne pas compte des modifications apportées au maître.

Je ne peux pas le fusionner, car je ne veux pas garder les modifications sur le maître. Que devrais-je faire?

Extra: Dans ce cas, le 'vieux' maître a déjà été Push- édité dans un autre référentiel tel que GitHub. Comment cela change-t-il les choses?

1505
Karel Bílek

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. Par conséquent, lorsque vous appuyez sur Push, tous les autres se fâchent. Voici 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'ajouter des informations au message de validation de fusion afin de préciser ce que vous avez fait. Remplacez la deuxième ligne par:

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

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

git checkout master

Remplacez "master" par "better_branch":

git reset --hard better_branch

Forcez le Push vers votre référentiel distant:

git Push -f Origin master
295
Brandon Howard

Edit: Vous n'avez pas dit que vous aviez poussé à un dépôt public! Cela fait un monde de différence.

Il y a deux manières, la "sale" et la "propre". Supposons que votre branche s'appelle 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 modifiera les fichiers de configuration pour qu'ils correspondent aux branches renommées.

Vous pouvez aussi le faire de manière sale, sans mettre à 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
68
Dietrich Epp

Renommez la branche en master en:

git branch -M branch_name master
42

D'après ce que j'ai compris, vous pouvez créer une branche dans une branche existante. Essentiellement, cela écrasera master avec tout ce que vous avez dans la branche actuelle:

git branch -f master HEAD

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

git Push -f Origin master

Pas de fusion, pas de longues commandes. Simplement branch et Push— mais oui, cela réécrira l'historique de la branche master, donc si vous travaillez en équipe, vous devez savoir quoi tu fais.




Alternativement, j'ai trouvé que vous pouvez pousser n'importe quelle branche vers n'importe quelle branche 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
21
fregante

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 vous n'avez rien fait depuis que vous avez créé cette branche, vous pouvez la renommer et pousser sans problème.
  • si vous avez eu Push master sur GitHub, vous devrez "git Push -f" la nouvelle branche: vous ne pouvez plus appuyer en mode avance rapide .
 -f 
 --force 

Généralement, 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. Cet indicateur désactive le contrôle. Cela peut entraîner la perte de validations du référentiel distant. utilisez-le avec précaution.

Si d'autres personnes ont déjà extrait votre référentiel, ils ne pourront pas extraire ce nouvel historique maître sans remplacer leur propre maître par cette nouvelle branche principale GitHub (ou gérer beaucoup de fusions).
Il y a alternatives à un git Push - Force pour les dépôts publics .
réponse de Jefromi (fusionner les modifications correctes dans le maître d'origine) en fait partie.

13
VonC

J'ai trouvé cette méthode simple pour travailler au 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 "branche" le "maître"

En travaillant sur une branche, validez et appliquez 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 branche et votre journal de validation principal affichera tous les enregistrements de la branche.

11
Mark Dietel

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

git checkout master
git checkout better_branch -- .

puis commettez tous les changements.

9
user2064284

J'ai trouvé la réponse que je voulais dans l'article du blog remplacez la branche principale par une autre branche 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 chose que réponse de Cascabel . Sauf que l'option "il a ajouté ci-dessous 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, parce que si j'ai besoin de cette solution plus tard, je veux avoir tout le code I vais utiliser dans un bloc de code.

Sinon, je peux copier-coller, puis lire les détails ci-dessous pour voir la ligne que je devrais ont changé - après que je l'ai déjà exécuté.

8
SherylHohman

Pour ajouter à la réponse de Jefromi, si vous ne souhaitez pas placer une fusion sans signification dans l'historique de la branche source, vous pouvez créer une branche temporaire pour la fusion ours, puis la jeter:

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

Ainsi, le commit de fusion n'existera que dans l'historique de la branche target.

Sinon, 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 sur target:

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

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
1
ar-g

Si vous utilisez eGit dans Eclipse:

  • Faites un clic droit sur le nœud du projet.
  • Choisissez Équipe → puis Avancé → puis Renommer la branche
  • Puis développez le dossier suivi à distance.
  • Choisissez la branche 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.
1
Junchen Liu

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

Création de {branche actuelle} comme master

  1. Créez une branche à partir de master et nommez-la “duplicata-maître”.
  2. Créez une branche à partir de {current-branch} et nommez-la “{current-branch} -copy”.
  3. Dans les paramètres du référentiel (Bitbucket), changez “Branchement par défaut” pour qu'il pointe sur “maître-dupliqué” (sans cette étape, vous ne pourrez pas supprimer maître - “À l'étape suivante”).
  4. Supprimer la branche "maître" - J'ai effectué cette étape à partir de l'arborescence source (vous pouvez le faire à partir de la CLI ou du navigateur Git).
  5. Renommez "{current-branch}" en "master" et "Push to repository" (cela créera une nouvelle branche "principale", mais "{current-branch}" existera).
  6. Dans les paramètres du référentiel, changez "Branche par défaut" pour pointer sur "maître".
0
Purushothaman