Kaip pakeisti vyresnio amžiaus gitą?

Aš padariau 3 gitą, bet nebuvo spustelėta. Kaip pakeisti senąjį (ddc6859af44) ir (47175e84c), kuris nėra paskutinis?

 $git log commit f4074f289b8a49250b15a4f25ca4b46017454781 Date: Tue Jan 10 10:57:27 2012 -0800 commit ddc6859af448b8fd2e86dd0437c47b6014380a7f Date: Mon Jan 9 16:29:30 2012 -0800 commit 47175e84c2cb7e47520f7dde824718eae3624550 Date: Mon Jan 9 13:13:22 2012 -0800 
111
11 янв. nustatė michael Jan 11 2012-01-11 21:52 '12, 09:52 PM 2012-01-11 21:52
@ 6 atsakymai
 git rebase -i HEAD^^^ 

Dabar pažymėkite tuos, kuriuos norite keisti edit arba e (pakeiskite pick ). Dabar išsaugokite ir išeikite.

Dabar atlikite pakeitimus

 git add -A git commit --amend --no-edit git rebase --continue 

Jei norite pridėti papildomą ištrinimą, pašalinkite parametrus iš įsipareigojimo komandos. Jei norite tinkinti pranešimą, praleiskite tik parametrą --no-edit .

141
11 янв. atsakymą Adam Dymitruk pateikė sausio 11 d. 2012-01-11 22:06 '12 - 10:06 pm 2012-01-11 22:06

Parengiau savo įsipareigojimą, kurį norėjau padaryti su vyresniuoju, ir nustebau matydamas, kad persikėlimas -i skundėsi, kad turėjau nesusijusių pakeitimų. Tačiau nenorėjau, kad mano pakeitimai vėl parodytų vyresniojo įsipareigojimo redagavimo parametrą. Taigi sprendimas buvo gana paprastas ir paprastas:

  • Paruoškite atnaujinimą senesniam, pridėkite ir vykdykite
  • git rebase -i <commit you want to amend>^ - pastebėkite ^ , kad teksto redaktoriuje matytumėte nurodytą pataisą
  • Gausite:

     pick 8c83e24 use substitution instead of separate subsystems file to avoid jgroups.xml and jgroups-e2.xml going out of sync pick 799ce28 generate ec2 configuration out of subsystems-ha.xml and subsystems-full-ha.xml to avoid discrepancies pick e23d23a fix indentation of jgroups.xml 
  • Dabar, norėdami sujungti e23d23a su 8c83e24, galite pakeisti eilučių tvarką ir naudoti skvošą taip:

     pick 8c83e24 use substitution instead of separate subsystems file to avoid jgroups.xml and jgroups-e2.xml going out of sync squash e23d23a fix indentation of jgroups.xml pick 799ce28 generate ec2 configuration out of subsystems-ha.xml and subsystems-full-ha.xml to avoid discrepancies 
  • rašyti ir išeiti iš failo, kartu su redaktoriumi galėsite sujungti įvykių pranešimus. Padarykite tai ir išsaugokite / išeikite iš teksto dokumento.

  • Baigėte pakeitimus.
border=0

kreditas eina: http://git-scm.com/book/en/Git-Tools-Rewriting-History Taip pat naudinga parodyti git magiją.

75
09 авг. atsakymą pateikė akostadinov 09 rug . 2013-08-09 18:42 '13, 18:42 2013-08-09 18:42

Jei norite perrašyti įsipareigojimo istoriją, galite naudoti „ git rebase . Tai gali būti pavojinga jūsų pakeitimams, todėl naudokite atsargiai.

Pirmiausia atlikite savo pakeitimus „keisti“, kaip įprasta. Tada atlikite interaktyvų nukreipimą, pradedant nuo senojo įsipareigojimo tėvo

 git rebase -i 47175e84c2cb7e47520f7dde824718eae3624550^ 

Tai leis redaktoriui su visais įrašais. Pakeiskite užsakymą taip, kad jūsų „pataisa“ būtų atlikta žemiau to, kurį norite pakeisti. Tada pakeiskite pirmąjį žodį eilutėje su „įsipareigoti“ su „ s , kuris sujungs ( -us ) jį anksčiau įvykdytu įsipareigojimu. Išsaugokite ir išeikite iš redaktoriaus ir vadovaukitės instrukcijomis.

9
11 янв. Benjamino Bannierio atsakymas, pateiktas sausio 11 d 2012-01-11 21:55 '12, 9:55 val. 2012-01-11 21:55

Galite naudoti git rebase --interactive , naudodami edit komandą, skirtą įsipareigojimui, kurį norite pakeisti.

9
11 янв. atsakymas pateikiamas Avi 11 jan. 2012-01-11 22:01 '12 10:01 val. 2012-01-11 22:01

Keletą kartų naudoju kitą metodą. Tiesą sakant, tai yra „ git rebase -i , ir naudinga, jei norite pertvarkyti kelis įsipareigojimus, įskaitant kai kuriuos iš jų susmulkinimą ar skaidymą. Pagrindinis privalumas yra tas, kad jums nereikia priimti sprendimo dėl kiekvienos likimo komisijos vienu metu. Jūs taip pat turėsite visas „Git“ funkcijas, kurios bus prieinamos per procesą, o ne perdiegimo metu. Pvz., Galite bet kada parodyti pradinės ir perrašytos istorijos žurnalą arba netgi atlikti kitą perkrovimą!

Nurodysiu, kad įsipareigoju padaryti taip, todėl lengva skaityti:

 C # good commit after a bad one B # bad commit A # good commit before a bad one 

Jūsų istorija pradžioje yra tokia:

 x - A - B - C | | | master | origin/master 

Mes ją atkuriame taip:

 x - A - B*- C' | | | master | origin/master 

Tai yra procedūra:

 git checkout B # get working-tree to the state of commit B git reset --soft A # tell git that we are working before commit B git checkout -b rewrite-history # switch to a new branch for our alternative history 

Pagerinkite savo seną įsipareigojimą naudodami git add ( git add -i , git stash ir tt). Netgi galite padalinti seną fiksaciją į du ar daugiau.

 git commit # recreate commit B (result = B*) git cherry-pick C # copy C to our new branch (result = C') 

Tarpinis rezultatas:

 x - A - B - C | \ | | \ master | \ | B*- C' | | | rewrite-history | origin/master 

Tegul jis baigiasi:

 git checkout master git reset --hard rewrite-history # make this branch master 

Norėdami tai padaryti, galite push į priekį.

7
19 авг. Atsakymą pateikė Melebius 19 rug . 2013-08-19 10:24 '13, 10:24 am 2013-08-19 10:24

Jei OP nori išspausti 2 įsipareigojimus, nurodytus 1 punkte, tai yra alternatyvus būdas tai padaryti be perkrovimo

 git checkout HEAD^ # go to the first commit you want squashed git reset --soft HEAD^ # go to the second one but keep the tree and index the same git commit --amend -C HEAD@{1} # use the message from first commit (omit this to change) git checkout HEAD@{3} -- . # get the tree from the commit you did not want to touch git add -A # add everything git commit -C HEAD@{3} # commit again using the message from that commit 

@{N) sintaksė yra patogi, nes tai leis jums nurodyti nuorodų istoriją. Tokiu atveju jūsų dabartinis įsipareigojimas yra HEAD.

2
11 янв. atsakymą Adam Dymitruk pateikė sausio 11 d. 2012-01-11 23:52 '12 at 11:52 2012-01-11 23:52

Kiti klausimai apie „ žymes arba „ Klauskite klausimą“