/ Je lepšie použiť zlúčenie alebo rebázu, ak sú dvaja ľudia na tej istej vzdialenej pobočke a majú konflikty, ktoré budú pripísané na svn - git, git - svn, git - rebase, git - merge

Je lepšie používať zlúčenie alebo rebráciu, keď sú dvaja ľudia na tej istej vzdialenej pobočke a majú konflikty, ktoré budú pripísané na svn - git, git - svn, git - rebase, git - merge

Moja kolegyňa a ja máme dôkladnú diskusiu o stratégiách zlúčenia a dúfam, že môžeme získať nejaké informácie, ktoré jej pomôžu vyriešiť.

Tl: dr je: Mali by sme použiť zlúčenie alebo rebase pri ťahaní zmien zo vzdialenej vetvy, aby sme neustále neupravovali riešenie konfliktu.

  • svn: naše hlavné zlaté úložisko
  • kufor: git vzdialené sledovanie vetvy svn. Používa sa na úpravu zmeny git pred zrušením subversionu.
  • funkcia-pobočka: git vzdialená pobočka, kde je kombinovaná práca 2+ kolegov na jednej funkcii
  • kolega1: Miestna pobočka prvého kolegu
  • kolega2: miestna pobočka druhého kolegu.

Využívame vynikajúci workflow spoločnosti Sebastien Varette Je git-svn dcommit po zlúčení v git nebezpečné?.

Problém, ktorý máme, je, že zakaždýmkolegu1 rebases od svn (prepracovaním do kufra a následným prebudovaním kolegu1 predtým, než sa presunie na funkčnú vetvu, keď sa to robí) potom sa zaviaže na funkciu, ktorá je konfliktná proti sebe navzájom. Rovnaké riešenie konfliktov sa musí robiť znova a znova - vždy, keď sa vykonáva pracovný postup svn rebase.

Všimnite si, že používame git rebase mirror un-3451 pre túto rebazu.

Môj argument je, že by sme mali používať git merge mirror un-3451, Podľa môjho názoru by to znamenalo záväzok, ktorý je označený ako zlúčenie dvoch predchádzajúcich záväzkov. Preto by git vedel, že nebude používať predchádzajúce záväzky, ale namiesto toho použije zlúčenie.

Moja kolegyňa na druhej strane to tvrdípomocou zlúčenia bude konečný zlúčenie s svn oveľa ťažšie a veľa preferuje použitie rebase. Zistí, že je to jednoduché - bohužiaľ nie je ten, ktorý vyriešil všetky konflikty, tvrdí, že použitie squashu by prinieslo rovnaký účinok.

Môj argument je, že zlúčenie má rovnaký účinok ako squash, ale zahŕňa označenie záväzkov, ktoré boli zahrnuté.

Štát 1

svn-trunk:      A

git-trunk:       A"

remote-feature:   A"-----C
     /
c1-feature:        A"--C

c2-feature:         A"--D

Štát 2

C konflikt s D na súbore 1 (F1). F1 riešil konflikt, takže D sa stáva D ".

git pull --rebase remote feature
git add F1
git rebase --continue
git push

Graf záväzkov:

svn-trunk:      A-----B
     (svn rebase)
git-trunk:       A"----B"

remote-feature:   A"-----C---------D"
     /        /
c1-feature:        A"--C        / (git push)
           /
c2-feature:         A"-------C--D"

Štát 3

Teraz kolega1 chce vytiahnuť zmeny z svn-trunk:

git checkout trunk
git svn rebase

a potom ich znova na c2-funkciu

git checkout feature-branch
git rebase trunk

Rebase kladie B1 na c2-funkciu a potom C a potom chytiť D "a núti rovnaké rozlíšenie konfliktu, aby sa stal D" "

Graf záväzkov:

svn-trunk:      A--------B
         (svn rebase)
git-trunk:       A"--------B"
         
remote-feature:   A"-----C-------D"
     / ----  
c1-feature:        A"--C          
               
c2-feature:         A"----------B"-C--D""

Zakaždým git checkout trunk; git svn rebase; git checkout feature-branch; git rebase trunk; git push remote Cyklus sa stáva, že všetky rezolúcie konfliktu sa musia robiť znova a znova.

otázky

  1. ak rebase od svn, stlačte na diaľkový ovládačpobočka, má kolega2 tlačiť niektoré záväzky do vzdialenej vetvy a potom neskôr kolega1 urobí zlúčenie z vzdialenej pobočky, výsledná zlúčenie spomína svn spácha (a preto spôsobí problém pri následných rebázach).
  2. Čo je lepšie v scenári vyššie: rebase alebo merge?
  3. Bude funkcia znovupoužitia väčšieho využitia?

Veľká vďaka!

odpovede:

0 pre odpoveď č. 1

Najprv vynechám identické uzly a reorganizujem uzly tak, že každá vetva má hlavu ako pravý uzol, aby reprezentovala strom lepšie. (opravte ma, ak je strom nesprávny). Moje poznámky sú odvážne.

Štát 1

svn-trunk:     A

git-trunk:       A"

c1/remote-feature: ----C



c2-feature:            --D

Potom D bol rebased ako D "na C. To je ľahká časť (pochopiť). Mohol to byť cherrypick (alebo" obyčajný "D), ak nebol žiadny konflikt.

Štát 2

C konflikt s D na súbore 1 (F1). F1 riešil konflikt, takže D sa stáva D ".

svn-trunk:     A-----B
     (svn rebase)
git-trunk:       A"----B"


c1-feature:         C

c2/remote feature:    D"

Teraz sa dostávame do ťažkej časti.

Štát 3

Teraz kolega1 chce vytiahnuť zmeny z svn-trunk:

git checkout trunk
git svn rebase

a potom ich znova na c2-funkciu

git checkout feature-branch
git rebase trunk

Rebase kladie B1 na c2-funkciu a potom C a potom chytiť D "a núti rovnaké rozlíšenie konfliktu, aby sa stal D" "

Graf záväzkov:

svn-trunk:     A

git-trunk:       A"----B"
     
     
c1-feature:         C     
     
remote feature:       D"    

c2-feature:                   C----D""

Mám nejaké ťažkosti s pochopenímprechod od štátu 2 k štátu 3, pretože vaše komentáre sa nezdá byť v súlade so stavom grafu (čo vyzerá viac ako pokus o rebase c2 / vzdialený prvok na kmeň (na B "), s c2-funkciou ako Myslím, že to, čo ste naozaj chceli, je toto:

Požadovaný stav 3

svn-trunk:     A-----B
     (svn rebase)
git-trunk:       A"----B"


c1-feature:               C

c2/remote feature:          D"

čo znamená, že ste neboli schopní rebase A "-C-D"na A "-B" bez potreby ďalšieho riešenia konfliktu v súvislosti s D ", čo je zvláštne, pretože by sa to nemalo stať (pokúsil som sa to reprodukovať na git-svn repo a funguje tak, ako to bolo určené). dokonca aj problém git-svn, pretože ste len opätovne vytvorili jednu gitovú vetvu proti inej. Skutočne vyzerá to, že sa pokúšate správne prepracovať, takže môžem len predpokladať, že niektoré informácie chýbajú, t. J. To, čo som opísal, nie je to, čo sa skutočne stalo.


0 pre odpoveď č. 2

Som kolega2.

Mojou pozíciou je, že je to časté rebase odSVN do nášho odvetvia, ktoré spôsobuje bolesť. Zakaždým, keď znova zmeníme nastavenú zmenu, sa prehraje nad zmenami SVN. Aktuálne konflikty sa nachádzajú v našej opakovanej sade zmien.

V ideálnom prípade by sme našu zmenu zapustili do jediného záväzku, aby sa konflikty, ku ktorým došlo v súbore zmien, vyriešili a nie je potrebné ich opätovne vyriešiť po ďalšej rebaze.

Alternatívne by sme mohli čakať na rebase od SVN, až kým nebude funkcia vetvy dokončená a pripravená na odhodlanie.

Nie som presvedčený, že prechod z rebasingukeď sa budeme snažiť o zlúčenie, zlepšíme náš proces vôbec. Bod bolesti je častými rebázami od spoločnosti SVN a ja sa domnievam, že zlúčenie medzi funkciou a našimi miestnymi pobočkami zlepší revíziu SVN.