41 votes

Nettoyer la branche master de git et déplacer certains commit vers une nouvelle branche ?

J'ai un clone d'un repo sur Github dans lequel j'ai créé une nouvelle fonctionnalité pour upstream. Le problème est que j'ai fait cela dans ma branche principale qui contient également d'autres choses que j'ai tirées d'autres clones. Cela a totalement brisé ma capacité à créer une demande de pull raisonnable.

Je veux donc faire ce qui suit :

  1. Restaurer ma branche master pour qu'elle soit exactement la même que la branche master amont.
  2. Créer une nouvelle branche.
  3. Déplacer certains de mes anciens commits vers la nouvelle branche.
  4. Créer une demande de retrait de la branche.

Et, à l'avenir, je ferai tout mon travail dans des branches et je créerai des demandes de retrait à partir de celles-ci, tout en laissant ma branche principale seule et en fusionnant simplement tout ce qui vient de l'amont.

Mes questions sont les suivantes :

  1. S'agit-il d'une approche raisonnable ?
  2. Comment dois-je procéder pour réaliser les étapes 1 et 3 ?

0 votes

J'ai une nouvelle branche avec mes vieux trucs maintenant et en fait je veux juste me débarrasser de mon origin/master et le créer frais en récupérant tout d'upstream/master tel quel et en le poussant dans mon master... comment je fais ça... je n'ai aucune chance avec tout ça.

68voto

wewals Points 1035

Créez une nouvelle branche pour contenir vos affaires

$ git branch old_master

Envoyer à distance pour la sauvegarde (juste au cas où)

$ git checkout old_master
$ git push origin old_master

Réinitialisation du master local au commit avant que vous ne commenciez à modifier des choses.

$ git checkout master
$ git reset --hard 037hadh527bn

Fusionner les modifications apportées par en amont maître

$ git pull upstream master

Maintenant, DELETE master sur le repo distant

Sur github, cela ne fonctionnera pas sans aller d'abord dans la section d'administration du fork et définir la branche par défaut à autre chose que master temporairement, car ils essaient de vous protéger contre la destruction des choses.

$ git push origin :master

Et le recréer

$ git push origin master

Sur github, vous devez maintenant remettre la branche par défaut à master.

0 votes

+1 pour le conseil de github. Un jour, je leur serai peut-être reconnaissant d'avoir essayé de sauver mes arrières, mais cette fois, contourner leur protection était ce dont j'avais besoin ;)

0 votes

J'ai été un peu confus à la git pull upstream master section. J'ai fait ce qui suit à la fin, ce qui semble fonctionner pour moi. git pull https://github.com/project/project.git master

0 votes

Comment trouver la section d'administration sur github ?

9voto

Novelocrat Points 12126

C'est presque une approche raisonnable, mais vous prenez peut-être les choses un peu dans le désordre. La première chose à faire est de créer une nouvelle branche où votre actuel master afin de ne pas perdre la référence pratique au travail que vous avez déjà effectué :

git branch mywork-orig master

Après cela, vous pouvez réinitialiser master à la vue de l'amont (en supposant que vous avez master vérifié) :

git reset --hard origin/master

Ensuite, vous pouvez créer votre propre branche avec les changements prévus :

git checkout -b mywork

Faites les changements que vous voulez (en les reprenant de mywork-orig, etc.), et envoyez une demande de modification pour cela.

0 votes

La réinitialisation n'a pas fonctionné. J'ai ensuite essayé de faire une réinitialisation vers upstream/master puisque c'est ce que je veux. Je veux tirer dans upstream/master dans ma branche master locale et ensuite pousser cela sur o origin/master (qui est mon clone github lui-même).

0 votes

N'oubliez pas git reflog pour vous sortir d'un pétrin !

5voto

Trev Norris Points 2686

C'est un peu tard, mais je n'ai vu personne suggérer cette méthode beaucoup plus simple :

# make sure we're in master
git checkout master
# create new branch from current master
git branch tmp_master
# grab most recent changes from upstream w/o applying them
git fetch upstream
# force reset local master to match upstream/master
git reset --hard upstream/master

Vous avez enregistré vos modifications locales dans tmp_master et ont forcé la mise à jour master pour correspondre à la plus récente upstream/master . Maintenant pour obtenir origin/master On dirait que upstream/master :

git push -f origin master

Maintenant, allez-y et cherry-pick les commits, ou rebase les changements en plus de l'actuel master . Après quoi, vous aurez déjà votre nouvelle branche devel.

Ce que vous vouliez faire est tout à fait possible, mais pas dans l'ordre que vous avez demandé. Et il semble que les autres aient oublié que vous pouvez fetch des changements à distance sans les appliquer réellement. Cela rend la vie beaucoup plus simple.

3voto

Talljoe Points 8423
  1. git reset origin/master
  2. git checkout -b new-branch
  3. git cherry-pick <hash> pour chaque livraison
  4. créer votre demande de pull.

Vous pouvez aussi le faire :

  • git checkout -b new-branch
  • git rebase -i origin/master
  • (choisissez vos commits)
  • git checkout master
  • git reset origin/master

0 votes

git rebase -i est une chose étonnante. Cela peut être un peu difficile au début, mais cela vaut la peine d'apprendre.

0 votes

Rebase m'a conduit dans un rathole de fusions et de conflits et à la fin j'avais une branche master non fonctionnelle localement qui avait encore quelques vieux trucs de mes commits que je ne voulais pas.

0 votes

Première règle : ne jamais travailler directement dans le master. De cette façon, si (quand) vous faites des erreurs, il est facile de créer une nouvelle branche dans master et de réessayer. Si vous remarquez, les instructions de Talljoe vous demandent explicitement de faire un checkout d'une nouvelle branche pour faire cela, et de réinitialiser votre master local à l'endroit où se trouve le master de votre distant.

2voto

Dominic Mitchell Points 5719

Según git push vous pouvez utiliser git push origin +dev:master à :

Mise à jour de la branche master du dépôt d'origine avec la branche dev, permettant des mises à jour non rapides. Cela peut laisser des commits non référencés en suspens dans le dépôt d'origine.

Je ne suis pas certain que cela fonctionne avec github. Je n'ai rien à effacer pour le moment :)

Il devrait vous permettre de faire votre local maître comme vous le souhaitez en utilisant git rebase -i puis de pousser le résultat sur github.


Vous pouvez également supprimer la branche master sur github ( git push origin :master ) puis le repeupler à partir de votre master local, corrigé. J'ai l'impression que github peut vous empêcher de faire cela si c'est la branche par défaut (comme maître l'est probablement). Si c'est le cas, allez dans la section d'administration de votre dépôt et changez temporairement la branche par défaut pour une autre branche.

0 votes

Un moyen très efficace et simple de remplacer la branche principale par une autre. Merci beaucoup !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X