Hvordan erstatte master-grenen i Git helt og holdent fra en annen gren?

Mulig duplikat:

Jeg har to grener i Git-arkivet mitt:

  1. master.
  2. seotweaks (opprinnelig opprettet fra master)

Jeg opprettet seotweaks med den hensikt å raskt flette den tilbake til master. Det er imidlertid tre måneder siden, og koden i denne grenen ligger 13 versjoner foran master.

Den har i praksis blitt vår fungerende master-gren, ettersom all koden i master er mer eller mindre foreldet nå.

Veldig dårlig praksis, jeg vet det, men jeg har lært av det.

Vet du hvordan jeg kan erstatte alt innholdet i master-grenen med innholdet i seotweaks?

Jeg kunne bare slette alt i master og slå sammen, men dette føles ikke som beste praksis.

Løsning

Du bør kunne bruke "vår" flettestrategi for å overskrive master med seotweaks som dette:

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

Resultatet bør være at masteren din nå i hovedsak er seotweaks.

(-s our er en forkortelse for --strategy=ours).

Fra the docs om 'ours' strategien:

Dette løser opp et hvilket som helst antall hoder, men det resulterende treet av sammenslåingen er alltid det av det nåværende grenhodet, og ignorerer effektivt alle endringer fra alle andre grener. Den er ment å brukes til å erstatte gammel utviklingshistorikk for sidegrener. Merk at dette er forskjellig fra -Xours-alternativet til den rekursive sammenslåingsstrategien.

Oppdatering fra kommentarer: Hvis du får fatal: refusing to merge unrelated histories, så endre den andre linjen til denne: git merge --allow-unrelated-histories -s ours master.

Kommentarer (39)

Hva med å bruke git branch -m for å omdøpe master-grenen til en annen, og deretter omdøpe seotweaks-grenen til master? Noe sånt som dette:

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

Dette kan fjerne commits i origin master, vennligst sjekk origin master før du kjører git push -f origin master.

Kommentarer (16)

Du kan gi nytt navn til/fjerne master på remote, men dette vil være et problem hvis mange har basert arbeidet sitt på den eksterne master-grenen og har hentet den inn i sitt lokale repo.
Det er kanskje ikke tilfelle her, siden alle ser ut til å jobbe på grenen 'seotweaks'.

I så fall kan du gjøre det:
git remote --show fungerer kanskje ikke. (Gjør en `git remote show for å sjekke hvordan din remote er deklarert i ditt lokale repo. Jeg vil anta 'origin')
(Når det gjelder GitHub, house9 kommenterer: "Jeg måtte gjøre ett ekstra trinn, klikke på 'Admin' -knappen på GitHub og sette 'Default Branch' til noe annet enn 'master', og deretter sette den tilbake etterpå")

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

Men igjen:

  • hvis andre brukere prøver å pull'e mens master er slettet på remote, vil deres pulls mislykkes ("no such ref on remote")
  • når master er gjenskapt på remote, vil en pull forsøke å slå sammen den nye master på deres lokale (nå gamle) master: mange konflikter. De må faktisk reset --hard sin lokale master til remote/master-grenen de vil hente, og glemme sin nåværende master.
Kommentarer (6)