Kā Git sistēmā pilnībā aizstāt galveno zaru no cita zara?

Man Git repozitorijā ir divas filiāles:

  1. master
  2. seotweaks (sākotnēji izveidota no master)

Es izveidoju seotweaks ar nolūku to ātri apvienot atpakaļ master. Tomēr tas notika pirms trim mēnešiem, un kods šajā atzarā ir par 13 versijām priekšā master.

Tā faktiski ir kļuvusi par mūsu galveno darba zaru, jo viss master kods tagad ir vairāk vai mazāk novecojis.

Ļoti slikta prakse, es zinu, mācība apgūta.

Vai jūs zināt, kā es varu aizstāt visu master filiāles saturu ar seotweaks filiāles saturu?

Es varētu vienkārši izdzēst visu, kas atrodas master, un apvienot, bet man tas nešķiet labākā prakse.

Risinājums

Jums vajadzētu būt iespējai izmantot "mūsu" apvienot stratēģiju, lai pārrakstītu master ar seotweaks, piemēram, šo:

git checkout seotweaks
git merge -s ours master
git checkout master
git merge seotweaks

Rezultātā jūsu master tagad būtībā ir seotweaks.

(-s mūsu ir saīsinājums no --stratēģija=mūsu).

No dokumentiem par stratēģiju 'ours':

Tas atrisina jebkuru zaru galvu skaitu, bet apvienošanas rezultātā iegūtais koks vienmēr ir pašreizējās zara galvas koks, efektīvi ignorējot visas izmaiņas no visiem pārējiem zariem. To paredzēts izmantot, lai aizstātu sānu zaru veco attīstības vēsturi. Ņemiet vērā, ka tas atšķiras no rekursīvās apvienošanas stratēģijas opcijas -Xours.

Atjauninājums no komentāriem: Ja saņemat fatālu rezultātu: atsaka apvienot nesaistītas vēstures, tad mainiet otro rindu uz šādu: git merge --allow-unrelated-histories -s ours master

Komentāri (39)

Ko darīt, izmantojot git branch -m, lai pārdēvētu master atzaru par citu, un pēc tam pārdēvēt seotweaks atzaru par master? Kaut kā šādi:

git branch -m master old-master
git branch -m seotweaks master
git push -f origin master

Tas var dzēst oriģinālajā master esošās izmaiņas, lūdzu, pārbaudiet savu oriģinālo master pirms git push -f origin master.

Komentāri (16)

Jūs varat pārdēvēt/pārcelt master uz attālināto, bet tas radīs problēmas, ja daudzi cilvēki ir balstījuši savu darbu uz attālināto master atzaru un ir ievilkuši šo atzaru savā lokālajā repo.
Šajā gadījumā tā varētu nebūt, jo šķiet, ka visi strādā ar zaru 'seotweaks'.

Tādā gadījumā jūs varat:
git remote --show var nedarboties. (Veiciet git remote show, lai pārbaudītu, kā jūsu tālvadība ir deklarēta jūsu lokālajā repā. Es pieņemu 'origin')
(Attiecībā uz GitHub, house9 komentārs: "Man bija jāveic vēl viens papildu solis, GitHub nospiežot 'Admin' pogu un iestatot 'Default Branch' uz kaut ko citu, nevis 'master', pēc tam pēc tam atkal to ievietot atpakaļ"))

git branch -m master master-old  # rename master on local
git push origin :master          # delete master on remote
git push origin master-old       # create master-old on remote
git checkout -b master seotweaks # create a new local master on top of seotweaks
git push origin master           # create master on remote

Bet atkal:

  • Ja citi lietotāji mēģina pull, kamēr master ir dzēsts uz tālvadības pults, viņu pulls būs neveiksmīgs ("nav šādu ref uz tālvadības pults")
  • ja attālajā tālvadības pults tiek atjaunots master, pull lietotājs mēģinās apvienot jauno master ar savu vietējo (tagad veco) master: daudzi konflikti. Patiesībā viņiem ir jāatjauno vietējais master uz attālināto/galveno zaru, ko viņi ievilks, un jāaizmirst par savu pašreizējo master.
Komentāri (6)