Cum pentru a înlocui ramura master in Git, în întregime, dintr-o altă ramură?

Am două ramuri în depozit Git:

  1. "maestru"
  2. seotweaks (creat inițial de la "maestru")

Am creat `seotweaks cu intenția de rapid absorbit înapoi în "maestru". Cu toate acestea, în urmă cu trei luni și codul în această ramură este de 13 versiuni înainte de "maestru".

Acesta a devenit efectiv nostru de lucru master de ramură ca tot codul în "maestru" este mai mult sau mai puțin învechit acum.

Foarte rău practică știu, am învățat lecția.

Știi cum mă poate înlocui toate din conținutul de "maestru" ramură cu cei din seotweaks?

Aș putea șterge totul în "maestru" și merge, dar asta nu pare a fi cea mai bună practică.

Comentarii la întrebare (6)
Soluția

Tu ar trebui să fie capabil de a utiliza "noastra" merge o strategie pentru a suprascrie master cu seotweaks astfel:

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

Rezultatul ar trebui să fie stăpânul tău este acum în esență seotweaks.

(-e al nostru este prescurtarea de la --strategie de=al nostru)

De la documente despre 'nostru' strategie:

Acest lucru rezolvă orice număr de capete, dar arborele rezultat din fuziunea este întotdeauna de curent sucursala cap, ignorând în mod eficient toate modificările de toate celelalte ramuri. Acesta este menit să fie folosit pentru a înlocui vechea istorie de dezvoltare de ramuri laterale. Rețineți că acest lucru este diferit de -Xours opțiunea de a recursive merge strategia.

Actualizare de la comentarii: Dacă ai fi fatala: refuzul de a merge fără legătură istorii, apoi schimba linia a doua la acest lucru: git `merge ... permite-independenți-istorii -s ale noastre de master

Comentarii (39)

Ce despre utilizarea git branch -m pentru a redenumi ramura de master la altul, apoi redenumiți seotweaks ramură a stăpâni? Ceva de genul asta:

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

Acest lucru ar putea elimina angajează în origine master, vă rugăm să verificați origine maestru înainte de a rula `git push-f origine master.

Comentarii (16)

Puteți redenumi/șterge master la distanță, dar acest lucru va fi o problemă dacă o mulțime de oameni și-au bazat munca pe master la distanță de ramură și-au retras această sucursală în lor locale repo. Asta s-ar putea să nu fie cazul aici deoarece toată lumea pare a fi de lucru pe ramură 'seotweaks'.

În acest caz, puteți: git remote-arată-ar putea să nu funcționeze. (Face o git remote show pentru a verifica modul de la distanță este declarat în termen locale repo. Voi presupune ' "origine" ') (Cu privire la GitHub, house9 comentarii: "am avut de a face un pas suplimentar, faceți clic pe ' "Admin" ' buton de pe GitHub și a stabilit 'Default Ramură' de ' "maestru" ', apoi pune-l înapoi")

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

Dar, din nou:

  • dacă alți utilizatori să încercați pentru a trage în timp ce maestru este șters de pe telecomanda, trageri lor va eșua ("nu există un astfel de ref de la distanță")
  • când maestrul este recreat de la distanță, o trage va încerca să fuzioneze că noul stăpân asupra lor locale (acum în vârstă) master: o mulțime de conflicte. De fapt, au nevoie să resetați greu` lor locale master la distanță/master ramură vor aduce, și să uitați despre actuala lor maestru.
Comentarii (6)

Din seotweaks a fost inițial creat ca o ramură de "maestru", care fuzionează înapoi este o idee bună. Cu toate acestea, dacă sunteți într-o situație în care una din ramuri nu este cu adevărat o ramură de "stăpân" sau istoria ta este atât de diferită că vrei doar să șteargă "maestru" sucursală în favoarea nouă ramură care le'am fost faci munca pe puteți face acest lucru:

git push [-f] origin seotweaks:master

Acest lucru este util mai ales dacă primiți această eroare:

! [remote rejected] master (deletion of the current branch prohibited)

Și nu utilizați GitHub și don't au acces la "Administrare" tab pentru a schimba implicit branch pentru datele depozit la distanță. În plus, asta nu't provoca sau condițiile de rasă ca s-ar putea întâlni de ștergerea de master:

git push origin :master
Comentarii (4)

Am găsit acest lucru să fie cel mai bun mod de a face acest lucru (am avut o problema cu serverul meu nu mă lasă să ștergeți).

Pe serverul care găzduiește cel de "origine" repository, tastați următoarea dintr-un director în depozit:

git config receive.denyDeleteCurrent ignore

Pe stația dumneavoastră de lucru:

git branch -m master vabandoned                 # Rename master on local
git branch -m newBranch master                  # Locally rename branch newBranch to master
git push origin :master                         # Delete the remote's master
git push origin master:refs/heads/master        # Push the new master to the remote
git push origin abandoned:refs/heads/abandoned  # Push the old master to the remote

Înapoi pe serverul care găzduiește cel de "origine" depozit:

git config receive.denyDeleteCurrent true

Credit pentru autor de blog http://www.mslinn.com/blog/?p=772

Comentarii (3)