Kaip aš galiu sujungti du įsipareigojimus į vieną, jei aš jau pradėjau rebaz?

Aš bandau sujungti 2 įsipareigoja į 1, taigi aš sekiau „griovimo įsipareigojimus su grįžtamuoju“ iš „git ready“ .

Aš bėgo

 git rebase --interactive HEAD~2 

Susidariusiame redaktoriuje keisiu pick squash ir tada išsaugokite išeiti, bet klaida nepavyksta su klaida

Negalima skvošas be ankstesnio fiksavimo

Dabar, kai mano darbo medis pasiekė šią būseną, turiu atkūrimo problemą. git rebase --interactive HEAD~2 komanda neveikia

Interaktyvus perkrovimas jau veikia

ir „ git rebase --continue

Negalima skvošas be ankstesnio fiksavimo

1041
01 апр. nustatė michael 01 balandžio. 2010-04-01 23:56 '10, 23:56, 2010-04-01 23:56
@ 11 atsakymų

Santrauka

Klaidos pranešimas

Negalima skvošas be ankstesnių įsipareigojimų

reiškia, kad tikriausiai bandėte „susmulkinti“. „Git“ visada paspaudžia naują įvykį į senesnį įvykį arba „aukštyn“, kaip matoma interaktyvaus perkėlimo užduočių sąraše, ty ankstesnėje eilutėje. Pakeitus komandą savo užduočių sąrašuose pirmojoje squash eilutėje, visada atsiras ši klaida, nes pirmasis įsipareigoja skvošas nieko nedaryti.

Nustatyti

Pirmiausia grįžkite į ten, kur pradėjote.

 $ git rebase --abort 

Pasakyk man savo istoriją

 $ git log --pretty=oneline a931ac7c808e2471b22b5bd20f0cad046b1c5d0d c b76d157d507e819d7511132bdb5a80dd421d854f b df239176e1a2ffac927d8b496ea00d5488481db5 a 

Tai yra pirmasis įvykis, tada b ir galiausiai c. Priimdami c, mes nusprendžiame susmulkinti b ir c kartu:

(Pastaba. Paleidus git log siunčia išvestį į laikiklį, numatytasis yra less daugumoje platformų. Norėdami išeiti iš gavėjo ir grįžti į komandų eilutę, paspauskite q .)

Naudojant „ git rebase --interactive HEAD~2 suteikia jums redaktorių

 pick b76d157 b pick a931ac7 c # Rebase df23917..a931ac7 onto df23917 # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit log message # # If you remove a line here THAT COMMIT WILL BE LOST. # However, if you remove everything, the rebase will be aborted. # 

(Atkreipkite dėmesį, kad šis užduočių sąrašas yra atvirkštine tvarka iš git log išvesties.)

Jei pakeisite bs pick to squash atsiras squash klaida, tačiau jei paspausite c ant b (naujesnė įsipareigoja senesniam arba „judėti aukštyn“), pakeisite užduočių sąrašą į

 pick b76d157 b squash a931ac7 c 

ir išsaugokite išėjimą iš redaktoriaus, gausite kitą redaktorių, kurio turinys

 # This is a combination of 2 commits. # The first commit message is: b # This is the 2nd commit message: c 

Kai išsaugosite ir išeisite, redaguoto failo turinys tampa naujos kombinuoto įsipareigojimo įvykių pranešimu:

 $ git log --pretty=oneline 18fd73d3ce748f2a58d1b566c03dd9dafe0b6b4f b and c df239176e1a2ffac927d8b496ea00d5488481db5 a 

Pastaba apie istorijos perrašymą

Interaktyvus perkrovimas perrašo istoriją. Bandymas perkelti į nuotolinį kompiuterį, kuriame yra senoji istorija, nepavyks, nes jis nėra greitas į priekį.

Jei perkeltas filialas yra temos ar funkcijos, kurioje dirbate savarankiškai, filialas, tai gerai. Jei norite pereiti į kitą saugyklą, jums reikia „ --force parinkties, arba, priklausomai nuo nuotolinio saugyklos leidimų, pirmiausia pašalinkite seną filialą ir spustelėkite perkeltą versiją. Komandų, kurios gali trikdyti darbą, pavyzdžiai yra už šio atsakymo ribų.

Perrašydami jau paskelbtą istoriją temoje, kurioje dirbate su kitais žmonėmis be labai gerų priežasčių, pvz., Slaptažodžio nutekėjimo ar kitų slaptų duomenų, jūsų kolegos dirba antisocialiniais ir erzinančiais kitiems kūrėjams. Skiltyje „Atkurti iš pradinio atkūrimo“ git rebase paaiškinama papildomai.

Perkėlimas (arba bet kokia kita perrašymo forma) filialas, kuriame kiti dirba, yra bloga idėja: bet kuris tolesnis naudotojas turi rankiniu būdu ištaisyti savo istoriją. Šiame skyriuje paaiškinama, kaip ją išspręsti pagal vartotojų srautus. Tačiau tikroji padėtis yra tai, kad būtų išvengta perkėlimo į viršų. ...

1604
02 апр. Greg Bacon atsakymas 02 Bal 2010-04-02 22:04 '10 10:04 val. 2010-04-02 22:04

Jei yra keletas įsipareigojimų, galite naudoti „ git rebase -i kad du git rebase -i į vieną.

Jei yra tik du įsipareigojimai, kuriuos norite sujungti, ir jie yra „paskutiniai du“, dvi komandos gali būti naudojamos sujungti į vieną:

border=0
 git reset --soft "HEAD^" git commit --amend 
360
11 июля '14 в 8:31 2014-07-11 08:31 atsakymą pateikė vartotojo3828059 liepos 11 d. 14 d

Rebase: jums to nereikia:

Paprastesnis būdas dažniausiai pasitaikantiems scenarijams.

Daugeliu atvejų:

Tiesą sakant, jei viskas, ko jums reikia, paprasčiausiai susilieja su keliais įsipareigojimais, bet nereikia drop , reword ir atlikti kitus perkėlimo darbus.

Galite tiesiog:

 git reset --soft "HEAD~n" 
  • Darant prielaidą, kad ~n yra užduočių, kurias galima lengvai atšaukti, skaičius (t. ~1 , ~2 , ...)

Tada naudokite šią komandą, kad pakeistumėte įsipareigojimo pranešimą.

 git commit --amend 

tai beveik toks pat kaip ilgas squash ir vienas pick .

Ir jis veikia n, o ne tik du įsipareigojimai, kaip nurodyta pirmiau.

71
26 апр. atsakymas pateikiamas pambda 26 balandis. 2017-04-26 12:15 '17 at 12:15 2017-04-26 12:15

Pirmiausia turite patikrinti, kiek įsipareigoja:

 git log 

Yra dvi valstybės:

Pirma, yra tik du įsipareigojimai:

Pavyzdžiui:

 commit A commit B 

(Tokiu atveju negalite naudoti „git rebase“), turite atlikti šiuos veiksmus.

 $ git reset --soft HEAD^1 $ git commit --amend 

Kitas yra tai, kad yra daugiau nei du įsipareigojimai; norite sujungti įrašus C ir D.

Pavyzdžiui:

 commit A commit B commit C commit D 

(pagal šią sąlygą galite naudoti „git rebase“)

 git rebase -i B 

Ir nei naudoti „skvošą“. Likusi dalis yra labai paprasta. Jei vis dar nežinote, skaitykite http://zerodie.github.io/blog/2012/01/19/git-rebase-i/

50
27 мая '14 в 22:01 2014-05-27 22:01 atsakymą pateikė Haimei gegužės 27 d., 14 d., 10.00 val. 2014-05-27 22:01

Darant prielaidą, kad buvote savo temos temoje. Jei norite sujungti paskutinius 2 įsipareigojimus į vieną ir atrodyti kaip herojus, atidarykite įsipareigojimą prieš baigdami paskutinius du įsipareigojimus.

 git checkout -b temp_branch HEAD^2 

Tada skvošas pereina kitą filialą šiame naujame filiale:

 git merge branch_with_two_commits --squash 

Tai lems pokyčius, tačiau jų nesukels. Taigi tiesiog perduokite juos ir viskas yra paruošta.

 git commit -m "my message" 

Dabar jūs galite sujungti naują temos temą į pagrindinį temą.

26
24 окт. Homano atsakymas spalio 24 d 2013-10-24 02:44 '13, 02:44 2013-10-24 02:44

galite atšaukti perkrovimą su

 git rebase --abort 

ir iš naujo paleisdami interaktyviosios perkrovos komandą, „skvošas; įsipareigojimas turi būti žemiau pasirinkimo nustatymo sąraše

22
01 апр. atsakymas, kurį pateikė Leom Burke 2010-04-01 23:59 '10, 23:59 PM 2010-04-01 23:59

Aš dažnai naudoju git reset --mixed, kad grąžintumėte bazinę versiją į keletą įsipareigojimų, kuriuos norite sujungti, tada darau naują įsipareigojimą, todėl įsitikinkite, kad jūsų HEAD versija paspaudus ant serverio.

 commit ac72a4308ba70cc42aace47509a5e Author: <me@me.com> Date: Tue Jun 11 10:23:07 2013 +0500 Added algorithms for Cosine-similarity commit 77df2a40e53136c7a2d58fd847372 Author: <me@me.com> Date: Tue Jun 11 13:02:14 2013 -0700 Set stage for similar objects commit 249cf9392da197573a17c8426c282 Author: Ralph <ralph@me.com> Date: Thu Jun 13 16:44:12 2013 -0700 Fixed a bug in space world automation 

Jei aš noriu sujungti galvą, du įpareigoja į vieną, pirmą kartą naudoju:

 git reset --mixed 249cf9392da197573a17c8426c282 

„249cf9392da197573a17c8426c282“ buvo trečioji versija, kuri taip pat yra pagrindinė versija prieš susijungimą, po to darau naują įrašą:

 git add . git commit -m 'some commit message' 

Visa viltis yra dar vienas būdas visiems.

FYI, nuo git reset --help :

  --mixed Resets the index but not the working tree (ie, the changed files are preserved but not marked for commit) and reports what has not been updated. This is the default action. 
14
09 сент. atsakymą pateikė VinceStyling 09 rugsėjis 2013-09-09 05:48 '13, 5:48, 2013-09-09 05:48

$ git rebase --abort

Paleiskite šį kodą bet kuriuo metu, jei norite atšaukti gitą

$ git rebase -i HEAD~2

Naudokite paskutinius du įsipareigojimus. Pirmiau pateikta komanda atidarys kodo redaktorių.

  • [ Paskutinis nustatymas bus sumažintas ]. Pakeiskite paskutinį, kad įvykdytumėte skvošą (-us). Kadangi skvošas bus derinamas su ankstesniu fiksavimu.
  • Tada paspauskite klavišą esc ir įveskite: wq, kad išsaugotumėte ir uždarytumėte

Po: wq būsite aktyvaus atkūrimo režimu

Pastaba Jei nebus įspėjimų / klaidų pranešimų, gausite kitą redaktorių. Jei yra klaida ar įspėjimas, kad nebus rodomas kitas redaktorius, galite nutraukti $ git rebase --abort , jei matote klaidą arba įspėjimo pranešimą, tiesiog tęskite naudodami $ git rebase --continue

Pamatysite pranešimą 2 priskirti. Pasirinkite vieną arba parašykite savo pranešimą, išsaugokite ir uždarykite [: wq]

2 pastaba: jei paleisite komandą „Rebase“, gali tekti priversti pakeitimus nukreipti į nuotolinį repo.

$ git push -f

$ git push -f origin master

11
21 февр. atsakymas pateikiamas Gnanasekar S 21 vasario mėn. 2017-02-21 00:49 '17 ne 0:49 2017-02-21 00:49

Kadangi aš naudoju git cherry-pick beveik viską, man natūralu tai padaryti net čia.

Atsižvelgiant į tai, kad aš patikrinčiau branchX , ir viršūnėje yra du įsipareigojimai, kurių noriu sukurti vieną įsipareigojimą derinant jų turinį, tai darau:

 git checkout HEAD^ // Checkout the privious commit git cherry-pick --no-commit branchX // Cherry pick the content of the second commit git commit --amend // Create a new commit with their combined content 

Jei noriu atnaujinti branchX (ir, manau, tai yra šio metodo trūkumas), taip pat turiu:

 git checkout branchX git reset --hard <the_new_commit> 
2
26 нояб. Martin G atsakymas . 2015-11-26 13:52 '15, 13:52 2015-11-26 13:52

Jei jūsų pagrindinis git log filialas atrodo taip:

 commit ac72a4308ba70cc42aace47509a5e Author: <me@me.com> Date: Tue Jun 11 10:23:07 2013 +0500 Added algorithms for Cosine-similarity commit 77df2a40e53136c7a2d58fd847372 Author: <me@me.com> Date: Tue Jun 11 13:02:14 2013 -0700 Set stage for similar objects commit 249cf9392da197573a17c8426c282 Author: Ralph <ralph@me.com> Date: Thu Jun 13 16:44:12 2013 -0700 Fixed a bug in space world automation 

ir norite sujungti du svarbiausius įvykius, atlikite šiuos paprastus veiksmus:

  • Pirma, būti saugioje pusėje, antrą paskutinį laikiklį atskirame skyriuje. Filialą galite pavadinti nieko. git checkout 77df2a40e53136c7a2d58fd847372 -b merged-commits
  • Dabar tiesiog vyšnių - pasirinkite savo pakeitimus nuo paskutinio įsipareigojimo šiai naujai šakai, pvz .: git cherry-pick -n -x ac72a4308ba70cc42aace47509a5e . (Pašalinkite konfliktus, jei jie įvyksta)
  • Taigi dabar jūsų paskutinio įsipareigojimo pakeitimai yra jūsų antrajame paskutiniame įvykyje. Bet jūs vis dar turite tai padaryti, todėl pirmiausia pridėkite ką tik pasirinktus pakeitimus ir paleiskite git commit --amend .

Kas tai yra. Jei norite, spustelėję šią susijungusią versiją galite spustelėti „susijungusius įsipareigojimus“.

Be to, dabar galite nukristi du įsipareigojimus pagrindiniame filiale. Tiesiog atnaujinkite pagrindinį filialą kaip:

 git checkout master git reset --hard origin/master (CAUTION: This command will remove any local changes to your master branch) git pull 
1
16 июня '13 в 18:57 2013-06-16 18:57 atsakymas pateikiamas Neapibrėžta birželio 16, 13, 18:57 2013-06-16 18:57

Jei norite sujungti paskutinius du įsipareigojimus ir tiesiog naudoti seną pranešimą, galite automatizuoti procesą naudodami expect .

Manau:

  • Kaip redaktorių naudojate vi.
  • Jūsų įsipareigojimas yra viena eilutė

Aš išbandiau su git version 2.14.3 (Apple Git-98) .


 #!/usr/bin/env expect spawn git rebase -i HEAD~2 # down, delete word, insert 's' (for squash), Escape, save and quit send "jdwis \033:wq\r" expect "# This is a" # down 4, delete 3 lines, save and quit send "4j3d\r:wq\r" interact 
0
06 февр. atsakymas duotas erwaman 06 vas 2018-02-06 07:45 '18 at 7:45 am 2018-02-06 07:45

Kiti klausimai apie „ žymas arba „ Klauskite“