Sujunkite du pirmuosius „Git“ saugyklos įrašus?

Tarkime, kad turite istoriją, kurioje yra trys įsipareigojimai A, B ir C :

 ABC 

Aš norėčiau sujungti du komitetus A ir B su vienu skląsčiu AB :

 AB-C 

Aš bandžiau

 git rebase -i A 

kuris atidaro mano redaktorių tokiu turiniu:

 pick e97a17b B pick asd314f C 

Aš jį pakeisiu

 squash e97a17b B pick asd314f C 

Tada Git 1.6.0.4 sako:

 Cannot 'squash' without a previous commit 

Ar yra būdas, ar tai tiesiog neįmanoma?

172
12 янв. nustatė krikščionis sausio 12 d 2009-01-12 17:53 '09, 17:53, 2009-01-12 17:53
@ 7 atsakymai

Naudokite „ git rebase -i --root su „Git“ versija 1.7.12 .

Internetinės perrašymo rinkmenoje pakeiskite antrą eilutę, skirtą „B“, kad jis būtų skvošas, o likusias eilutes palikite pasirinkimo meniu:

 pick f4202da A squash bea708e B pick a8c6abc C 

Tai apjungs du A ir B įsipareigojimus su viena AB fiksacija.

Rasta šiame atsakyme .

130
09 февр. atsakymas, kurį pateikė kostmo 09 vasaris 2014-02-09 05:14 '14 at 5:14 2014-02-09 05:14

Ar bandėte:

 git rebase -i A 

Tokiu būdu galite pradėti, jei tęsiate edit o ne squash :

 edit e97a17b B pick asd314f C 
border=0

tada paleiskite

 git reset --soft HEAD^ git commit --amend git rebase --continue 

Padaryta.

124
12 февр. David Lichteblau atsakymas vasario 12 d. 2009-02-12 17:29 '09, 17:29, 2009-02-12 17:29

A buvo pradinis įsipareigojimas, bet dabar norite, kad B originalus įsipareigojimas. „git“ įsipareigoja būti visiški medžiai, o ne skirtumai, net jei jie paprastai apibūdinami ir vertinami pagal jų pateiktus skirtumus.

Šis receptas veikia net jei tarp A ir B, B ir C yra keli įsipareigojimai.

61
12 янв. Charles Bailey atsakymas sausio 12 d 2009-01-12 21:46 '09 9:46 PM 2009-01-12 21:46

Jei diegiate internetu, turite tai padaryti prieš A, kad sąrašas būtų:

 pick A pick B pick C 

tapti:

 pick A squash B pick C 

Jei A yra pradinis įsipareigojimas, prieš pradedant A. Gitą apie skirtumus, turite turėti skirtingą pradinį įsipareigojimą, jis veiks skirtumui tarp (A ir B) ir (B ir C). Todėl jūsų pavyzdyje skvošas neveikia.

10
12 янв. Atsakymą pateikė Loki 12 sausis 2009-01-12 18:05 '09 18:05 val. 2009-01-12 18:05

Jei turite šimtus ar tūkstančius įsipareigojimų, naudodami kostmo atsakymą

 git rebase -i --root 

gali būti nepraktiška ir lėta, tiesiog dėl to, kad daug kartų atliekama peradresavimo scenarijaus procedūra, vieną kartą, jei norite sukurti interaktyvaus peradresavimo sąrašo redaktoriaus sąrašą (kur pasirenkate, kurį veiksmą reikia atlikti kiekvienam įsipareigojimui) ir vieną kartą pakartotinai įsipareigoja.

Čia pateikiamas alternatyvus sprendimas , kuriuo bus išvengta daug laiko reikalaujančio interaktyvaus peradresavimo sąrašo redaktoriaus sąrašo sukūrimo, nenaudojant interaktyvaus peradresavimo. Taigi, tai panaši į Charleso Bailey sprendimą . Jūs tiesiog sukuriate nenustatytų autorių teisių filialą iš antrojo įsipareigojimo ir tada iš naujo įdiekite visus palikuonius viršuje:

git -checkout (1) rankinis puslapis 
  • git -rebase (1) rankinis puslapis
  • 7
    23 июля '14 в 18:00 2014-07-23 18:00 atsakymą pateikė vartotojo456814 liepos 23 d. 14 val

    Susijusiame klausime aš sugebėjau sugalvoti kitokį požiūrį į poreikį sutraiškyti pirmąjį įvykį, kuris, beje, būtų antras.

    Jei smalsu: git: kaip įterpti pataisą kaip pirmąjį, perkeliant visus kitus?

    1
    14 марта '09 в 11:15 2009-03-14 11:15 atsakymas pateikiamas kch , kovo 14 d., 09:15, 2009-03-14 11:15

    Jums reikia atlikti tam tikrą komandinės eilutės magiją.

     git checkout -ba A git checkout B <files> git commit --amend git checkout master git rebase a 

    Tai turėtų palikti jums filialą, kuriame bus vykdoma AB ir C.

    -1
    12 янв. Atsakymas duotas Bombe 12 jan. 2009-01-12 18:36 '09 18:36 2009-01-12 18:36

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