„Git cherry-pick“ sako: "... 38c74d yra sujungimas, bet pasirinkta ne-m galimybė"

Aš padariau tam tikrus pakeitimus savo pagrindiniame filiale ir noriu juos iškelti. kai aš pakabinu, pasirinkite šiuos įsipareigojimus, bet aš įstrigau fd9f578, kur git sako:

 $ git cherry-pick fd9f578 fatal: Commit fd9f57850f6b94b7906e5bbe51a0d75bf638c74d is a merge but no -m option was given. 

Kas yra git bando man pasakyti, ir kas yra vyšnios pasirinkti tinkamą dalyką, kurį čia naudoti? Pagrindinis filialas apima pakeitimus failuose, kurie buvo pakeisti ankstesnėje šakoje, todėl aš tikiu, kad bus keletas sujungimo konfliktų, tačiau tai nėra taip blogai ištiesinti. Žinau, kokie pakeitimai yra būtini.

Tai yra įsipareigojimai, kuriuos noriu atnešti aukštyn.

 e7d4cff added some comments... 23e6d2a moved static strings... 44cc65a incorporated test ... 40b83d5 whoops delete whitspace... 24f8a50 implemented global.c... 43651c3 cleaned up ... 068b2fe cleaned up version.c ... fd9f578 Merge branch 'master' of ssh://extgit/git/sessions_common 4172caa cleaned up comments in sessions.c ... 
348
10 февр. wufoo nustatytas vasario 10 d 2012-02-10 17:26 '12 at 17:26 pm 2012-02-10 17:26
@ 5 atsakymai

Tai, kaip dirbti su vyšnių derliaus nuėmimu, yra tai, kad ji naudoja diferencialą, kuris yra pokyčių rinkinys (skirtumas tarp darbo medžio šiame taške ir jo tėvų darbo medžio) ir jo taikymas jūsų dabartiniam filialui.

Taigi, jei fiksavime yra du ar daugiau tėvų, tai taip pat reiškia du ar daugiau skirtumų, kuriuos reikėtų taikyti?

Jūs bandote pasirinkti fd9f578 , kuris buvo sujungtas su dviem tėvais. Todėl jums reikia pasakyti vyšnių rinkikliui, kuris iš jų turėtų būti apskaičiuojamas naudojant parinktį -m . Pavyzdžiui, „ git cherry-pick -m 1 fd9f578 kaip pagrindą naudokite 1 git cherry-pick -m 1 fd9f578 tėvą.

Negaliu tiksliai pasakyti apie jūsų konkrečią situaciją, tačiau paprastai rekomenduojama naudoti git merge vietoj git cherry-pick . Kai pasirenkate susiliejimo fiksavimo vyšną, tai sumažina visus pakeitimus, padarytus pagrindiniame elemente, kurį nenurodėte -m , šiame viename skląstyje . Jūs prarasite visą savo istoriją ir sujungiate visus savo skirtumus. Jūsų skambutis

436
10 февр. Atsakymas pateikiamas Borealid 10 Vas. 2012-02-10 17:34 '12, 17:34, 2012-02-10 17:34

„@Borealid“ atsakymas yra teisingas, bet tarkime, kad nesvarbu, kaip išsaugoti tikslią šakos susiliejimo istoriją ir tiesiog norite pasirinkti jo linearizuotą versiją. Čia yra paprastas ir saugus būdas tai padaryti:

Pradinė būsena: esate X šakoje ir norite pasirinkti Y..Z

  1. git checkout -b tempZ Z
  2. git rebase Y
  3. git checkout -b newX X
  4. git cherry-pick Y..tempZ
  5. (pasirinktinai) git branch -D tempZ

Norėdami tai padaryti, jums reikia sukurti tempZ filialą, pagrįstą Z , bet su linearizuota istorija iš Y ir tada nukopijuoti ją į X kopiją, pavadintą newX . (Tai saugiau daryti naujame filiale, o ne mutuoti X ) Žinoma, 4 žingsnyje gali būti konfliktų, kuriuos turėsite išspręsti įprastu būdu ( cherry-pick rebase labai panašus į tai, kaip šiuo atveju yra rebase ). Galiausiai, ji ištrina tempZ filialą.

Jei 2 veiksme Y..Z pranešimas „Dabartinis tempZ filialas yra dabartinis“, tada Y..Z jau Y..Z tiesinis, todėl tiesiog ignoruokite šį pranešimą ir tęskite nuo 3 žingsnio.

Tada peržiūrėkite newX ir pažiūrėkite, ar tai, ko norėjote, newX .

(Pastaba: tai ne tas pats, kaip paprastas „ git rebase X Z šakose, nes jis nepriklauso nuo X ir Y santykių; gali būti, kad tarp bendrų protėvių ir Y kad jūs to nepadarėte), aš nenoriu.)

19
02 мая '16 в 22:03 2016-05-02 22:03 atsakymą pateikė Daira Hopwood 02 gegužės 16 d. 22:03 2016-05-02 22:03

Čia pateikiamas priimto atsakymo perrašymas, kuris puikiai paaiškina galimų metodų privalumus ir riziką:

Jūs bandote pasirinkti vyšnį fd9f578, kuris buvo susijungimas su dviem tėvais.

Vietoj to, kad rinktumėte vyšnį, paprasčiausias dalykas yra pasirinkti vyšną, kurį tikrai norite iš kiekvienos jungimo šakos.

Kadangi jau esate sujungę, greičiausiai visi jūsų įsipareigojimai yra jūsų sąraše. Pasirinkite juos tiesiogiai ir nereikia susisiekti su susijungimu.

paaiškinimas

Vyšnių rinkiklis veikia diferencialą, kuris reiškia pakeitimo rinkinį (skirtumą tarp darbo medžio šiame taške ir jo tėvo darbo medžio), ir pritaikydami pakeitimą, nustatytą dabartiniam filialui.

Jei įsipareigojimas turi du ar daugiau tėvų, kaip ir susijungimo atveju, šis įsipareigojimas taip pat reiškia du ar daugiau skirtumų. Klaida atsiranda dėl netikrumo, dėl kurio turėtų būti taikomas skirtumas.

alternatyvų

Jei nuspręsite, kad jums reikia įtraukti susijungimą, susijusį su pasirinktais vyšnių įsipareigojimais, turite dvi parinktis:

  1. (Sudėtingesnė ir neaiškesnė; taip pat pašalina istoriją) galite nurodyti, kuris iš tėvų kreiptis.

    • Norėdami tai padaryti, naudokite -m . Pavyzdžiui, „ git cherry-pick -m 1 fd9f578 naudos git cherry-pick -m 1 fd9f578 , nurodytą pirmuoju tėvų sąraše.

    • Taip pat atkreipkite dėmesį, kad pasirinkus susijungimą, jis sujungia visus pakeitimus, padarytus tėvui -m kurio nenurodėte, į -m į šį įvykį . Jūs prarasite visą savo istoriją ir visus jų skirtumus. Jūsų skambutis

  2. (Lengviau ir labiau susipažinę; taupo istoriją) galite naudoti git merge vietoj git cherry-pick .

    • Kaip įprasta „ git merge , ji bandys taikyti visus filiale esančius įsipareigojimus, kuriuos jūs prisijungiate, ir išvardyti juos atskirai savo git žurnale.
3
23 апр. Atsakymas pateikiamas Kay V 23 d. 2018-04-23 17:02 '18 at 17:02 pm 2018-04-23 17:02

-m reiškia tėvų numerį.

Nuo „Git Doc“:

Paprastai jūs negalite pasirinkti susijungimo, nes nežinote, kuri susijungimo pusė turėtų būti laikoma pagrindine. Ši parinktis nurodo pagrindinės linijos tėvų numerį (pradedant nuo 1) ir leidžia vyšnių rinkiniui atkurti pokyčius, susijusius su nurodytais tėvais.

Pavyzdžiui, jei jūsų įsipareigojimas yra toks, kaip parodyta toliau:

 - A - D - E - F - master \ / B - C branch one 

kai git cherry-pick E sukels problemą, su kuria susiduriate.

git cherry-pick E -m 1 reiškia „ DE , o „ git cherry-pick E -m 2 reiškia BCE .

0
09 дек. Atsakymą pateikė gavincook. 2018-12-09 17:50 '18 at 5:50 pm 2018-12-09 17:50

Supaprastinkite „@Daira Hopwood“ metodą pasirinkti vieną įvykį. Nereikia laikinų filialų.

Autoriaus atveju:

  • Z norima (fd9f578)
  • Y įsipareigokite prieš tai
  • X dabartinis darbo skyrius

tada atlikite:

 git checkout Z # move HEAD to wanted commit git reset Y # have Z as changes in working tree git stash # save Z in stash git checkout X # return to working branch git stash pop # apply Z to current branch git commit -a # do commit 
0
23 мая '18 в 9:49 2018-05-23 09:49 atsakymas duodamas efemerr 23 gegužės 18 d. 9:49 2018-05-23 09:49

Kiti klausimai apie žymas „ arba „ Užduoti klausimą“