Middle
Ինչպե՞ս է ձեր ընկերությունում տեղի ունենում ճյուղերի միավորում (merge) կամ պատմության վերականգնում (rebase) տարբերակային կառավարման համակարգում։
sobes.tech AI
Պատասխան AI-ից
Մեր թիմում մենք հետևում ենք workflows, որոնք հիմնված են Git-ի վրա: Թե՞մ փոփոխությունները ինտեգրելու համար մենք օգտագործում ենք երկու հիմնական մոտեցում՝ merge և rebase, որոնք ընտրում ենք իրավիճակից և ճյուղի տեսակից կախված:
Merge:
- Հաճախ կիրառվում է երկարատև ճյուղերի միացման համար, օրինակ՝ dev-ը main-ին կամ ֆիչեր-ճյուղերի ինտեգրացիայի համար՝ dev-ում:
- Ստեղծում է միացման commit, որը հստակ ցույց է տալիս, երբ տեղի է ունեցել փոփոխությունների միացում այլ ճյուղերից:
- Պահպանում է ամբողջ պատմությունը, ներառյալ բոլոր ճյուղավորումները:
git checkout dev // Փոխվում ենք նպատակային ճյուղը
git merge feature/new-feature // Կատարում ենք ֆիչեր-ճյուղի միացում
Rebase:
- Օգտագործվում է մաքուր և ուղիղ պատմություն պահելու համար՝ ֆիչեր-ճյուղերում մինչև դրանց ինտեգրացիան (հաճախ՝ dev-ում):
- Թեկուզում է ներկայիս ճյուղի կոմիտները վերևում՝ նպատակային (dev) ճյուղի, ինչը effectively "rewrite" է պատմությունը:
- Պարզեցնում է պատմությունը՝ խուսափելով merge-կոմմիտներից՝ յուրաքանչյուր փոքր ֆիչեր կամ ուղղում:
- Կարևոր: Երբեք rebase չկատարել հանրային ճյուղերի վրա, որոնց վրա աշխատում են ուրիշ ծրագրավորողներ, քանի որ դա կարող է առաջացնել կոնֆլիկտներ:
git checkout feature/new-feature // Փոխվում ենք ֆիչեր-ճյուղը
git rebase dev // Թեկուզում ենք ֆիչեր-ճյուղի կոմիտները՝ վերևում՝ dev-ի
// Եթե անհրաժեշտ է՝ լուծում ենք կոնֆլիկտները
git push --force-with-lease // Օգտագործում ենք --force-with-lease՝ անվտանգ push-ի համար rebase-ից հետո
Մեր ստանդարտ workflow:
- Նոր ֆիչեր կամ ուղղում զարգանում է առանձին ճյուղում (feature/..., fix/...).
- Ժամանակ առ ժամանակ (pull request-ի առաջ կամ՝ սինխրոնիզացիայի համար dev-ի հետ) ֆիչեր-ճյուղը rebase է կատարվում актуալ dev-ի վրա՝ early resolve կոնֆլիկտները:
- Թարմացումների ավարտից հետո և code review-ից հետո, ֆիչեր-ճյուղը միավորվում է
dev-ի հետno-ff(non-fast-forward) ռեժիմով՝ պահպանելու համար միացման տեղեկությունը: dev-ից ժամանակ առ ժամանակ կատարվում են ռելիզներmain(արտադրական ճյուղ)՝ միշտ merge-ի միջոցով:
Այսպիսով, մենք հավասարակշռում ենք commit-ների պատմությունը պահպանելու (merge) և մաքուր զարգացող ճյուղը պահելու (rebase) միջև։