Kaip pakeisti nurodytą įsipareigojimą?

Paprastai pateikiu sąrašą patikrinimų. Jei turiu šiuos įsipareigojimus:

  1. HEAD
  2. Commit3
  3. Commit2
  4. Commit1

... aš žinau, kad galiu pakeisti galvą su git commit --amend . Bet kaip aš galiu pakeisti Commit1 , nes tai nėra HEAD ?

1785 m
27 июля '09 в 8:19 2009-07-27 08:19 Sam Liao paklausė liepos 27 d., 08:19, 2009-07-27 08:19
@ 13 atsakymų

Galite naudoti „git rebase“, pavyzdžiui, jei norite grįžti į bbc643cd , paleisti

 $ git rebase --interactive 'bbc643cd^' 

Numatytoje redaktoriuje pakeiskite parinktį edit eilutėje, kurios įsipareigojimą norite pakeisti. Atlikite pakeitimus ir pateikite juos tuo pačiu pranešimu, kurį turėjo anksčiau:

 $ git commit --all --amend --no-edit 

keisti įsipareigojimą ir po to

 $ git rebase --continue 

grįžti prie ankstesnio skyriaus fiksavimo.

ĮSPĖJIMAS . Atkreipkite dėmesį, kad tai pakeis šios komandos SHA-1 , taip pat visus vaikus - kitaip tariant, jis perrašys istoriją iš šio taško į priekį.

2340
27 июля '09 в 8:28 2009-07-27 08:28 atsakymas pateikiamas ZelluX liepos 27 d., 08:28, 2009-07-27 08:28

Naudokite nuostabią interaktyvią versiją:

 git rebase -i @~9 # Show the last 9 commits in a text editor 

Raskite norimą įsipareigojimą, pakeiskite pick į e ( edit ) ir išsaugokite ir uždarykite failą. „Git“ sugrįš į šį pataisymą, kuris leis:

  • naudokite „ git commit --amend norite padaryti pakeitimus arba
  • naudokite git reset @~ kad atšauktumėte paskutinį įvykį, bet ne failų pakeitimus (t. y. eikite į tašką, kur buvote, kai redagavote failus, bet dar nepašalinę).

Pastaroji yra naudinga atlikti sudėtingesnius dalykus, pvz., Suskaidymą į kelis įsipareigojimus.

Tada paleiskite „ git rebase --continue , o „Git“ git rebase --continue vėlesnius pakeitimus, git rebase --continue viršuje. Gali būti paprašyta išspręsti kai kuriuos sujungimo konfliktus.

Pastaba: @ yra HEAD santrumpa, o ~ yra įsipareigojimas nurodytam įsipareigojimui.

Sužinokite daugiau apie istorijos perrašymą „Git“ dokumentuose.

border=0


Nebijokite iš naujo įdiegti

„ProTip ™“: nebijokite eksperimentuoti su „pavojingomis“ komandomis, kurios perrašo istoriją * - „Git“ nepašalina jūsų pataisymų 90 dienų pagal nutylėjimą; Juos galite rasti „reflog“:

 $ git reset @~3 # go back 3 commits $ git reflog c4f708b HEAD@{0}: reset: moving to @~3 2c52489 HEAD@{1}: commit: more changes 4a5246d HEAD@{2}: commit: make important changes e8571e4 HEAD@{3}: commit: make some changes ... earlier commits ... $ git reset 2c52489 ... and you're back where you started 

* Būkite --force , pvz., „ --hard and- --force , - jie gali atmesti duomenis.
* Taip pat nereikia perrašyti istorijos jokiuose filialuose, su kuriais bendradarbiaujate.



Daugelyje sistemų git rebase -i pagal nutylėjimą atvers Vim. „Vim“ neveikia kaip daugelis modernių teksto redaktorių, todėl pažiūrėkite , kaip iš naujo įdiegti naudojant „Vim“ . Jei norite naudoti kitą redaktorių, pakeiskite jį į git config --global core.editor your-favorite-text-editor .

333
29 апр. atsakymas pateikiamas Zaz 29 Bal 2015-04-29 20:50 '15, 8:50 pm 2015-04-29 20:50

Interaktyvus pakartojimas su --autosquash yra tai, ką dažnai --autosquash , kai reikia ištaisyti ankstesnius, užfiksuoti gilesnę istoriją. Tai labai pagreitina ZelluX atsakymą iliustruojantį procesą ir yra ypač naudinga, kai turite keletą įsipareigojimų, kuriuos reikia redaguoti.

Iš dokumentacijos:

--autosquash

Kai įsipareigojimo žurnalo pranešimas prasideda "squash! ..." (arba "fixup! ..."), ir yra įsipareigojimas, kurio antraštė prasideda tuo pačiu ..., ji automatiškai pakeičia todo reba -i sąrašą taip, kad pažymėtas įsipareigojimas skirstymui, pasirodo iškart po fiksavimo pakeitimo

Tarkime, kad turite tokią istoriją:

 $ git log --graph --oneline * b42d293 Commit3 * e8adec4 Commit2 * faaf19f Commit1 

ir jūs turite pakeitimus, kuriuos norite padaryti „Commit2“, tada atlikite pakeitimus naudodami

 $ git commit -m "fixup! Commit2" 

Arba jūs galite naudoti "fixup! e8adec4 -sha“ vietoj įsipareigojimo pranešimo, taigi "fixup! e8adec4 arba net tik įsipareigojimo pranešimo priešdėlis.

Tada inicijuokite interaktyvų perkėlimą, kad įsipareigotumėte

 $ git rebase e8adec4^ -i --autosquash 

Redaktorius atidarys teisingus įsipareigojimus.

 pick e8adec4 Commit2 fixup 54e1a99 fixup! Commit2 pick b42d293 Commit3 

viskas, ką jums reikia padaryti, tai išsaugoti ir išeiti

63
29 сент. atsakymas suteiktas 29 sep . 2015-09-29 20:59 '15 - 20:59 2015-09-29 20:59

Vykdyti:

$ git rebase --interactive commit_hash^

kiekviena ^ nurodo, kiek komandų norite redaguoti, jei tai tik viena (priskirtas įsipareigojimas), tada tiesiog pridėkite vieną ^ .

Naudodamiesi „Vim“, pakeisite žodžius „ pick kad reword norimus keisti, išsaugoti ir išeiti ( :wq ). Tada git pasiūlys jums visus įsipareigojimus, kuriuos pažymėjote kaip pavadinimą, kad galėtumėte pakeisti įsipareigojimo pranešimą.

Kiekvienas įsipareigojimo pranešimas, kurį reikia išsaugoti ir išeiti ( :wq ), pereikite prie kito įsipareigojimo pranešimo

Jei norite išeiti be pakeitimų, paspauskite :q!

EDIT : eikite į „ vim naudokite j eiti aukštyn, k eiti žemyn, h eiti į kairę ir l eiti į dešinę (visi NORMAL režimu, paspauskite ESC kad pereitumėte į NORMAL režimą). Norėdami redaguoti tekstą, paspauskite i kad įeitumėte į INSERT režimą, kur įterpsite tekstą. Paspauskite ESC kad grįžtumėte į NORMAL režimą :)

UPDATE . Čia yra puiki nuoroda iš „github“ sąrašo

32
02 июля '15 в 22:11 2015-07-02 22:11 atsakymą pateikė betoharres liepos 2 d. 15 d. 10:11 val. 2015-07-02 22:11

Jei dėl kokių nors priežasčių jums nepatinka interaktyvūs redaktoriai, galite naudoti git rebase --onto .

Tarkime, kad norite pakeisti Commit1 . Pirma, filialas iš Commit1 :

 git checkout -b amending [commit before Commit1] 

Antra, pasinaudokite „ Commit1 naudodami „ cherry-pick :

 git cherry-pick Commit1 

Dabar pakeiskite pakeitimus kurdami „ Commit1' :

 git add ... git commit --amend -m "new message for Commit1" 

Galiausiai, paslėpę visus kitus pakeitimus, perkelkite likusius savo įsipareigojimus master naują įsipareigojimą:

 git rebase --onto amending Commit1 master 

Perskaitykite: "Atnaujinimas, keitimas, visi atlieka sandorius tarp Commit1 (ne imtinai) ir master (imtinai)". Tai reiškia, kad Commit2 ir Commit3 visiškai panaikino senąjį Komitetą1. Galite tiesiog pasirinkti vyšnį, bet tai lengviau.

Nepamirškite valyti šakų!

 git branch -d amending 
13
22 окт. Atsakymą pateikė „ FeepingCreature“ spalio 22 d. 2016-10-22 15:19 '16 at 15:19 2016-10-22 15:19

Visiškai neinteraktyvi komanda (1)

Aš tiesiog maniau, kad turiu slapyvardį, kurį naudoju. Jis pagrįstas interaktyvia interaktyvia permutacija. Jei norite pridėti jį prie git, paleiskite šią komandą (paaiškinta toliau):

 git config --global alias.amend-to '!f() { SHA='git rev-parse "$1"'; git commit --fixup "$SHA"  GIT_SEQUENCE_EDITOR=true git rebase --interactive --autosquash "$SHA^"; }; f' 

Didžiausias šios komandos privalumas yra tai, kad jis yra ne vimas .


(1), atsižvelgiant į tai, kad perkrovimo metu, žinoma, nėra konflikto

naudoti

 git amend-to <REV> # eg git amend-to HEAD~1 git amend-to aaaa1111 

Pakeičiamas pavadinimas amend-to atrodo, yra tinkamas IMHO. Palyginkite srautą su --amend :

 git add .  git commit --amend --no-edit # vs git add .  git amend-to <REV> 

paaiškinimas

  • git config --global alias.<NAME> '!<COMMAND>' - sukuria pasaulinį slapyvardį su pavadinimu <NAME> , kuris vykdys komandą be git <COMMAND>
  • f() { <BODY> }; f f() { <BODY> }; f f() { <BODY> }; f f() { <BODY> }; f yra „anoniminė“ „bash“ funkcija.
  • SHA='git rev-parse "$1"'; - konvertuoja argumentą į git-reviziją ir priskiria rezultatą SHA kintamajam
  • git commit --fixup "$SHA" - įsipareigojimas įsipareigoti SHA . Žr
  • GIT_SEQUENCE_EDITOR=true git rebase --interactive --autosquash "$SHA^"
    • git rebase --interactive "$SHA^" dalis buvo įtraukta į kitus atsakymus.
    • --autosquash naudojamas kartu su git commit --fixup , daugiau informacijos žr. git-rebase .
    • GIT_SEQUENCE_EDITOR=true - tai daro visa tai neinteraktyvia. Šis įsilaužimas sužinojau iš šio dienoraščio įrašo .
7
27 февр. Atsakymas pateikiamas Dethariel 27 vasario mėn. 2018-02-27 04:47 '18 at 4:47 201-02-27 04:47

Jei norite gauti neinteraktyvią komandą, įdėkite scenarijų šiuo turiniu į savo PATH:

 #!/bin/sh # # git-fixup # Use staged changes to modify a specified commit set -e cmt=$(git rev-parse $1) git commit --fixup="$cmt" GIT_EDITOR=true git rebase -i --autosquash "$cmt~1" 

Naudokite jį skelbdami pakeitimus (naudodami git add ) ir paleiskite git fixup <commit-to-modify> . Žinoma, tai bus interaktyvi, jei susidursite su konfliktais.

6
16 янв. Atsakymą pateikė Pelle Nilsson, sausio 16 d. 2018-01-16 18:27 '18, 18:27 pm 2018-01-16 18:27

Automatinis interaktyvių duomenų bazių redagavimas, po to pasirengimas pasiruošimui, paruoštas vykdymui

Radau, kad buvau fiksuojamas ankstesnis fiksavimas pakankamai dažnai, kad galėčiau parašyti scenarijų.

Čia yra darbo eiga:

  1.  git commit-edit <commit-hash> 

    Tai nuves jus į pataisymą, kurį norite redaguoti.

  2. Teisingai ir įsipareigokite, kaip norite, pirmiausia.

    (Galite naudoti „ git stash save kad išsaugotumėte failus, kurių nenaudojate)

  3. Pakartokite veiksmus naudodami --amend , pavyzdžiui:

     git commit --amend 
  4. Atlikite atnaujinimą:

     git rebase --continue 

Jei norite dirbti aukščiau, įdėkite šį scenarijų į vykdomąjį failą, pavadintą „ git-commit-edit kur „ git-commit-edit kažką savo „ $PATH :

6
14 сент. Atsakyti Tom Hale Sep 14 2018-09-14 06:32 '18 at 6:32 2018-09-14 06:32

Atvyko į šį požiūrį (ir tai tikriausiai tas pats, kaip naudojant interaktyvų perrašymą), bet man tai gana paprasta.

Pastaba Šį požiūrį pateikiu kaip iliustraciją, ką galite padaryti, o ne kasdienę alternatyvą. Kadangi ji turi daug žingsnių (ir galbūt kai kurių išlygų).

Tarkime, kad norite pakeisti įsipareigojimą 0 ir šiuo metu esate feature-branch

 some-commit---0---1---2---(feature-branch)HEAD 

Patikrinkite šį įrašą ir sukurkite quick-branch . Taip pat galite klonuoti savo filialą kaip atkūrimo tašką (prieš paleidžiant).

 ?(git checkout -b feature-branch-backup) git checkout 0 git checkout -b quick-branch 

Dabar turėsite kažką panašaus:

 0(quick-branch)HEAD---1---2---(feature-branch) 

Pokyčiai scenoje, užrašykite viską.

 git add ./example.txt git stash 

Pakeiskite pakeitimus ir grįžkite į feature-branch

 git commit --amend git checkout feature-branch 

Dabar turėsite kažką panašaus:

 some-commit---0---1---2---(feature-branch)HEAD \ ---0'(quick-branch) 

Perkelkite feature-branch greitame quick-branch (išspręsti visus konfliktus). Taikykite stash ir pašalinkite quick-branch .

 git rebase quick-branch git stash pop git branch -D quick-branch 

Ir jūs gausite:

 some-commit---0'---1'---2'---HEAD(feature-branch) 

„Git“ nesikartos (nors negaliu pasakyti, kokiu mastu) 0 atlieka perkrovimą.

Pastaba: visi pasikeitimai yra pakeisti, pradedant nuo įsipareigojimo, kurį mes iš pradžių planavome keisti.

6
01 июня '16 в 14:57 2016-06-01 14:57 Atsakymas pateikiamas Olga 01 birželio 16 d. 14:57 2016-06-01 14:57

Remiantis dokumentais

Senų ar keleto įvykių pranešimų pranešimas

 git rebase -i HEAD~3 

Pirmiau pateiktame sąraše pateikiamas paskutinių 3, esančių dabartiniame filiale, sąrašas, pakeitus 3, jei norite daugiau. Sąrašas atrodys panašus:

 pick e499d89 Delete CNAME pick 0c39034 Better README pick f7fde4a Change the commit message but push the same commit. 

Pakeiskite atranką pakartotiniu naudojimu prieš kiekvieną norimą keisti pranešimo pranešimą. Tarkime, kad pakeitėte antrąjį įrašą sąraše, failas atrodys taip:

 pick e499d89 Delete CNAME reword 0c39034 Better README pick f7fde4a Change the commit message but push the same commit. 

Išsaugokite ir uždarykite priskyrimo sąrašo failą, pasirodys naujas redaktorius, kad pakeistumėte įsipareigojimo pranešimą, pakeistumėte įsipareigojimo pranešimą ir išsaugotumėte.

Baigti priverstinį priverstinį keitimą.

 git push --force 
5
17 мая '18 в 11:38 2018-05-17 11:38 atsakymas pateikiamas tik gegužės 17 d. 18 val. 11:38 2018-05-17 11:38

Aš nusprendžiau

1) sukuriant naują įsipareigojimą su norimais pakeitimais.

 r8gs4r commit 0 

2) žinau, kokią fiksaciją reikia sujungti su juo. kuri yra fiksacija 3.

todėl git rebase -i HEAD~4 # 4 reiškia neseniai įvykdytą 4 git rebase -i HEAD~4 (čia, git rebase -i HEAD~4 3 yra 4-oje vietoje)

3) interaktyvioje atkūrimo sistemoje, naujausia fiksacija bus pateikta žemiau. tai atrodys vienodai

 pick q6ade6 commit 3 pick vr43de commit 2 pick ac123d commit 1 pick r8gs4r commit 0 

4) čia reikia pertvarkyti fiksaciją, jei norite sujungti su betonu. tai turi būti

 parent |_child pick q6ade6 commit 3 f r8gs4r commit 0 pick vr43de commit 2 pick ac123d commit 1 

po permutacijos, reikia pakeisti p pick su f ( pataisa bus sujungta be pranešančio pranešimo) arba s (sujungimas skvošas su įvykio pranešimu gali pasikeisti vykdymo metu)

tada išsaugokite medį.

Dabar sujungimas atliekamas su esamais įsipareigojimais.

Pastaba Tai nėra pageidaujamas metodas, jei to nepalaikote. jei turite didelį komandų dydį, jo nepriimtinas metodas git medžio perrašymui sukels konfliktus, kurie, kaip žinote, bus skirtingi. jei norite, kad medis būtų švarus mažiau, jūs galite jį išbandyti ir jei jos mažoji komanda nebūtų pageidautina .....

3
05 янв. Mohideen ibn Mohammed atsakymas, pateiktas sausio 05 d 2018-01-05 21:35 '18, 21:35 pm 2018-01-05 21:35

Man buvo pašalinti kai kuriuos kredencialus iš repo. Bandžiau iš naujo įdiegti ir patekti į subtilius, tariamai nesusijusius konfliktus, kai bandžiau iš naujo įdiegti, tęsti. Nesivarginkite bandydami paleisti save iš naujo, naudokite „bfg“ (brew install bfg) įrankį „Mac“.

2
07 нояб. Atsakymas pateikiamas Pellet 07.11. 2017-11-07 10:24 '17, 10:24 am. 2017-11-07 10:24

git stash rebase git stash ir „ rebase automatika

Jei reikia daug kartų keisti seną „Gerrit“ peržiūrą, darau:

 git-amend-to() ( # Stash, apply to past commit, and rebase the current branch on to of the result. current_branch="$(git rev-parse --abbrev-ref HEAD)" apply_to="$1" git stash git checkout "$apply_to" git stash apply git add -u git commit --amend --no-edit new_sha="$(git log --format="%H" -n 1)" git checkout "$current_branch" git rebase --onto "$new_sha" "$apply_to" ) 

Naudoti:

  • redaguoti failą
  • git-amend-to $old_sha

Man patinka tai - --autosquash nes jis nemato kitų nesusijusių pataisymų.

0
03 дек. Ciro Santilli atsakymas 改造 改造 中心 六四 事件 法轮功 03 dec. 2018-12-03 19:02 '18 19:02 2018-12-03 19:02

Kiti klausimai apie „ žymas arba „ Klauskite“