„Git“ atkūrimas praranda istoriją, tada kodėl perkeliama?

Per pastarąsias keletą dienų ieškojau perkrovimo naudojant „git“. Dauguma perkrovimo argumentų teigia, kad jis išvalo istoriją ir tampa linijiniu. Jei atliksite paprastus susijungimus (pvz.), Gausite istoriją, kuri parodo, kada istorija išsiskyrė ir kada ji buvo grąžinta kartu. Kiek galiu pasakyti, perskirstymas ištrina visą istoriją. Kyla klausimas: kodėl nenorite, kad atpirkimo istorija atspindėtų visus būdus, kuriais būtų sukurtas kodas, įskaitant tai, kur ir kaip jis skiriasi?

35
09 марта '11 в 22:03 2011-03-09 22:03 ngephart yra nustatytas kovo 09 '11, 22:03 2011-03-09 22:03
@ 4 atsakymai

Kiek galiu pasakyti, perskirstymas ištrina visą istoriją.

Tai neteisinga. Pertvarkymas, kaip rodo pavadinimas, keičia įsipareigojimo bazę. Paprastai šiame procese nėra jokio įsipareigojimo (išskyrus tai, kad negaunate sujungimo pataisos). Nors jūsų argumentas, kad visi vystymosi procesai istorijoje tikrai yra teisingi, tai yra teisinga, labai dažnai tai sukelia painias istorijas.

Ypač kai dirbate su kitais žmonėmis, kurių kiekvienas dirba savo filialuose, dėl kurių reikia atlikti tam tikrus pakeitimus (pvz., A prašo B įgyvendinti kažką taip, kad A galėtų naudoti šią funkciją savo dizainu), tai veda prie daugelio susijungimų, pavyzdžiui, pavyzdžiui:

  #--#--#--#--*-----*-----------------*---#---\ Branch B / / / / \ ---#-----#-----#-----#-----#-----#-----#-----#-----* Branch A 

Šiame pavyzdyje turime filialą, kuris dirba atskirai laiko atžvilgiu, bet nuolat patraukia pakeitimus į pradinį filialą (# - originalas įsipareigoja, * sujungia).

Dabar, jei prieš susijungdami vėl perkeliame į B filialą, galime gauti:

  #--#--#--#--#---\ Branch B / \ ---#---#---#---#---#---#---#---#---------------* Branch A 

Tai atitinka tuos pačius faktinius pakeitimus, tačiau B buvo atstatyta į senesnę A fiksaciją, todėl visi anksčiau padaryti B susijungimai nebereikalingi (kadangi šie pakeitimai jau yra šiame senesniame įraše). Ir visi trūkstami įsipareigojimai dabar yra susijungimai, kuriuose paprastai nėra informacijos apie plėtros procesą. (Atkreipkite dėmesį, kad šiame pavyzdyje taip pat galite atkurti paskutinį A įsipareigojimą, kad vėliau gautumėte tiesią liniją, efektyviai ištrindami bet kokius raginimus į antrąjį filialą)

25
09 марта '11 в 22:27 2011-03-09 22:27 atsakymas buvo duotas kovo 9 d. 11 val. 22:27 2011-03-09 22:27

Įsivaizduokite, kad dirbate slaptu pasaulinio dominavimo projektu. Šiame sąmoksle yra trys pagrindiniai atstovai:

  • Genijus
  • Bendra
  • Kompiuterių hakeris

Ir jie visi sutinka, kad jų slapta bazė būtų per 1 savaitę su vienu detaliu planu.

Kompiuterio įsilaužėlis, kuris yra pragmatiškas programuotojas, pasiūlė naudoti „Git“ saugoti visus plano failus. Kiekvienas iš jų parengs pradinį projekto atpirkimo sandorį ir sujungs jį per vieną savaitę.

Visi sutinka, o sekančiomis dienomis ši istorija yra tokia:

Genijus

Iš viso jis sudarė 70, 10 per dieną.

Bendra

Jis pataikė į savo bendražygių atpirkimą ir parengė strategiją juos nugalėti. Jis padarė tris fiksacijas, paskutinę dieną.

Kompiuterių hakeris

Šis pragmatiškas programuotojas naudojo filialus. Jis padarė 4 skirtingus planus, kiekvienas filialo. Kiekvienas filialas buvo iš naujo įdiegtas, kad būtų tik vienas.

Praėjo septynios dienos, o grupė vėl susirinko, kad sujungtų visus planus į vieną šeimininką. Jie visi norėjo pradėti, todėl visi bandė sujungti visus dalykus.

Čia yra istorija:

Genijus

Jis sujungė visus pakeitimus iš bendro repo, o tada su kompiuterių hakeriu. Ir tada, būdamas logiškas meilužis, jis pažvelgė į žurnalą. Jis tikėjosi pamatyti logišką idėjos evoliuciją, kur viskas buvo pastatyta remiantis ankstesnėmis idėjomis - jie atlieka.

Tačiau tai, ką parodė žurnalai, buvo daugybė skirtingų idėjų, sumaišytų laiko juostoje. Vienas skaitytojas tikrai negalėjo suprasti evoliucijos, argumentavimas atliekamas tik skaitant fiksavimo laiko eilutę.

Taigi jis baigė netvarą, kad net genijus negalėjo suprasti.

Bendra

Bendroji mintis: padalink ir laimėk!

Ir taip jis sujungė repo genijus dėl savo atpirkimo. Jis pažvelgė į žurnalą ir pamatė, kad Genijaus idėja, kuri sekė nesuprantama progresija, įsipareigojo iki paskutinės dienos. Paskutinę dieną buvo sumaišytos bendrosios ir genijų idėjos.

Jis stebėjo Hacker kompiuterį ir žinojo apie „Rebase“ sprendimą. Taigi jis padarė savo idėjos transkripciją ir bandė vėl susijungti.

Dabar žurnalas kiekvieną dieną parodė logišką pažangą.

Kompiuterių hakeris

Šis pragmatiškas programuotojas sukūrė „Genius“ idėjos integracijos šaką, kitą - „Bendrąją“ idėją ir kitą savo idėjoms. Kiekvienoje šakoje jis padarė permutaciją. Ir tada jis suvienijo visus į šeimininką.

Ir visi jo komandos nariai pamatė, kad jo žurnalas buvo puikus. Tai buvo lengva. Iš pirmo žvilgsnio tai nebuvo aišku.

Jei idėja įvedė problemą, buvo aišku, kas buvo įvesta, nes buvo tik vienas.

Jie nustojo užkariauti visą pasaulį, ir jie išnyko dėl Subversion naudojimo.

Ir visi buvo laimingi.

45
09 марта '11 в 22:33 2011-03-09 22:33 atsakymas yra suteiktas Nerian kovo 09 '11, 22:33 2011-03-09 22:33

Jei norite išspręsti bet kokį konfliktą vietoje (t. Y. Prieš nuspaudžiant juos atgal į viršų), perkeliate daugiausia vietinius įsipareigojimus (tuos, kuriuos dar nepaspausdinote). .
Žr. „ Git workflow ir reboot and merge Questions “ ir, kai kuriais atvejais, „ git rebase vs git merge “.

Tačiau atkūrimas neapsiriboja šiuo scenarijumi ir kartu su „interaktyviu“ leidžia atlikti vietinį pergrupavimą ir savo istorijos valymą. Taip pat žr. „ Git Checks / Scripting git Historyapipavidalinimas .

kodėl nenorite, kad atpirkimo istorija atspindėtų visus kodekso kūrimo būdus, įskaitant tai, kur ir kaip ji skyrėsi.

  • Centralizuotoje VCS, svarbu niekada neprarasti istorijos, ir tai iš tikrųjų turėtų atspindėti „visus kodo kūrimo būdus“.
  • Išplatintame VCS, kur galite atlikti įvairius vietinius eksperimentus, prieš paskelbdami kai kuriuos savo filialus aukštyn krypties kryptimi, mažiau prasmės laikyti viską istorijoje: ne kiekvienas turi klonuoti ir pamatyti visus savo filialus, testus, alternatyvas ir kt.
11
09 марта '11 в 22:08 2011-03-09 22:08 atsakymą pateikė VonC kovo 09 '11, 22:08 2011-03-09 22:08

Jei padarote klaidą viešojoje saugykloje ir niekas neatidarė / neprijungė / ištraukė, galite išsaugoti veido ir painiavos:

 git reset --hard [SHAnumber] git rebase -f master git push -f origin HEAD:master 

Norėdami ištuštinti krepšelį:

 git gc 
0
09 янв. atsakymas pateikiamas mda 09 jan. 2012-01-09 17:05 '12, 5:05 val. 2012-01-09 17:05