VS 2015 s Git - merge tools nepracuje správně rubrika: Nástroje: Verzování

2 mikirc
položil/-a 15.5.2017

Dobrý den
Ve firmě jsem z TFS přešli na Git.

Hlavní repositář je na serveru, kde je repositář bez pracovní verze.
Programátoři mají VS2015 s integrovaným nástrojem na git a připojujeme se k repositáři přes UNC cestu. Každý má na svém počítači lokální verzi toho co je na serveru a potom vlastní větve.

A problém který nám komplikuje práci.
Nástroj, který spojuje změněné soubory se soubory na serveru (nebo v jiné větvi) někdy ignoruje změny a nezapíše je.
Uvedu příklad.
Já i kolegyně provede nad repositářem SYNC, aby jsme měli aktuální verzi, která je na serveru. Pak si založíme lokální větev, ve které budeme provádět změny a budeme oba měnit ty samé soubory.
Když máme vše hotové, tak kolegyně udělá commit změn a pak provede merge s hlavní větví. Vše proběhne bez problému. A změny se sesynchronizují se serverem.

Já udělám také commit svých změn. Než udělám merge, tak si udělám se serverem SYNC abych merge prováděl s aktuální verzí, tedy i se změnami, které tam udělala kolegyně. Když dám merge, tak čekám, že dojde ke konfliktům, a zde nastane problém. Visual studio se rozhodne, že všechny změny, které jsem udělal já zahodí, a ke konfliktu dojde pouze v souboru, kde jsme oba změnili stejný řádek. Zde použiji nástroj určený pro merge a ten mi hlásí, že vše co jsem upravil bude zahozeno a zůstane serverová verze a konflikt je pouze u těch společně upravených řádků.
Tedy dochází ke stavu, kdy VS zahazuje změny, které jsme udělali, a někdy je dokonce přepíše staršími, když někdo po delší době udělá sync.
Dále při přepíná větví, VS hlásí, že některé soubory byly změněny, i-když DIFF nástroj ukazuje že nebyly a GitGui také žádné změny nehlásí. Jedná se o soubory, které jsou ve větvích různé a při přepnutí větve se skutečně musí na disku přepsat verzí v dané větvi.

Jsou tyto problémy normální u integrovaného nástroje Git v VS nebo máme něco špatně nastavené?

Komentáře

  • Honza Břešťan : Sync dela zaroven Pull zmen ze serveru a Push lokalnich zmen na nej. Co samotny Pull? (Klidne ve VS, ne nutne z commandline.) Ten by mohl dat vic prostoru k mergi. 15.5.2017
  • anti.cz : Jak pise Honza Břešťan. Sync jsem v zivote nepouzil. Pouzivam jen TortoiseGit a conzoli (integrovany udelatka v IDE apod. bych asi radsi nepouzival). Mozna by byl lepsi postup. Nez upravovat primo localniho mastera(prekpokladam, ze to tak delate). Tak na kazkou zmenu si zalozit novou vetev. Ja to delam nasledovne: Pull; nova vetev z mastera -> hotfix; udelam zmeny a commit do hotfix; znova pull masteru a merge local mastera do hotfix(kdyby nekdo neco udelal a konflikty si rasi vyresem predem); pak merge hotfix do mastera a push. 15.5.2017
  • Kit : Ani jsem netušil, že nějaký SYNC existuje. Někdo to i používá? 15.5.2017
  • Honza Břešťan : @Kit: V samotnem gitu zadny "sync" neni, ale ve spouste integraci ano - ve VS, GitHub Desktop... Neznam nikoho, kdo by to bezne pouzival, protoze workflows nad gitem byvaji slozitejsi nez "vem head ze spolecne vetve a nacpi tam moje zmeny bez pull requestu" 15.5.2017
  • mikirc : @ anti.cz: Nad hlavní větví nepracujeme, vždy si uděláme novou větev pro každou úpravu. Rozdíl je že místo pull použiji sync a potom, že udělám merge hotfixu do masteru. A není tam ten krok masteru do hotfixu, což je asi užitečné. Ale jaký nástroj použít na merge aby to skutečně zobrazilo změny a ne že si to na pozadí samo řekne toto ano toto ne jak to dělá VS a pak mi některé změny zahodí. 16.5.2017
  • harrison314 : @mikirc: VS nic nezahodi, len vola interne git prikazy za teba, mne sa skor zda ,ze ten workflow nie je uplne v poriadku, skuste got pouzit klasicky 16.5.2017
  • kravcik.pavel : My používáme sync také běžně. Klasicky. Větev z masteru do ní commity. Následně sync. A merge requesty v gitlabu. 16.5.2017
odkaz
2 mikirc
odpověděl/-a 29.5.2017

Děkuji za rady, po chvilce bádání jsem zjistil, že tento problém nastává kvůli formátování souborů. Celý projekt je v UTF8 se signaturou, když se přepne větev, tak visual studio gitem přepsané soubory kontroluje, asi vůči historii a z nějakého důvodu vyhodnotí že v historii byl soubor uložen v jiném kódování, třeba v UTF-8 bez signatury, nebo dokonce windows. Tuto informaci jsem zjistil až za použití easy-git místo integrovaného modulu git. Neboť easy-git to napíše, že je rozdílné kódování. Ale nemám ponětí kde přijde k tomu, že to kódování je jiné, když celý projekt je v UTF-8. Dokonce jsem zkusil vytvořit kopii repositáře, která neobsahovala historii a odpojil ji od serveru aby se k ní nedostal. Fungovalo do doby než se začala historie tvořit a pak se začaly objevovat zase falešné soubory.
Kolegu ještě napadá jestli nedělají bordel konce řádků. Že by s tím mělo visual studio problémy, když historii tahá z databáze a porovnává.

Komentáře

Pro zobrazení všech 5 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.