web-dev-qa-db-fra.com

Git - Déplacement des validations poussées vers une autre branche

Mon patron a récemment décidé d'essayer un groupe d'externalisation "pour une capacité accrue" alors que nous modifions une application existante pour ajouter de nouvelles fonctionnalités. Malgré ma crainte que le groupe qu'il a choisi ne semble pas bien communiquer et ne pose pas suffisamment de questions pour vraiment comprendre et être efficace, nous sommes quand même allés avec eux.

Nous les avons configurés pour collaborer sur notre référentiel Git (hébergé sur GitHub). Nous avons créé une branche juste pour eux (TheOutsourcedBranch, nous l'appellerons) et leur avons demandé de faire tout leur travail au sein de cette branche.

De plus, nous leur avons demandé de pousser leurs commits à la fin de chaque journée afin que nous puissions avoir une idée décente de leur rapidité et (plus important encore) de la qualité de leur code.

Aujourd'hui, ils ont poussé pour la première fois. Cinq commits, tous en master. J'essaie de comprendre comment déplacer leurs commits de master vers TheOutsourcedBranch, sans perdre le travail qu'ils ont fait (bien qu'à première vue, nous devrons tout de même le jeter).

Visual Reference -- Orange dots are their commits, gray are mine.

Les points oranges sont leurs engagements, les points gris sont les miens.

Je sais qu'il y a un million de questions sur le rebasage (et c'est peut-être ce que je dois faire ici), mais j'ai du mal à déterminer lesquelles s'appliquent à mon cas spécifique. Et si cela est important, le groupe d'impartition et moi-même sommes les seules personnes qui utilisent vraiment le repo en ce moment.

Merci d'avance!


Edit: J'ai peut-être trouvé ce que je cherchais: Déplacer le (s) dernier (s) commit (s) vers une nouvelle branche avec Git

J'aimerais cependant vérifier ma compréhension. Localement, je crée une branche hors master (TheOutsourcedBranch), qui contiendrait tout A-H. Ensuite, je remets le maître à C. Le maître contiendrait maintenant A-C.

En supposant que c'est correct, ce serait bien pour moi (localement). Mais alors, que dois-je faire pour "forcer" le référentiel distant (GitHub) à accepter ma vision locale de la façon dont les choses se sont déroulées et à rejeter sa version de l'histoire?

Une fois que cela s'est déroulé, je pense que je peux retravailler cette question pour la rendre plus générique/informative et éliminer les peluches - sinon c'est probablement un bon candidat pour la suppression, je suppose.

41
Anthony Compton

Obtenir la succursale est facile:

git branch their-branch master
git reset --hard master $SHA1_OF_C
git Push --force $SHARED_REPO_REMOTE

Cela réécrira l'histoire; il crée une nouvelle branche équivalente à la branche principale actuelle nommée their-branch, puis réinitialise votre maître local pour pointer vers un SHA1 aléatoire (... ou branche, ou balise, ou autre), et enfin met à jour de force la branche du référentiel distant pour correspondre à votre branche locale.

Cela fournit exactement la situation que vous souhaitez.

Avertissements: cela réécrira l'histoire et peut foutre en l'air tous ceux qui ont bâti l'ancien maître. Attention aux problèmes de fusion suivants.

Aucun rebasage souhaité ou requis.

(En passant, je vous suggère soit de leur donner un référentiel intermédiaire, soit de leur faire utiliser git send-email, ou utilisez les requêtes d'extraction GitHub, ou empêchez-les autrement de pousser vers le master jusqu'à ce qu'elles obtiennent le bon résultat. D'après votre résumé, cela pourrait prendre du temps.)

51
Daniel Pittman