Vycházím z toho, že prakticky všechno, co vyvíjím, se někdy bude sdílet. Někdo to řeší tak, že při otevření přístupu z vnějšku se prostě provede jeden gigantický commit a veškerá historie se tím ztratí, ale to mi připadá jako blbost (proč v takovém případě vůbec používat SCM?). Zvlášť slavná kauza SCO ukázala, jak je důležité mít prokazatelné trasování kódu.
Úplná linearizace také není vždy žádoucí. Třeba když se aplikuje nějaká ucelená série (např. nová netriviální featura), může být praktické naopak použít " merge --no-ff
", aby bylo jasně patrné, co přesně do ní patří. A v linuxovém jádře se navíc (ve velké míře) ujala praxe, že se ten do commit message toho merge commitu zkopíruje cover letter té série, díky čemuž zůstanou informace z něj zachovány a snadno dostupné.
Ano, je potřeba striktně rozlišovat, jestli si hraji na svém vlastním písečku nebo zda jsem už výsledky publikoval pro ostatní - pak by historie měla být svatá a neměla by se přepisovat.
Mercurial má dobré prostředky jak to rozlišit: fáze (public vs. draft) a dobré prostředky jak tu historii přepisovat, pokud je to přípustné: rebase, histedit.
Mercurial má trochu jinou filosofii resp. výchozí přístup oproti gitu - chová se k historii šetrněji a je těžší si v něm něco rozbít nebo nenávratně smazat. Nicméně pokud člověk chce a má potřebu si např. dělat historii a grafy "hezčí", tak prostředky k tomu má.
Přinejhorším můžu "na prasáka" změnit tu fázi a přepsat i to, co už jsem publikoval, ale pak si ponesu následky...
Jestli "rebasem do sdílených větví" myslíte to, že před mergem do sdílené větve (nebo současně s ním) uděláte rebase, tak v tom samozřejmě žádný problém není. Naopak, často může být ku prospěchu věci, že se vyhnete příliš komplikovanému a neprůhlednému merge commitu, když je tam nějaký složitější konflikt. (Ale ani na tom nepanuje úplná shoda, třeba Linus to nemá rád, protože se pak dělá merge něčeho, co v této podobě nikdo pořádně netestoval.)
Co je problém a kvůli čemu se občas zjednodušeně tvrdí, že "rebase je zlo", je když se najednou změní commity, které už mají ostatní vycheckoutované a na kterých už možná mají postavené vlastní lokální větve s rozdělanou prací. V lepším případě jim to jen přidělá práci, v horším riskujete, že následný merge takové větve tam zavleče zpátky tu původní historii nebo - hůř - její náhodnou část. (Samozřejmě není problém jen rebase, úplně stejně by škodil "commit --amend", "rebase -i", reset někam zpátky apod., což jsou všechno velmi užitečné a často nepostradatelné nástroje pro lokální fázi vývoje.)
Je ale samozřejmě rozdíl, jestli je to malý projekt, na kterém pracují tři nebo čtyři vývojáři, kteří jsou ve stálém kontaktu, takže je lze snadno upozornit, co jste udělal a proč, nebo jestli je to veřejný projekt, kde tu branch mohou mít vycheckoutovanou desítky, stovky nebo tisíce lidí, které ani neznáte a nemáte je jak kontaktovat.
Z hlediska toho, co nástroj umožňuje, to ale roli nehraje, protože git ze své podstaty nerozlišuje, co je veřejné a co ne, takže nemá tušení, jestli ten force push je do veřejného repozitáře nebo mezi mým notebookem a pracovní stanicí.
Tak tomu nerozumím, pokud dělám na své `feature` větvi, tak dělám pull --rebase z hlavní větvě. Svoje změny dávám navrch tomu, co přichází z `main`. Pak otevřu pull-request a OK. Na bočních větvích je rebase zcela normální. Kde je problém?
https://stackoverflow.com/a/28472221
BTW Do postranní vetvě lze aplikovat i push force, pokud se opravdu potřebuji dostat stav synchronizovaný s main větvi (párkrát jsem si rozhasil kód na feature větvi). Takový fundamentalismus, co se smí a nesmí je dosti relativní.
29. 11. 2021, 09:56 editováno autorem komentáře
Rychlý grep skrz hlavní Gentoo repozitář potvrzuje že toho opravdu není moc. Když vyházím balíčky vyloženě určené pro mercurial (různé GUI, pluginy, atd) tak zbyde všeho všudy 25 projektů, z toho jen pár významných (sudo, hugin, x265).
app-admin/sudo
app-editors/xemacs
app-portage/layman
dev-games/physfs
dev-haskell/filestore
dev-ml/dune-configurator
dev-ml/dune-private-libs
dev-python/setuptools-scm
dev-python/vcstools
dev-qt/qt-creator
dev-util/cwdiff
dev-util/rbtools
dev-util/rosinstall
dev-util/wstool
media-gfx/graphicsmagick
media-gfx/hugin
media-libs/x265
media-libs/xine-lib
net-im/mcabber
net-im/prosody-modules
sys-apps/etckeeper
www-apps/blohg
www-apps/gitit
www-client/dillo
x11-wm/subtle