Portál AbcLinuxu, 1. května 2025 14:02
reflog
.
git gc
) na te vetvi, kterou prave vyresetoval ne.
reset --hard
hrůzného, pouze vyresetuje stav indexu (a s --hard
i souborů) k požadovanému commitu. Mně spíš přijde hrůzný ten SVN popis IMO neporovnatelně lepšíZkuste to rozvést?
git reset --hard hash
resetovat do libovolného minulého stavu, i kdyby nebyl dosažitelný z žádné současné větve.
Kdybych chtěl editovat historii komplikovanějším způsobem, tak bych použil rebase
v interaktivním módu asi takto:
[ wiskas@zohar ~/src/ffmpeg (new_conv2)]$ git rebase -i masterto otevře vim se seznamem commitů oproti větvi master.
pick 1e0c8de metadata: wrap conversion tables in a struct. pick 7f728c3 metadata: add callbacks to conversion system. pick 2fa0890 matroska: convert tag keys to uppercase when muxing. pick 0b0fbeb id3v2: merge TYER/TDAT/TIME frames to "date" tag on conversion. pick 3b60299 asf: truncate date to year when muxing. # Rebase aa5b13a..3b60299 onto aa5b13a # # 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's log message # # If you remove a line here THAT COMMIT WILL BE LOST. # However, if you remove everything, the rebase will be aborted. #Jednotlivé commity tady můžu označit pro smazání, editaci atd a git to zařídí.
Why is git better znám a na to video se ještě kouknu v naději že pochopím proč "jsou vnitřnosti nesrovnatelně lepší".V tomhle zrovna pomůže spíš ten Pro Git než Linusova přednáška. Pamatuju si, že se mi líbila, ale že jsem se moc nedozvěděl. Tedy kromě toho, že je git nesrovnatelně lepší
Proč je reverzní mergování (aka undo commit) tak hrůzné?Pokud tomu dobře rozumím, budeš mít v historii nový commit se spoustou smazaných změn?
Jak to řeknu gitu? Když ho resetnu (nebo dokonce hard) na verzi 5 tak to nebude to samé, protože tím oddělám všechny změny 5-10. Nebo ne?To, co jsem udělal já, vrátí ukazatel větve master na commit 5. Commity 6–10 zůstávají v repository a na poslední z nich ukazuje větev
new-feature
, kterou jsem založil před posunem master. (Teda takhle si to alespoň já představuju Při práci se SVN po síti jsem nikdy 5 vteřin nečekal. Na gigabitové síti se slušným HW opravdu není síť limitující faktor, nýbrž disk, a na ten si počkáte i u gitu.My nemáme kancl, pracuju doma. To je pak síť výrazný bottleneck.
Není to o disciplíně, ale o tom, že co máte v historii je v podstatně větším bezpečí, než to, co se váli v working copy.Nevím, jestli si rozumíme. Nejde o to, že bych si něco syslil doma a pak to teprve pustil na síť. I kdybych po každém commitu tlačil změny do centrálního repository, díky stagingu mám lepší kontrolu nad rozdělením provedených změn do commitů.
Ale mikro branchování lze dělat i na SVN. "svn copy" (vytvoření branche) a následné "svn switch" (přepnutí working copy) jsou téměř no-op příkazy.Možná na té rychlé síti, v tomhle nás jasně ovlivňuje pracovní prostřední. Na většinu zbývajících otázek neznám kloudnou odpověď, bohužel, v gitu se zatím moc nevyznám. Něco málo: Git uchovává snímky, nikoliv delty. V týmu zatím git nepoužíváme kvůli absenci opravdu příjemných grafických frontendů (kluci mají averzi k příkazové řádce a grafické nadstavby gitu zatím nejsou tak pěkné jako GUI nad Subversion). Pullování se běžně řeší veřejným repository. Na soukromém pracuju a když jsem hotov, pushnu do veřejného repository na serveru, odkud si může zbytek týmu změny stáhnout (= není potřeba dělat z vlastní mašiny server).
díky stagingu mám lepší kontrolu nad rozdělením provedených změn do commitů.To chápu, ale uvažuju, co se stane s nestagovanými změnami. Budou dále ve working copy a riziko že se náhodou přepíšou (nebo ztratí při změně branche) se zvyšuje s jejich věkem. IOW nejlepší je dělat check in všeho tak cca každou půl až hodinu.
Možná na té rychlé síti, v tomhle nás jasně ovlivňuje pracovní prostřední.Zrovna tohle by mohlo trvat obstojně dlouho i na pomalé síti. Bude se doslova jednat o přenos pár bajtů. Ale je fakt, že SVN exceluje hlavně v uzavřených týmech na lokálních sítích.
kluci mají averzi k příkazové řádce a grafické nadstavby gitu zatím nejsou tak pěkné jako GUI nad SubversionTohle se dá řešit nějakým IDE ;)
Na soukromém pracuju a když jsem hotov, pushnu do veřejného repository na serveruJá jsem právě někde četl že je lepší dělat vždy jenom pull? Pokud děláte tohle, tak to je vlastně stejná situace jako byste měli centrálně SVN a používali git+svn? A pokud udělám push, pak pushuju do nějaké aktivní větve, nebo můžu tímto způsobem pushnout třeba 3 branche?
To chápu, ale uvažuju, co se stane s nestagovanými změnami.Žádné nejsou. Jde o, že se třeba vypravím do souboru X opravit chybu. Cestou si v polovině souboru všimnu jiné, tak ji zároveň opravím též. Pak můžu pomocí
git add -p
obě změny rozdělit do dvou nezávislých commitů, které jdou okamžitě do historie.
Zrovna tohle by mohlo trvat obstojně dlouho i na pomalé síti. Bude se doslova jednat o přenos pár bajtů.Nevím proč, ale trvá to. Máme mizerný server v zámoří, zatím nebyl čas přejít na lepší řešení. V gitu je to místní operace:
$ time ( git branch foo && git branch -D foo ) Deleted branch foo (was 5490107). real 0m0.122s user 0m0.004s sys 0m0.016s
Já jsem právě někde četl že je lepší dělat vždy jenom pull? Pokud děláte tohle, tak to je vlastně stejná situace jako byste měli centrálně SVN a používali git+svn? A pokud udělám push, pak pushuju do nějaké aktivní větve, nebo můžu tímto způsobem pushnout třeba 3 branche?Veřejné repository pro pushe jsou naprosto běžná praxe, viz celý GitHub. Rozdíl je v tom, že push můžu dělat třeba jen jednou denně, když se práce stabilizuje, když mám připojení k síti, když končím s prací. Když mi během dne ujede ruka a vyrobím nesmyslný commit, můžu ho zredigovat podle potřeby a veřejná historie zůstane čistá. Pushnout se dá cokoliv. Jeden commit, jedna větev, víc větví, tagy.
Jde o, že se třeba vypravím do souboru X opravit chybu. Cestou si v polovině souboru všimnu jiné, tak ji zároveň opravím též.Aha, tak to já si radši napíšu na papírek, protože se může stát, že bych mezitím zapomněl na tu první chybu. :)
Tady asi budou hrát roli síťové latence, případně mrštnost serveru.real 0m0.122s
$ time (svn cp ^/trunk ^/branches/boo -m testboo && svn rm ^/branches/boo -m testboo) Committed revision 3942. Committed revision 3943. real 0m0.856s user 0m0.013s sys 0m0.013s
Veřejné repository pro pushe jsou naprosto běžná praxeOK. Já sleduju jen vývoj jádra a pár dalších projektů a tam lítají spíš pull requesty.
Například to reverzní mergování (undo commit)?Je možné přepsat historii tak, aby ten commit vypadl (viz výše), nebo je možné přidat commit revertující ty změny, stejně jako v SVN (git revert). Každé má své výhody i nevýhody.
Nebo jak řeší git přesun souborů/adresářů a následný merge nové struktury?Z vlastní zkušenosti (ale stalo se mi to jen jednou) to řeší dobře. Někdy je ale ta detekce kopií dost otravná.
Co se stane, když z repozitáře smažu 3 náhodné revize?Jak smažu? Pokud půjdu na killing spree do adresáře .git a smažu náhodné soubory, pak to pochopitelně přestane fungovat. Jinak nevím, co myslíš tím "smažu".
Jak řešíte zálohy?Nevím jak to kdo řeší, ale kromě periodického fetchování do zálohy funguje na .git adresář i cp -a, takže i jakýkoli jiný zálohovací program.
Někdy je ale ta detekce kopií dost otravná.Např?
Pokud půjdu na killing spree do adresáře .git a smažu náhodné soubory, pak to pochopitelně přestane fungovat. Jinak nevím, co myslíš tím "smažu".Jo, myslím to takhle, respektive třeba když se to nějakým způsobem poškodí. Jde nějak přesněji definovat co a za jakých podmínek přestane fungovat?
funguje na .git adresář i cp -a, takže i jakýkoli jiný zálohovací program.Jasně, myslel jsem to spíše procesně. U SVN stačí zálohovat repo, u gitu to vypadá že by si měl zálohu každý pořešit sám?
Někdy je ale ta detekce kopií dost otravná. Např?Např. když je v projektu hodně skoro stejných souborů (třeba makefily kde většinu zabírá licence), tak to detekuje kopie in mezi naprosto nesouvisejícími soubory a je spíš loterie, který si vybere. Pak to minimálně vypadá blbě v git show.
Jo, myslím to takhle, respektive třeba když se to nějakým způsobem poškodí. Jde nějak přesněji definovat co a za jakých podmínek přestane fungovat?Pokud si smažeš blob (data nějakého souboru), tak jsi o něj přišel. Pokud commit, tak teoreticky jde (pokud ho nutně nepotřebuješ) předělat historii větve tak, aby na ní nebyl. Když si smažeš odkaz na větev nebo tag, jde to spravit poměrně bezbolestně (pokud víš kam ukazoval - není potřeba pamatovat si sha1, stačí prohrabat repozitář a vybrat si z nereferencovaných commitů ten svůj. Pokud smažeš pack, záleží, co v něm bylo.
reset --hard
).
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.