Kaip visos gitos pritūpęs yra vienoje vietoje?

Kaip ištrinti visą kapinyną prieš pirmą įvykdymą?

Aš galiu iš naujo įdiegti prieš pirmąjį įvykį, bet jis paliks man du įsipareigojimus. Ar yra būdas kreiptis į pataisą prieš pirmąjį?

357
01 нояб. Verhogen yra apibrėžta lapkričio 01 d . 2009-11-01 11:38 '09, 11:38 am 2009-11-01 11:38
@ 15 atsakymų

Galbūt paprasčiausias būdas yra tiesiog sukurti naują saugyklą su dabartine darbo kopijos būsena. Jei norite išsaugoti visus priskirtus pranešimus, pirmiausia galite padaryti „ git log > original.log ir tada redaguoti tai, kad naujoje saugykloje būtų įvykdytas pirmasis įsipareigojimo pranešimas:

 rm -rf .git git init git add . git commit 

arba

 git log > original.log # edit original.log as desired rm -rf .git git init git add . git commit -F original.log 
119
01 нояб. Atsakymą pateikė Pat Notz . 2009-11-01 17:23 '09, 17:23, 2009-11-01 17:23

Naujausiose „git“ versijose galite naudoti „ git rebase --root -i .

border=0

Kiekvienam įvykiui, išskyrus pirmąjį, keiskite pick squash .

523
13 февр. Atsakymą pateikė Jordan Lewis 13 vasaris 2012-02-13 03:49 '12 at 3:49 2012-02-13 03:49

Atnaujinti

Aš padariau alias git squash-all .
Naudojant pavyzdį : git squash-all "a brand new start" .

 [alias] squash-all = "!f(){ git reset $(git commit-tree HEAD^{tree} -m \"${1:-A new start}\");};f" 

„Caveat“ : nepamirškite įvesti komentaro, kitaip bus naudojamas numatytasis pranešimas „Naujas pradžia“.

Arba galite sukurti slapyvardį su tokia komanda:

 git config --global alias.squash-all '!f(){ git reset $(git commit-tree HEAD^{tree} -m "${1:-A new start}");};f' 

Viena linija

 git reset $(git commit-tree HEAD^{tree} -m "A new start") 

Pastaba : čia „ A new start “ yra tik pavyzdys, nedvejodami naudokite savo kalbą.

Tl; DR

Nereikia skvošas, naudokite git commit-tree kad sukurtumėte našlaičių laikymą ir eikite su juo.

Paaiškinti

  • sukurti vieną įvykį per „ git commit-tree

    Kas yra „ git commit-tree HEAD^{tree} -m "A new start" :

    Sukuria naują įvykio objektą pagal pateiktą objekto medį ir skleidžia stdout naują įsipareigojimo objekto identifikatorių. Jei nenurodyta -m arba -F parinktis, perskaitykite žurnalo pranešimą iš standartinės įvesties.

    HEAD^{tree} reiškia medžio objektą, atitinkantį HEAD , ty dabartinio filialo pabaigą. žr. medžio objektus ir įsipareigojimus objektus .

  • iš naujo nustatyti dabartinį filialą į naują įvykį

    Tada git reset tiesiog atkuria dabartinį filialą į naujai sukurtą perkėlimo objektą.

Taigi darbo vietoje nėra jokios įtakos, ir nereikia perkelti / skvošas, todėl jis tikrai greitai. Reikalingas laikas neturi įtakos kapinyno dydžiui ar istorijos gyliui.

Variacijos: naujas repo iš projekto šablono

Tai naudinga kuriant „pradinį įsipareigojimą“ naujame projekte, naudojant kitą saugyklą kaip šabloną / archetipą / semestrą / skeletą. Pavyzdžiui:

 cd my-new-project git init git fetch --depth=1 -n https://github.com/toolbear/panda.git git reset --hard $(git commit-tree FETCH_HEAD^{tree} -m "initial commit") 

Tai neleidžia, kad repo šablonas būtų pridedamas kaip nuotolinis ( origin ar kitaip), ir sumažina repo šablono istoriją su jūsų originalu.

249
06 мая '14 в 8:45 2014-05-06 08:45 atsakymas, kurį pateikė ryenus gegužės 06 d. 14, 8:45 2014-05-06 08:45

Jei viskas, ką norite padaryti, yra skvošas, tuomet visa tai padarys prieš įsijungimą

 git rebase --interactive --root 

gali dirbti, tai yra nepraktiška daugeliui įvykių (pvz., šimtams įvykių), nes žiaurios jėgos operacija greičiausiai bus labai lėta, kad sukurtų interaktyvaus perrašymo redaktoriaus fiksavimo sąrašą, taip pat pati pradėtų veikti.

Toliau pateikiami du greitesni ir efektyvesni sprendimai, kai suskaldote daugybę įsipareigojimų:

Alternatyvus sprendimas # 1: Našlaičiai

Galite paprasčiausiai sukurti naują našlaičio filialą savo dabartinio filialo viršūnėje (t. Y. Naujausiame pataisyme). Šis našlaičių filialas sudaro visiškai naują ir atskirą fiksavimo istorijos medį, kuris iš tikrųjų atitinka visus jūsų įsipareigojimus:

git -checkout (1) Rankinis puslapis . 

Alternatyvus sprendimas # 2: minkštas atstatymas

Kitas veiksmingas sprendimas - tiesiog naudoti mišrią arba minkštą atstatymą į šaknį <root> :

git - reset (1) Rankinis puslapis . 
133
11 июня '14 в 6:24 2014-06-11 06:24 atsakymą pateikė vartotojo456814 birželio 11 d. , 14:24, 2014-06-11 06:24
 echo "message" | git commit-tree HEAD^{tree} 

Tai sukurs nenustatytų autorių teisių nustatymą su HEAD medžiu ir spausdins jo pavadinimą (SHA-1) ant stdout. Tada tiesiog iš naujo nustatykite temą.

 git reset SHA-1 
46
04 нояб. Atsakymas pateikiamas kusma 04 lapkričio. 2009-11-04 02:28 '09 at 2:28 2009-11-04 02:28

Taip aš tai padariau, tik tuo atveju, jei jis veikia kitam:

Atminkite, kad tokių dalykų visada kyla rizika, ir niekada nebuvo blogos idėjos sukurti įrašymo šaką prieš paleidžiant.

Pradėkite nuo registracijos

 git log --oneline 

Pereikite prie pirmojo įvykdymo, kopijuokite SHA

 git reset --soft <#sha#> 

Pakeiskite <#sha#> w / SHA, nukopijuotą iš žurnalo

 git status 

Įsitikinkite, kad viskas yra žalia, kitaip git add -A

 git commit --amend 

Pakeiskite visus dabartinio pirmojo įsipareigojimo pakeitimus

Dabar stumkite šią šaką ir ji perrašys, kas ten yra.

34
31 окт. atsakymas duotas „ Logan“ 31 val. 2015-10-31 09:19 '15 at 9:19 2015-10-31 09:19

Paprasčiausias būdas yra naudoti komandą update-ref "santechnika", kad pašalintumėte dabartinį filialą.

Negalite naudoti „ git branch -D , nes jis turi apsauginį vožtuvą, kad nustotų ištrinti esamą šaką.

Tai nuves jus atgal į „originalaus įsipareigojimo“ būseną, kurioje galite pradėti naują originalą.

 git update-ref -d refs/heads/master git commit -m "New initial commit" 
32
02 нояб. CB Bailey atsakymas 02 lapkričio. 2009-11-02 16:17 '09 at 16:17 2009-11-02 16:17

Aš perskaičiau kažką apie skiepų naudojimą, bet aš niekada to neištyriau.

Bet kokiu atveju, jūs galite šlifuoti paskutinius du rankiniu būdu atliekamus veiksmus tokiu būdu:

 git reset HEAD~1 git add -A git commit --amend 
24
01 нояб. atsakymą pateikė R. Martinho Fernandes lapkričio 01 d. 2009-11-01 13:27 '09 13:27 2009-11-01 13:27

Pirma, pasitenkinkite visus savo įsipareigojimus į vieną git rebase --interactive naudodami git rebase --interactive . Dabar jūs paliekate du įsipareigojimus skvošui. Norėdami tai padaryti, perskaitykite bet kurį iš

16
02 нояб. Atsakymas, kurį pateikė Frerich Raabe 02 lapkričio. 2009-11-02 16:07 '09 at 16:07 2009-11-02 16:07

Skvošas naudojant skiepus

Pridėti .git/info/grafts , įdėkite įsipareigojimo hash, kurį norite tapti šaknimi

git log dabar pradės šį įvykį

Kad jis taptų „tikru“ „ git filter-branch paleidimu

4
05 июля '17 в 22:12 2017-07-05 22:12 atsakymas dimus liepos 5 d. 17 d. 10:12 2017-07-05 22:12

Vienoje eilutėje yra 6 žodžiai

 git checkout --orphan new_root_branch  git commit 
3
16 авг. atsakymą pateikė kyb 16 rug . 2018-08-16 00:57 '18 prie 0:57 2018-08-16 00:57

sukurti atsarginę kopiją

 git branch backup 

iš naujo nustatyti nurodytą įvykį

 git reset --soft <#root> 

tada pridėkite visus failus į gamybą

 git add . 

įsipareigoti atnaujinti pranešimą

 git commit --amend --no-edit 

stumkite naują filialą su susmulkintu įsipareigojimu į repo

 git push -f 
2
19 июля '18 в 17:12 2018-07-19 17:12 atsakymą davė Dovydas liepos 19 d., 18 val., 12:12, 2018-07-19 17:12

Šis atsakymas pagerėja, kai pora yra aukštesnė (prašome balsuoti už juos), darant prielaidą, kad be vieno įsipareigojimo (be tėvų be istorijos) taip pat norite išsaugoti visus įsipareigojimo duomenis:

  • Autorius (vardas ir el. Paštas)
  • Kūrimo data
  • Komiteris (vardas ir el. Pašto adresas)
  • Nustatyti datą
  • Pranešti apie žurnalo pranešimą

Žinoma, naujo / vieno įsipareigojimo įsipareigojimas-SHA pasikeis, nes jis yra naujas (un) pasakojimas, tapęs mažesniu / mažesniu lygiu.

Tai galite padaryti, perskaitydami git log ir nustatydami kai kuriuos kintamuosius, skirtus „ git commit-tree . Darant prielaidą, kad norėsite sukurti vieną įvykį iš master naujoje one-commit šakoje, išsaugodami anksčiau pateiktus one-commit duomenis:

 git checkout -b one-commit master ## create new branch to reset git reset --hard \ $(eval "$(git log master -n1 --format='\ COMMIT_MESSAGE="%B" \ GIT_AUTHOR_NAME="%an" \ GIT_AUTHOR_EMAIL="%ae" \ GIT_AUTHOR_DATE="%ad" \ GIT_COMMITTER_NAME="%cn" \ GIT_COMMITTER_EMAIL="%ce" \ GIT_COMMITTER_DATE="%cd"')" 'git commit-tree master^{tree} <<COMMITMESSAGE $COMMIT_MESSAGE COMMITMESSAGE ') 
1
09 мая '16 в 5:12 2016-05-09 05:12 Atsakymą pateikė javabrett gegužės 09, 16 d. 5:12 2016-05-09 05:12

„Alternatyvus sprendimas Nr. 1: Našlaičiai“ padeda man.

„git rebase --interactive --root“ yra nesuderinamas su „gitignored“.

0
26 марта '18 в 16:17 2018-03-26 16:17 atsakymą duoda „ sasha-ch “ kovo 26 d. 18 d. 4:17 val. 2018-03-26 16:17

Aš paprastai tai darau taip:

  • Įsitikinkite, kad viskas yra padaryta, ir užsirašykite paskutinį įvykio ID, jei kažkas nepavyksta, arba sukurti atsarginę kopiją

  • Paleiskite git reset --soft 'git rev-list --max-parents=0 --abbrev-commit HEAD' kad galėtumėte atstatyti galvą prieš pirmąjį įvykį, bet palikti indeksą nepakitusią. Visi pakeitimai nuo pirmojo įsipareigojimo momento dabar bus pasirengę įvykdyti.

  • Paleisti git commit --amend -m "initial commit" kad atliktumėte pirmojo įsipareigojimo pakeitimus ir pakeiskite git commit --amend -m "initial commit" pranešimo tekstą, arba jei norite išlaikyti esamą įsipareigojimų pranešimą, galite paleisti git commit --amend --no-edit

  • Paleiskite git push -f kad priverstumėte savo pakeitimus

0
18 апр. Kent Munthe Caspersen atsakymas, pateiktas balandžio 18 d 2018-04-18 16:13 '18, 18:13 PM 2018-04-18 16:13

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