ášááµ áµááááœá á°áášáá ááá áá áá£áááµ á«áá áá á°áµ (CI) á á¥ááá± á¥ááŽáµ á¥áá°áá°á« ááááµ ááááá? ááá áááá£áµ ášáááµ á°áááµ á¥áá áµááŽáá ááá»ážáµ ááááá? áá á®ááµ áš GitHub áášáá»á á áá áá áá£áááµ á£áá áá á°áµ ááµá¥ á°áá£á«á áá áá¶áœá áá°á¥áá³áᢠáá á®ááµ á ááá á á ááµášá ášááµáœáá á ááá á¥áá²áá ášá³á°á á áá°ááဠá á°áá«áá á°áᜠá áá«á°áááµ ááááµ á áµá« áá ášáá°á©áµá á°áá³á³á áµááá¶áœá áµááœááá ᢠášá°á«á°á±áµá á°ášááᜠá áá³á³ááá áµ áá ááµá áá³á¡á á¥ááá»ááá¢
áá á¥ááµáá?
á¥ášááµá áµáááµá£ ááµ á ááµ ášá°ááá± ášCI á°ášááᜠáááá á¥ááá¥á«ááᣠáá áááá áááµá³ááµ á¥á© ááááµ ááᢠá áá á áááá ááá¢áᜠáá£áááµ á«áá áá á°áµ á²á°á©á£ á°ášá³á³á áá á°áµ á²á«á°áá ášáá«á°ááážáá á°áá£á«áµ áááá á¥ááá¥á«ááᢠᚠCI áá°á³áœáá ášá¥ááá°áá áá áááá«ášá¥ ááá ášáá ášáá°áááœá áµá¥áµá¥ á¥áá ááááá¢
áá áá áá€á á á®áá± ááµá¥ á¥ášáá á²áá± á áášáá»á ááµá¥ á«ááµá ááá áááµ á«á³á«áᢠá¥áá°áááášá±áµ, á¥áá ááá ášá°áá³á°á ááá ášáá á¥á á á£á á áµáááá á¥á» áá.
ášáášá°ááµá áá°á á ášá²á á ááá³áᜠááµá¥ á«áááá¡
- á á ááµ á£á ᪠áá ááµá©;
- á¥á«áµá ááášááᥠá áá¶áá²á áášá«ááœá áá°áá á;
- á áµáá« ášáá°á áá á°áá£á áá°áá á;
- á ááá«ááœá á²á«áá á± ášáááµ á áá³áµ (áááµ ááááá);
- á áááµ á á«á£á¢ ááµá¥ áµá á°áµ áášá°á³á.
áá ááá«á?
ááášá°ááµ á¥á«ááᜠáááµ ááµá áµ ááœáá.
- áá£áááµ á«áá áá á°áµ (CI) áááµá áá?
- á CI ááµá¥ áá ááááµ á áá¶áá²á áášá«áᜠá¥á á áá áááá, á¥á á áá á áááµ á¥ááááᜠááᜠáá°á£á?
- ášáá³á¥ á¥á«ááᜠáááµá áážá á¥á áጠá«áµáááá?
- á áá°á ášááá³ áááµ (TDD) áááµá áá á¥á áš CI áá á¥ááŽáµ áááá³á?
- áááŠá¹á ááááµ ááá á¥áá°áá áá ášáµ ááµášá á áá¥á?
- á ááá¥áá áµáªáµ ááµá¥ áááá± ááá áá áá?
ááááªá« áá á¥áá° âášááµáµ á¥á«áááœâ á«á ááá®áœá á ášáŠá³á á°áááá ááᣠá áá áááá«áµ áá á áœáá ááµá¥ á«ááá ášá¥á¥á°áµ áá á áááááµ á á áá³ááµ áŠá³áᜠá á¥ááááá áášááœá áááááµ áá°áá©á¢ á¥á á áá³ááµ áá á°áᜠá á¥ááᥠá á¥á« áá ášáá ááá áµ "áá®áá«áá á±ááá" á¥áá° á áµá°áá ááµ á¥á ááááá¢
áá£áááµ á«áá áá á°áµ áááµá áá?
áá£áááµ á«áá áá á°áµ, ááá CI, á¥á«áá³áá± ášá¡áµá á á£á á¢á«ááµ á áá á ááµ áá á®á³ážáá áá° á ááµ ášáá« áášáá» ááµá¥ ášáá«áá áµá áµ áŽááá«á ááááµ áá, á¥á ášá°ááá á®áµ á¢á«ááµ á¢á«ááµ á«áááá áµá á°á¶áœ áááá£áµ á áá áµ.
á áá áá áá á áááá£á£á¶áœ á á
ášáááá© áá¥á¥ ášáá á°áµ áµáááᜠááᢠá áá³áá¶áœ á áá á ááµ áá á®áµ ááááµ á áµááá á«áááášá¥ áááááµ á á á áá°áá á¥áá áášá«ášá«áᢠá ááµ áá³á ááá á°á á ááµ áá áµá©áµ á®áµ ááµá¶ ááœáµ áá á ááµ áá ášáá«áá áµá áµ á¡áµá á°á°á¥á·áᢠáá áááá«á³á á°ááá á¢áááᣠá á á ááá á áá á ááµ áá ášáá°á á áẠáááá«á³á á°áá£á«áᣠášá°ááš á¥á ášá°áá«áš áá á ááážá á¡áµáᜠá°áµáá áá á°á¥á áá³áááá¢
ááá á°ááá C++ á áááµ ááµá¥ á¥á á áá ášáááá ááá á¥á» á áá°ááᣠá¥á á ááá ášáµá á°áµ ášážá³ áµá¥á°á£á á¥áá° áášááá« ááááµ áááá á°á«á ááᢠá áá³ááµ ášáá°ááᜠáµá¥áµá¥ (ááá³áᣠá á áá ááµá¥ ášá°ášááá ášááá áášá«ááœ) á á°á³á« ááá³ áá ááá á áá£ážáᢠá á áá áá áá á ášá°á¡ áá áá ááµáááµ áá°áááááµ á¥ášá°ááá³áá° ááᣠá¥á áá°ááµ "ášááá£á³ + á ááµ áá°áááœ" áááá£áµ á«áá°á« ášá°ááá° á á°á«á ááááá¢
áá£áááµ á«áá áá á°áµ ááá«á áá£áááµ á«áá ááµášáµ (áá£á ááµášáµá£ á²á²) ášá¥á«áá³áá± ášáá á°áµ áá°áµ á áá ášáááá á¥á© á á«áµáááááá¢
á á®áá± á áá ášááá ááá£ážá ášá¥ááááᜠáááá
- ášá
áᥠáááá á®áµ áá³á¡á¢ áš á
ááá«á ááá á©
master
. ááµá«áµ áááᢠ- á á á²á± á ááá«áá áá ááá áááµ ááá á©. á á á«á£á¢á áááá¡ á¥á áááµá¹. ááá? áá° áá£á© á°ášá ááá±. á áá°á³á«á? áµá á°á¶áœá ááá áášá«ááœá á«áµá°á«áá á¥á á¥áá°áá áááá©á¢
- áá° ášáááµ áášáá»á ááá ášáááµ á ááá«áá áááá¢
- ášáá³á¥ á¥á«á áá áᢠáááŠá¹ á°áá«á©á£ áááá± á²áá¥á á°ášá᪠áá áªá³á ášáá©á¢ á á£á áªá á ááá«á áá áášá«áᜠá¥áá²á°ááá á«áµááá¢
- áá á°áµ/á³áá á€á ášáá³ ášá°á°á ᢠá áá á°áµ áá€á± áá áášá«áᜠá¥áá²á°ááá á«áµááá¢
- ášá£á áªá á ááá«á áá° áááµ á á°áá«á¢
- áá°áá°á áá ááá ááá á áááµ ááµá¥ á¥á© ášáá ᣠáááŠáœá áá° áá³á á«áá á±á¢
ïž ááá áµ
áµááááá á¶ááµáá á¥áá³áá á ášááá¥
áá
áá á®ááµ áááá°áµ á«áµááááá³á
áááááá áš Git á°áá á áá áá áµáœááá ᣠáá ááµá¥áá ááµáá© áµááááœá á¥á» á ááá£ááá¢
ášáµá¥áá ááµáá©á ášáá°áá ášááµ á°áá á áá«áá á«ášááá¡
ášáµá¥áá ááµáá©á ášáá°áá ášááµ á°áá á áá ášááááµ ášáá«á áááªá«ááœá ááááµ ááœááá¢
áášáá»áá á«ááá
ášáá á
á (á¹á«) ááá á á«áµááááá³á
á°ášáááá? áá£áªáá ááŒá¶áœ á«ááášá©áµ ášá®ááµ áášáá»á á á£á á áááá áá£áá continuous-integration-team-scenarios-students
á GitHub ááá«á ááµá¥ áááá á¥á á©á áá€á áá
á áááµáá
https://github.com/<ваÑе ÐžÐŒÑ Ð¿ÐŸÐ»Ð·ÐŸÐ²Ð°ÑÐµÐ»Ñ ÐœÐ° GitHub>/continuous-integration-team-scenarios-students
á ááá áá°áá
á áµá«á» á¥á°ááááᢠ<URL ÑепПзОÑПÑОÑ>
.
ášáááá á ááᜠá¥áá°
<ÑÑÑ>
á¥áá²á áááá±á á áááᜠá á°áá¢á áá áá°á«áµ á áá¥ááµ áááµ áá.
á¥ááá á áá GitHub áµááá¶áœ ááá á®ááµ áášáá» á°á«á·á. á«ááá á¥á£á®áµá á áá¹ ááá á«ááá áµáá ááá á áá«á á«ááážáᣠá GitHub á áááᜠááµá¥ á«ááµá áµááá¶áœ á á á ááµášá ááááµ ááœááá¢
GitHub Actions á«ááá ášá¥áá áááªá« á áášá°á á®áá±á áá ááá á ááœááá¢
á¥á á¥áá á¥ášá»áá á«áááá ášáááá©á ááá³ ááášáµ áá áá áš GitHubá Markdown ášáá³ášáµ áœáá³ áá áá áµáœááá á¢
https://github.com/<your GitHub user name>/continuous-integration-team-scenarios-students/blob/master/ci.md
áµá ááá¶á¹
áá áá á®ááµ ááá ááá á á£á á¥á©á ááááµ á¥á«áµá ááµášá á¢ááá á áá³ááµ áœáá®áœ ááá©ááµ ááœááá¢
áá ááµášá á¥áá³ááŠáµ á¥áá³ááá£á
ášá°á°áá
á¥á ááá á á¥áá°ááµáœá ášá°á°áá
áá° áá© ááµá¥ áášáµ áµáœááá
solution
á ááá» áášáá»á ááµá¥ á«ááá¢
á¥á£á«áœá á áµááá± solution
в master
á á®áá± áá
áµ. áá
áá á
ááá«á á áá áá áá ááµášá á¥áá³ááŠáµ áááá
ááá ášá¥ááµáá á®áµ ášážááá áá á ááááá ááµ ášáá°á áá áááá áœáá³áᜠá áá áá áá áá ááœááᢠáá á áá ášá á, á
ááá«ááá áá á áá áá°á«áµ ááœáá master
á á
ááá«á áá solution
á¥á ášáá« ášáµá« ááá«áá áá°áááááµ ášá®ááµ á°ášá á³áá á«áµááá©áµá¢
áá áá á áµááá ášááá á¥á» áá áá
á®áµá á á áµáá£
git add .
git commit -m "Backing up my work"
á¥ááá áµááááœ
- á¥áá°áá áá°ášá
master
вmaster-backup
; - á¥áá°áá áá°ášá
solution
вmaster
; - áá° á á²áµ á
ááá«á ááá£áµ
master
á¥á ášáµá« ááá«áá ááá¶áœ á¥áá°áá ááá; - ááá°áá± "áááµá" á ááá«á á«áµáááááµ áš "ááµá°á" ("áááµá" áá á) "áááµá" á ááá«á ááá á©.
git branch -m master master-backup
git branch -m solution master
git checkout master -f
git branch solution
ášá¥ááá
á¥ááááᜠá áá áá áá ááœáá git log master
ášáµááá ááá áááµ á¥áá°áá«áµáááá áááá
.
ášáµá« ááá«áá áá°áá
ááá áááµ á³áá ááµááá ááœááá¡-
git reset --hard <the SHA you need>
á áá€á± á°áµá°á ášáá, á áá áá ášá¥ááµáá ášáášáá» áµáªáµ áá° ášáááµ áášáá» áá°á á«áµááááá³á. áá áá á²á«á°áá ášáááµ á ááá«áá á ááá ááááœáá á ááá±á¢
git push --force origin master
á¥á£á®áµá á¥áá áááá git push --force
. áá
á á¥á áá áááµášá ááááá
ášááááµá ááá ááᣠááá áá ášá ááµ ášáášá ááµ á°á áá áá á¥áá
áá á á£á ášá°ááš ááá³ á ááá¢
ááµá«áµ á áááá áá
ášá¥áá ášCI á°ášááᜠáááá áá ááá á¥ááááᢠá áá°á áááµ áá á á°ášá ášáááµ áášáá»á ášá áᥠáááá ášá®á± áµáªáµ á áááášáµ áááá«á ááá áá á¥áµá«áá ášá á«á£á¢ áášáá» ášáááဠáµááá á ááµá© ášáááµ á¥ááááááá¢
ïž á°áá£áá¡ ášá á«á£á¢áá áášáá» á áááᣠᚠá
ááá«á áá á master
, ááµá«áµ ááá
- ášá®ááµ áášáá»áá áš
<URL ÑепПзОÑПÑОÑ>
. - á ááµ
npm install
á á®ááµ áášáá» ááá« ááµá¥; áášá«ááœá ááá«ááµ ášááá áááá ááµáµá ááá«á á¥ááááááᢠ- á
ááá«á ááá á© á¥á áµá ááµá¡áµá¢
feature
. áá°áá áá áááᢠ-
ášáášá« á®áµ á«áá
ci.test.js
áá á á¥áá³á°áá á áá ááá á áµá°á«ášá¶áœ áá«ášáá¢it('1. pull latest code', () => { expect(/.*pull.*/ig.test(fileContents)).toBe(true); }); it('2. add commits', () => { expect(/.*commit.*/ig.test(fileContents)).toBe(true); }); it('3. push to the remote branch with the same name', () => { expect(/.*push.*/ig.test(fileContents)).toBe(true); }); it('4. create a pull request and continue working', () => { expect(/.*pulls+request.*/ig.test(fileContents)).toBe(true); });
- áá° ááá ášááááªá«áá¹ 4 á¥ááááᜠáœáá á«áá
ci.md
.1. Pull in the latest code. Create a branch from `master`. Start working. 2. Create commits on your new branch. Build and test locally. Pass? Go to the next step. Fail? Fix errors or tests and try again. 3. Push to your remote repository or remote branch. 4. Create a pull request. Discuss the changes, add more commits as discussion continues. Make tests pass on the feature branch.
á¡áµááœ
# ÐлПМОÑÑйÑе ÑепПзОÑПÑОй кÑÑÑа
git clone <repository URL>
cd <repository name>
# ÐÑпПлМОÑе npm install в каÑалПге ÑепПзОÑПÑÐžÑ ÐºÑÑÑа; ПМ ÑÑÑÐ°ÐœÐŸÐ²ÐžÑ Jest, кПÑПÑÑй ÐŒÑ ÐžÑпПлÑзÑеЌ ÐŽÐ»Ñ Ð·Ð°Ð¿ÑÑка ÑеÑÑПв.
npm install
# СПзЎайÑе веÑÐºÑ Ðž МазПвОÑе ее feature. ÐеÑеклÑÑОÑеÑÑ ÐœÐ° ÑÑÑ Ð² веÑкÑ.
git checkout -b feature
# ÐÑÑеЎакÑОÑÑйÑе ci.test.js как ПпОÑаМП вÑÑе.
# ÐÑÑеЎакÑОÑÑйÑе ci.md как ПпОÑаМП вÑÑе
á á á²áµ á ááá«á áá ááá áááµ ááá á©á£ áááá¡ á¥á á á á«á£á¢á áááá©áµá¢
áá°áááœá ášááµášááœá á ááµ á¥áá²á°á© á¥áááááá á¥á ášáá« á®á±á á¥ááá áááá¢
áášá«áᜠá á«áµ-á°á á²áá± ášá°ááá± ááá³ááœ
- á á á«á£á¢áá¡
- á«áááášá¥ ááá áá°áá¢á á®áµ áááŠáœ ááᜠááµá áµ;
- á ááµááᥠáá (ááµááá ááá ááá áá²-ášá°á ááá© áááááœ);
- á áµá¥á°á£ áá (áá ááá á áá«áµáááá áµ áá);
- á ááá áááµ;
- áá° ášáá« áášáá» á²á³á°á
- á ááá£á³ á áááá ááá á ááá£á³ á á«á£á¢ ááá¡-
- á®áµ áá° ášáá á ááá«á/áášáá» á²á³á°áá¢
- á áá áá ááµá¥ á«áá á®áµ á ááášá áá ááá¢
- ášáá
á°á± á¥áá
áá€áµ ááášá«á (á¥ááá áá á
master
). - á¥áá° áá£áááµ á«áá áá á°áµ á°ášá / áá£áááµ á«áá ášáááªá« á§áá§
á á°ááá¶á£ ášáášá« áµá¥áµá¥ á áá á áá áᣠá¥á áá ááááµ á á áá áášáá«áᢠášá°ááá°á ášá°ášá áµáááµ áá á áááµá ááœááá¢
- áá£á á ááµ áášá«áᜠ- á ááá£á³ áá, á CI á§á᧠ááµáá ááµá¥
- áááá°á ááá áášá«ááœá£ áá£á á á«á á¥á áá á°áµ áášá«áᜠ- á ááá ááᵠᣠá CI á§á᧠ááµáá ááµá¥
- áááá°á á á«á á¥á áá á°áµ áášá«áᜠ- á CI á§á᧠ááµáá ááµá¥
- ášá°á áááµ áášá«, áááµ áášá« á¥á ááᜠáá ášááá ááá ááµ áá°ááᜠ- CI / á²á² á§áá§áᜠááµá¥, ááá áá ááá£á³ ááµá¥ ášá°áá°á ááá³áᜠ/ á°ášááᜠ/ á§áá§áᜠááµá¥ á¥á», ááá³á, ášááááá« á¥á© ááááááµ áá ááá á á¥á á²á®á¥.
ïžá°áá£á
á ááááªá« áµáááá á áá áá áášá«ááœá á á¥á
á¥áá²á®á¡ áá³á¥ á ááá£ááᢠnpm test
. ášáá« á ááᣠá ááá áááµ áá áá°ááá»áœáá áááµá¬áµ git hook á¥áášááᢠá ááµ áá«á á áá¡ ášááµ ááá ááᜠá¥áá° áášáá»á á á«á á ááá á©á á¥á áµááá
áš GitHub ášááªáá¹ ášá®ááµ áá³áá¶áœ áá áá£áá© á ááœááᢠááá áá ááá«á áá®á¥ á«áµááááá³á install_hook.sh
ááá áááá áá
á± repo/hooks/pre-commit
áá° á á«á£á¢á«á ááá« .git/hooks/
.
á²ááœáᣠáá°ááᜠá²á«áá± á«á«á á¥á ášá°áá°á ááá ááá¶áœ á áááá© ááµá¥ ááá«ážáá á«ášááá¡á¢
- áµáááá á áááµ áášá«ááœá á¥á«áµá á«áá±
npm test
á á¥ááµá ášá®ááµ áášáá» á áá ááµá¥á¢ áá°ááá¹ áá áááá á«ášááá¡á¢ - á áá®á¥ ášááᥠááá áá (á
áµá-ááá áááµ ááá áá) á«ááá
install_hook.sh
. - áááŠáœáá á á á«á£á¢á«á áášáá»á áá á«áµááá¢
- áášá«ááœá ášááµášáá á ááµ áá°ášáá á«ášááá¡á¢
á¥ááá
á á
á°á á°ášá°áᜠášá°ášá°á á áá ášá¥ááµá áášáá» áá
á áááµááá¢
á¡áµááœ
# УÑÑаМПвОÑе pre-commit hook вÑпПлМОв install_hook.sh.
# ÐакПЌЌОÑÑÑе ÐžÐ·ÐŒÐµÐœÐµÐœÐžÑ Ð² лПкалÑÐœÑй ÑепПзОÑПÑОй. ÐÑпПлÑзÑйÑе "Add first CI steps" в каÑеÑÑве ÑППбÑÐµÐœÐžÑ Ð¿ÑО кПЌЌОÑе.
git add ci.md ci.test.js
git commit -m "Add first CI steps"
# УбеЎОÑеÑÑ, ÑÑП ÑеÑÑÑ Ð·Ð°Ð¿ÑÑкаÑÑÑÑ Ð¿ÐµÑеЎ кПЌЌОÑПЌ.
á®áµ áá° ášáááµ áášáá» ááá ášáááµ á ááá«á á«áµá
á áᎠá á áá ááµá¥ ááµá«á³ážáá ášášášá± á ááᣠááá¢áᜠá áášášá» ášá áᥠáá á¥áá²áááµ á®á³ážáá á áá á¥áá²áá á«á°áááᢠá GitHubᣠáá á á°ááᶠáµá«áá áá° áášáá»á ášáá á á (ášáá á¹á«) ááá ášáá á ááá«á á áá°á áá³á«áá¢
- á á¹á«ááœá£ ááᢠášáááµ ášá°áá« áášáá»á áááááᣠášáá ášáááµ á
ááá ááá¥á«áᣠá¥á±á á¹á« á áá£áá áá³áááᢠášáá« áá
á ášáá áášáá» ášá á«á£á¢á áá áááµá«áµ ááááᢠá¥á«á á²á ááá
á¥á á°áá£á®á¹ á²áážá, áá° á¹á«á ááááážáá, á¥áá«á áááᜠáááá á¥á áá° ášáá« áášáá»á áá£áá© ááœáá. áá
á á«ááµ á GitHub áá á áááµ ááá áá®ááá¶áœ ááµá¥ á á¥ááµ á¥á
á áá ááááᢠá á°ášááªá á á¥á ášáá á®ááµ ááµá¥ á¥á
á áá áááá [ášá¡áµá á¥á« á¥á CI áš Git áá] (
http://devops.redpill.solutions/ ). - ááá á áá«ášá¥ á ááµ ášáááµ áášáá» á¥á» áá áá á¥á á
ááá«áá á¥á» ááá á áá
master
ášá°áá« áášáá» "ášá°á á á". á áá ááá³ ááµá¥á£ á¥á«áá³áá± ááá¢áᜠáá á á®áµ ááᜠá¥áá²ááášá±áµ á á©á áášáá» á ááá«áᜠáá á«áµááᣠááá ááá á á¥áááµ ášááᣠá«áá á±áµá¢master
ášáá« áášáá».
á áá áá© á®ááµ, á ááá«ááœá ášáá áá ášáµá« áá°áµ á¥áá áááá.
ášá¥áá á®áµ á¥áá°á.
ïžá°áá£á
- ášáá°á«á á ááá«áá áá á°áá³á³á áµá á£áá ášáááµ á ááá«á áá áááŠáœá á«áµá
á¡áµááœ
git push --set-upstream origin feature
ášáá³á¥ á¥á«á áá á
ášáááµ áá ášáá³á¥ á¥á«á ááá á© ášá¥ááááᜠáááá. á«á feature
á¥áá° "ášááá
ááµ á
ááá«á" á¥á master
á¥áá° "áá°ášá³á á
ááá«á".
áá«áá á«ášááá¡
master
á á¥á± ááµá¥ ááµááá«áá á¹á« á¥áá° "áá°ášá³á á ááá«á" á á®áá± áá³áá¶áœ áášáá» áá ááááá¡ áááŠáœ ááᜠá áá°á¥áá¢
á GitHub lingo ááµá¥ "áá°ášá³á á ááá«á" áµá«áá áá°ášáµ á«á°ášáá áµ á ááá«á áá, á¥á "ášááá ááµ á ááá«á" ášá³áá±áµá áááŠáœ ášá«á á ááá«á áá.
á áááŠá¹ áá á°áá«á©á£ áááá± á²áá¥á á á²áµ áá áªá³á ášáá©
ášáá³á¥ á¥á«á(PR)
ášáá³á¥ á¥á«á(PR) á®áµá áááá«ášáµ á¥á áááááá¥, á¥áá²áá ášá®áµ ááááá ášáá«ááµ ááááµ áá. ášáá³á¥ á¥á«ááᜠášá°á°ášááµ ášááá°áŠáœá áááŠáœ áá° á á ááá á®áµ á ááááµ á á ááá ááááµ ááᢠá á°ááᶠá ááµ á°á ášáá®ááá±á ášáááµ áŠááŽáá áášáá» ááá³á á¥á á á®á± áá á á á«á£á¢á áá°á«áᢠášáá á áá á®á±á á áá ášáááµ áášáá»á ááµá¥ á«áµááá£á á¥á ááŠááŽááá áášáá» áááááµ á«áá£ážá á°áᜠá¥áá²á«áá±áµ áá ááá(ááµáµášáááááá áµ á¥á áááá£áµá ášáááá±á áµ á®áµ áá° á á«á£á¢á«ážá áášáá»ááœááá±á áµáá á¶áœ á°ááá°) ášá¥á±á¢ áá áœáá°-áá³á¥ á ááᜠáµááœá áá³ááá, ááá³á, ášáá á°áµ á¥á«á.
áš GitHubá ášáá³á¥ á¥á«á á£á áªá ááá á°áá³á³á ááµášá®áœá á áµááá áá áá á á«áµááááᢠášáááµ á¡áµáᜠááµ áááµ áááááµáᣠášáµáᜠá¥áªááœá ááá á¢ááá ášáá® ááᜠášáááá ááŽááœá áá áá ááœáá ááááá ášááµášá á áááµ ášáá³á¥ á¥á«áááœá ááá áá á¥á áááá«á¶áœ á áᢠášá¥ááá ááµá¥ á¥áá¶á¹ á¥ááá¡-
- ášá°áá°á ášá®áµ áááŠáœ áá ášá°á«á«á ášá°á°á«á áááá¶áœ;
- ášááá±á á áá¶áá°á®áœ á¥á á¥á©á®áœ á áá°áµ áá á£á áµá«áᜠáá á áµá°á«ášáµá ááááášáµ á¥áá° áŠá³;
- ášá®áµ ááááááœá áá°á á ááµášá;
- áµááá á áá áá ášáá ááá ášáá« á®áµ á áµá°ááᣠá«ááµá áááá«á¶áœ á¥á áááµáᜠááá ááœáá.
á ááµ ááá ááá«ášáµ á²ááá ááá áá¥ášáááµ á²ááá á¥ááá áá ášáá³á¥ á¥á«á ááá¥á«áᢠááá³áᣠášá ááµ á áá á áá ááááµ áá°áá á á ááœá á£á ᪠áá á¥ášá°á© ášááᣠáá³á¥áá ááá«áá á¥á á¥á áµáá ášá°á£á£áªááœá áá áááá«ášáµ ášááááªá«áá ááµáá á®áµ ášáá»áá á ááµ ášáá³á¥ á¥á«á ááá á ááœááᢠáµá«á ááá á«á ášáá, á ááµ ááá ášá°á°á«, ášá°ááá á¥á ááá«ášáµ á ááœáá áµ áá ášáá³á¥ á¥á«á áášáá³á. á á áá³ááµ ááá³ááœá£ áá¥á«áµ áá¥á¥á áááá«á¶áœ á¥á» PRá ááááµ áááá ááááá¡ á áá¶áá²á áášá«ááœá ááá«ááµ ááá ášá®áµ ááááááœá áááááᢠášáá°ááµ ááá ááá ááᣠá ááá°áµ á¥á«áá áá áááá³ ášáááááµá á°áᜠ@ áá¥ááµáá á ááá±á¢
á á°ááá¶á£ PR á²áá¥á© ášáášá°ááµá á«á°áááá¢
- ááááᥠá«áášá¡áµá á¥á ášáµ á«áááá±á¢
- ášáááŠá¹á ááá ášáá«á¥á«á« áááá« áá»áᢠáááá ááœááá¡
- ášá®á± ááᜠá«ááá áááááá á áµááá ááá áášáá ááá á áá±á ááášá³áµ á áá ááá ááá³á á°ááá #bugs á¥á áá¥á®áœá á«áµáá;
- @ášááááá á°á áá ááµá«áµ ááááá ášáááááµá áá¥áá± ááá á áá áá á á áµá°á«ášá¶á¹ ááµá¥ @ áá¥ááµ ááœáá;
- á á ááµ ááá áá á¥áá²ášá± ááá ášá°áá°á ááá á¥áá²á«ášááá¡ á£áá°ášáŠáœáá áá ááá¢
á áᎠPR á ášášáá± á á¥áá°áá ááááµ ááá³áᜠááµá¥ á¥áá²á°á© ášá°ááá© áášá«áᜠáášáááá. á á¥á ááá³, áá á á áá ááµá¥ á«á«ááµáá áµ á°áá³á³á ášáá°ááᜠáµá¥áµá¥ áááá, ááá áá á á¥ááá°á áá®áááµ ááµá¥ á°ášá᪠áášá«áᜠá¥á áŒá®áœ ááá© ááœáá.
á¥á£áá áá°ááá¹ á¥áµáªá ááá áµášáµ áá á¥áᢠášáá°ááá¹á ááá³ áš PR ááááµ ááá á GitHub á áááᜠááµá¥ áášáµ ááœááᢠáá°ááá¹ á²á ááá ááá¥á.
ïž áµá CI á°ášááᜠáááá ášáááá°ááµ ááµá³áá» á«áá
á áá á®ááµ ááµá¥ á¥á á áá ášááá áááá ášáááá° á¥á á°ášá£á áá, áµááá áá³á ááµá³áá» áášá á áá¥á.
ïž á°áá£áá¡ ááá á áµá°á«ášáµ ášáá³á¥ á¥á«á áá á
- áá° á
ááá«á ááá
master
. - ášá°á°ášá á
ááá«á ááá á©
bugfix
. - á ááá áášášá» áá ášááµá³áá» áœáá á«áá
ci.md
.> **GitHub flow** is sometimes used as a nickname to refer to a flavor of trunk-based development when code is deployed straight from feature branches. This list is just an interpretation that I use in my [DevOps courses](http://redpill.solutions). The official tutorial is [here](https://guides.github.com/introduction/flow/).
- áááŠáœá á«áµáá.
- áááá á«áµá
bugfix
áá° á©á áášáá». - ášá°á°ášá ášááá°áµ á¥á«á ááá á© á áµá°á«ášáµ á áášá áá ášá«áµ á
ááá«á áá
bugfix
á¥á ášáá ášáµ á ááá«ámaster
.
áá«áá á«ášááá¡
master
á á¥á± ááµá¥ ááµááá«áá á¹á« á¥áá° "áá°ášá³á á ááá«á" á á®áá± áá³áá¶áœ áášáá» áá ááááá¡ áááŠáœ ááᜠá áá°á¥áá¢
áá
ášá¥ááµá áášáá» ááá°á á«áá áµ ááá¢
á¡áµááœ
# ÐеÑеклÑÑОÑеÑÑ ÐœÐ° веÑÐºÑ master. СПзЎайÑе веÑÐºÑ bugfix.
git checkout master
# СПзЎайÑе веÑÐºÑ bugfix-remark.
git checkout -b bugfix
# ÐПбавÑÑе ÑекÑÑ Ð¿ÑОЌеÑÐ°ÐœÐžÑ Ð²ÐœÐžÐ·Ñ ci.md.
# ÐакПЌЌОÑÑÑе ОзЌеМеМОÑ
git add ci.md
git commit -m "Add a remark about the list being opinionated"
# ÐпÑблОкÑйÑе веÑÐºÑ bugfix в ÑЎалÑММÑй ÑепПзОÑПÑОй.
git push --set-upstream origin bugfix
# СПзЎайÑе pull request пÑО пПЌПÑО ОМÑеÑÑейÑа GitHub как ПпОÑаМП вÑÑе
ášááá°áµ á¥á«áá á áœáµá "á áµá°á«ášáµ áášá"
ïžá°áá£á
- ášáá³á¥ á¥á«á áá áá¢
- "ášááµáµ á¥á«áá á áá áµ" á á á á«áµááá¢
- "áá á°á±á á ášááá¥" á á á á«áµááá¢
- "á ááá«á á°áá" á á á á«áµáá, ášá áá á áá á á«áµááááá.
áá
ášá°ááá° á áá ášá°áážáá á²á«áá«á ááá¢
ïž ááµá«áµáá ááá¥á á¥á áášá«ááœá áášáá©
á ááá°áµ á¥á«á áá áá°á£á á á¥á áá á°ášá᪠áµá«á á«áµášáµááᢠáá á¥ááá áá ášá®áµ áááá ááá ášááááµ áá€áµ ááᣠááá áá á á¥á á®ááµ áá áá á CI á°ášááᜠáááá ááµá¥ á á³á²áµ á¥áááœá á áášáá ááŽá á¥áá°á«ááá¢
áá£áááµ á«áá áá á°áµ á á°ááᶠá áá³ááµ ášáášá« áœááá á«á«áµá³áᢠášáášá« áœáá ááµááá¶áœ ááá«á«á á¥á á¥ááá áá á¥áá° "ášá áµá°ááœáŠ áááªá«ááœ" á á°á£á á°ááµ ááµá¥ ááááᢠááá á¥áá°ááááá á¥á áá¥á«áá³áá± ááµáá á áá°á» áááá«áœá ááµá¥ áá°á á¥áášáá«áá á¢
áµá«ááœá á áá°á©á áµ áá ááááªá« áá°ááá¹á áááá©á¢ á áµááá ášá«á pre-commit
ááá á áá°á á¥á, á á²áµ ášá°ášáášá áá°á áá«áá³á, á áá³á«á, á¥á ááá ááá á ááááá. ášá¥á áá°ááᜠá ááµ ááá á¥ášáášá© áááážáá ášááááá á áá
ááááµ áááá áᥠáá áᢠášáááááᣠášáá°ááá¹ á ááµ á á®á± ášáááá áá°áááœá ááá áá á®á± á¥áá°á°á á áá á°áá·á ááá áá°ááá¹ ááá ááá á¥ášáášá© á áá°áá áááµ ááᢠá á°ášááªá áá°ááá¹á á ááááªá« á°ášá á£ááœá áá® ááá ááá áµááá«áµá³áá°á ááášá³ážá á¥ááœáááá¢
á áášá« ášááá« áááµ (TDD)
TDD áá°áááœá ášá®áµ á ááµ ááá áááá«áᢠTDD ášáá áá ášá°ááá° ášáµá« áá°áµ áá á áááµááá¢
- áá°á ášááá¢
- áááá áá°ááᜠá«áá± á¥á á á²á± áá°á á ááá³á«á±á á«ášááá¡á¢
- á®á±á áááá¢
- áá°áááœá á«á«áá±, ááá áá°ááᜠáááážáá á«ášááá¡.
- á®áµáá á¥áá°áá ááá á©á¢
- ááµááá¢
á«áá°á³á«áážá ášáá°á áá€á¶áœ á¥ááá áá á áá áµááá³á© á¥á á«áááµ á¥ááá áá á á ášááᎠáµááá³á© áá°á± áá-á ášáááŽ-áªááá°á á áá£áá áá³áááá¢
ïžá°áá£á
á ááááªá« áá°ááá¹á áááášá áááá© á¥á á¥áá²ááµá áááá±, ášáá«á áš CI á°ášá ááááá áœáá áášáá© á¥á á«áµáá¡. áá°ááá¹ á¥áá³áá ("á ášáááŽ") á«á«á.
ášáá« á á²á±á á®áµ áá° ášáááµ áášáá»á á«áµá á¥á á GitHub á áááᜠááµá¥ ášáá°ášá áášá«ááœá á áá á¥á«á áááá± ááá á¥á ášPR ááá³ áá»á»á« áááášá±á¢
- áá° á
ááá«á ááá
feature
. -
á¥ááá á áášá«áᜠáá° áá á«áá
ci.test.js
ášáášášá»á á¥áª á ááit (...);
.it('5. Merge/rebase commits from master. Make tests pass on the merge result.', () => { expect(/.*merge.*commits.*testss+pass.*/ig.test(fileContents)).toBe(true); }); it('6. Deploy from the feature branch to production.', () => { expect(/.*Deploy.*tos+production.*/ig.test(fileContents)).toBe(true); }); it('7. If everything is good in production for some period of time, merge changes to master.', () => { expect(/.*merge.*tos+master.*/ig.test(fileContents)).toBe(true); });
- áá°áááœá áááážá áááá©. ášáá
pre-commit
ááá áá á°ááá ᣠášááá áááµ áášá«á á áá³á«áᢠ- ášáá« áá
á áœáá áá° áá á«áá
ci.md
.5. Merge/rebase commits from master. Make tests pass on the merge result. 6. Deploy from the feature branch with a sneaky bug to production. 7. If everything is good in production for some period of time, merge changes to master.
- á á á«á£á¢á áááŠáœá á«áµáá á¥á á«áµááá¢
- á á
ááá«á áá áááŠáœá ááá¥á
feature
.
á áá á¥áá°áá
á«á ááá áááááµ ááá£á
á¡áµááœ
# ÐеÑеклÑÑОÑелÑМа веÑÐºÑ feature
git checkout feature
# ÐПбавОÑÑ ÑеÑÑÑ Ð² ci.test.js как ПпОÑаМП вÑÑе
# ÐПбавÑÑе в ÐžÐœÐŽÐµÐºÑ ci.test.js ÑÑÐŸÐ±Ñ Ð¿ÐŸÐ·Ð¶Ðµ закПЌЌОÑОÑÑ
git add ci.test.js
# ÐПпÑÑайÑеÑÑ Ð·Ð°ÐºÐŸÐŒÐŒÐžÑОÑÑ ÑеÑÑÑ. ÐÑлО pre-commit hook ÑÑÑаМПвлеМÑ, ÐºÐŸÐŒÐŒÐžÑ ÐœÐµ пÑПОзПйЎÑÑ.
git commit
# ТепеÑÑ ÐŽÐŸÐ±Ð°Ð²ÑÑе ÑекÑÑ Ð² ci.md как ПпОÑаМП вÑÑе
# ÐМеÑОÑе ÐžÐ·ÐŒÐµÐœÐµÐœÐžÑ Ðž закПЌЌОÑÑÑе ОÑ
git add ci.md
git commit -m "Add the remaining CI steps"
# ÐпÑблОкÑйÑе ÐžÐ·ÐŒÐµÐœÐµÐœÐžÑ Ð² веÑÐºÑ feature
git push
áááµ á áá áµ
áá° á¥á«á ááᥠááá± ášá¥ááááᜠáááá.
ááá á¥áá³á áµá
á°áµ á£áá°ááá á¥á ášá á®áµ áá°ááᜠá¢á«áááᣠá
ááá«áá á ááá ááááµ á áá»áááᢠfeature
О master
. áááá áá áµááá ááᢠbugfix
áá á°ááá
áá master
á áá
PR áá á¥ášá°á«á á³á.
áá
ášáááµ á
ááá«á á«áá áµá ááá³ ááá¥á«á master
á
ááá«áá áá ášáµ á«á°ášááá áµ ášá áá á á²áµ áµáªáµ á ááᢠfeature
. á áá
áááá«áµ HEADá áá° áá ááááµ á ááœááᢠmaster
á¥áµáš áá áášášá» áµášáµ feature
. á áá
ááá³ ááá áááµá ááááá ááá áá°áá á á áá¥á feature
á¥áá°áá áááµášáµ master
. GitHub ááá ááá¶áœ ášáá á áá¶áá²á áá
á°á¶áœá á áµááá áášááá ááœááᢠáá®á£ á á¥á ááá³á£ ááá±á á
ááá«áᜠá ááá áá á°áááá áááŠáœ á áážá ci.md
. áá
ááá³ ášáá
á°áµ áááµ á áá£á áá³ááá, á¥á á¥á á á¥á
ááá³áµ á áá¥á.
á áá áµ ááá á¥áá°áá áá°ášáµ á áµáá
á áá á°á
- á°ášá᪠ášáá
á°áµ áá ááá¥á«á á¥á ášáµá« á³áªáá á«áµááá£áá¢
- ášá ááá«ááœá áŠáªá áá ááá áááµ ášááááªá«á ášáá áá á°á á¥á á°á«á²á«á áá áá á¥ááá¢
- á ááᥠá¥á«á áááá¶áœ ááµá¥ ášáážááµá SHA ááá¥á£á á¥á ášá¥áá± áá áááááá¢
- ášá ááµ áá áááµ á áá³áµ á«áµáááááá¢
- á³áªá©á áá¥á°á á«ááá á«á°ááááá¢
- ášá ááá«áá¹ á¥ááµ ášá°áá³ (ášá áá²á¢ áááµá ášáá«áµá³ááµ) á³áªá© áááá ᥠá áµážá᪠ááá ááœááá¢
- á áá¶áá²á áášá ášá áá ášá£áµ á«á°ááááᣠááá³á
git bisect
á¥áá á¥á á ášááá - ášáá á°áµ áá á¥á» áá ášáá«áááá¢
áµáá áááá¥
- áµáá ášáá³áᜠášáá ášá± á
ááá«á á ááµ áá á«áá ášá áá á
ááá«á á ááµ á á ááµ áááœááá¢
- ášá á³á²áµ SHAáᜠáá á á²áµ ááá áááµ ááá á«áᣠáá á á GitHub ááµá¥ á«á áµááá¶áœ ášááá ášáá³á¥ á¥á«ááᜠáá á¥áá²á£á£á á«á°áááᣠááá áá á°ááá á áµá°á«ášá¶áœ á áá°ááá¢
- á®áá¶áœ á áá°á± ááµá¥ á¥áá°áá áá£áá© á¥á áá»á»á ááá áá° á ááµ áááá± ááœááá¢
- á áá«á³ ááá¶áœ ááá³áµ áá«áµááá ááœááá¢
- ááµáá«á á³áªá á¥áá²áá© á«áµáœááá³áá¢
- á³áªá© á á£á ášá á á¥áµá«ááá á«ááááá«áµ áááá ᥠááá ááá ááœááá¢
- á«áµ-á°á áášá á¥á áá áááá áµáᜠááá ááá¡ ášáá»á á«á°áááá
git bisect
, á áá¶áá²á ááᶠááááá«ááœá ášá áá ááᜠá¥á ášá áá áá°áá¥á ááœáá.
- ášá£áá²á« áá ášá°á°á°á± ááŽá³áᜠá«áá á
ááá«á áá°á á«áµááááá
--force
ášááá°áµ á¥á«ááᜠáá á¥á á áá á²áá.
á á°ááᶠá¡áµáá¹ áááŠáœá ááááµ á²ááá áááá á°áá³á³á áµááµ ááá áá ááµáááᢠáá
áááá£áµ "ááá
" áá
á°áµ ááá ášáá "ááá
" ááá áááµ ááá á áá«ášá á«á ááá ááá³á ášáá á ááá°ááá ááµášá() ááá ááœááá¢git rebase -i
) á á áá ááµá¥ áá
ááá«áᜠáááᥠáášáá» ááá³á°á, áá á "ááá£á" á
ááá«áᜠáááá³á.
á¥áá áá á°áµá á¥áá áááá.
ïžá°áá£á
- á®á± á á á«á£á¢á á
ááá«á ááµá¥ áááá á«ášááá¡
master
ášáááµ áášáá» ááááᢠ- áá° á
ááá«á ááá
feature
. - ášá
ááá«á áá áá
á°áµ áááá©
master
. á á°áá³á³áª áááŠáœ áááá«áµ ášáá á°áµ áááµci.md
. - ááá±á ášá¥á ášCI á°ášááᜠáááá á¥á áµáá± á«áá ááµá³áá» á áœáá ááµá¥ á¥áá²áá© ááá±á ááá±á¢
- áá° á©á
á
ááá«á ášáá
á°áµ áá á«áµá
feature
. - á GitHub UI ááµá¥ ášááá°áµ á¥á«áá ááá³ áááµá¹ á¥á áá á°á± á¥áµáªáá³ áµášáµ áá á¥áá¢
á¡áµááœ
# УбеЎОÑеÑÑ, ÑÑП кПЎ в лПкалÑМПе веÑке `master` ПбМПвлÑÐœ Оз ÑЎалÑММПгП ÑепПзОÑПÑОÑ.
git checkout master
git pull
# ÐеÑеклÑÑОÑеÑÑ ÐœÐ° веÑÐºÑ feature
git checkout feature
# ÐМОÑООÑÑйÑе ÑлОÑМОе Ñ Ð²ÐµÑкПй master
git merge master
# A merge conflict related to concurrent changes to ci.md will be reported
# => Auto-merging ci.md
# CONFLICT (content): Merge conflict in ci.md
# Automatic merge failed; fix conflicts and then commit the result.
# РазÑеÑОÑе кПМÑÐ»ÐžÐºÑ Ñак, ÑÑÐŸÐ±Ñ Ðž ÐœÐ°Ñ ÑпОÑПк ÑагПв CI, О заЌеÑаМОе П МеЌ ПÑÑалОÑÑ Ð² ÑекÑÑе.
# ПÑÑеЎакÑОÑÑйÑе ci.md ÑÑПб ПМ Ме ÑПЎеÑжал ЌаÑкеÑПв кПМÑлОкÑа ÑлОÑМОÑ
git add ci.md
git merge --continue
# пÑО кПЌЌОÑе ЌПжеÑе ПÑÑавОÑÑ ÑППбÑеМОе пП ÑЌПлÑаМОÑ
# ÐпÑблОкÑйÑе ÐºÐŸÐŒÐŒÐžÑ ÑлОÑÐœÐžÑ Ð² ÑЎалеММÑÑ Ð²ÐµÑÐºÑ feature.
git push
# ÐÑПвеÑÑÑе ÑÑаÑÑÑ Ð·Ð°Ð¿ÑПÑа Ма ÐžÐ·ÐŒÐµÐœÐµÐœÐžÑ Ð² пПлÑзПваÑелÑÑкПЌ ОМÑеÑÑейÑе GitHub, ЎПжЎОÑеÑÑ Ð¿ÐŸÐºÐ° ÑлОÑМОе Ме бÑÐŽÐµÑ ÑазÑеÑеМП.
á³áá áµá«!
áááá©á ášáá°áá á¥á á áá ášáá³á¥ á¥á«ááá ááœá°á
á áá¥á
master
.
ïž á°áá£áá¡ ášááá°áµ á¥á«áá á áœáµá "ášá¥ááá áááá"
- ášááá°áµ á¥á«áá áááá±á¢
- "ášááµáµ á¥á«áá á áá áµ" á á á á«áµááá¢
- "áá á°á±á á ášááá¥" á á á á«áµááá¢
- ášá áá á áá áµááá«áµáááá "á ááá«á á°áá" á á á á«áµááá¢
áá
á á áá áá ášá¥ááµá áášáá» ááá¢
ášáááµ áµá á°áµ
âáá°á áµá á°á¶áœ ááá«ážáá ááá³ášáµá£ áá áá ášá³ážáá ááá³ášáµ ááœá áá áá áá»ááâ á°á¥ááᢠááá á¥áá³á áá°ááᜠá¢á«áá¥ááá á¥á ááá áµá á°áµ á¢á«á³á©áá á ááµ á°áá®áá á³áá« áá° áááµ áá£á¢
á á¥áá°áá ááááµ ááá³ ááµá¥ á¥á á¥ááá ááµášá á áá¥á-
- á áááµ áá ášáá°áá ášá;
- á áá ááµá¥ á®áµ
master
ášáµá á°áµ áá, ááá¢áᜠá á²áµ á¥á« áááá ááœáá.
á ááá¥áá á¥áµá áááá°á áááµ ááµá°á«ááá?
áá° áá ááááµ áááµ áµá
á°á±á á«á«á°á± áááááœá áá° ááášáµ á¥á áá°áá ášá áµ ááááµ ášá³áááá ášááµá áµáªáµ ášáá°áá«áµ áá°áµ ááᢠ"áá° ááµ ááá á" ášáá áá áášáá áá master
á¥á á á²á±á áµáªáµ á á°á»á áá¥ááµ áá°áá«áµ. á®áµ áá° áááµ á áá°á«áá áµ áá á€áá á á¥á ášáášá ááµ ááá áá¥á®áœ áµáááá«ášá© áá£áááµ á«áá ááµášáµ á¥á á¥á© ášáášá« áœááᣠáá° áá ááááµ á ááá¥áá áµáªáµ ááµá¥ ášááµá°á«ášá ášá áá ášá£áµ á¥á á á°áá ááá¢
áá° áá ááá á á¥á áá³á ááá ááááµ á á°á áµááááᣠáá°áá ááááµ á¥ááá³ááᣠáááá«á±á ááá áµáááá¢
- áµá á°á±á á á°á»á áá¥ááµ á ááá± áá á«áµá°á«áááµ;
- á®áµ á«áµáá¡
master
á á²áµ á¥á« ááááá áá²á«áá á°áµááá¢
ïžá°áá£á
- áá° á
ááá«á ááá
master
á á á«á£á¢áᢠ- ášá á«á£á¢áá áášáá» ášáááµ áášáá» á«áááá¢
- ášPR áá
á°áµ ááá áááá± ášá¥ááááᜠáááá в
master
. - áááŠáœá áá° ášáááµ áášáá» á«áµáá¢
áá
ášáá
á°áµ ááá áááµ ášá°ááá° ášáášáá» á³áªá ááá¢
á¡áµááœ
# ÐеÑеклÑÑОÑеÑÑ ÐœÐ° веÑÐºÑ master.
git checkout master
# ÐбМПвОÑе лПкалÑÐœÑй ÑепПзОÑПÑОй Оз ÑЎалÑММПгП ÑепПзОÑПÑОÑ.
git pull
# ÐÑЌеМОÑе ÐºÐŸÐŒÐŒÐžÑ ÑлОÑÐœÐžÑ PR Steps review в master.
# ÐÑ ÐŸÑЌеМÑеЌ ÐºÐŸÐŒÐŒÐžÑ ÑлОÑМОÑ, пПÑÑÐŸÐŒÑ ÐœÐ°ÐŒ ÐœÑжМП вÑбÑаÑÑ Ð²ÐµÑÐºÑ ÐžÑÑПÑОО, кПÑПÑÑÑ ÐŒÑ Ð·Ð°Ñ
ПÑОЌ ПÑÑавОÑÑ
git show HEAD
# пÑеЎпПлПжОЌ, ÑÑП кПЌЌОÑ, кПÑПÑÑй бÑл пПÑлеЎМОЌ в веÑке master ЎП ÑлОÑМОÑ, бÑл ПÑПбÑажÑÐœ пÑеЎÑÐŽÑÑей кПЌаМЎПй пеÑвÑÐŒ
git revert HEAD -m 1
# ЌПжеÑе Ме ЌеМÑÑÑ ÑППбÑÐµÐœÐžÑ ÐºÐŸÐŒÐŒÐžÑПв
# ÐпÑблОкÑйÑе ÐžÐ·ÐŒÐµÐœÐµÐœÐžÑ Ð² ÑЎалÑММÑй ÑепПзОÑПÑОй
git push
ïž á¥á«áµá ááášá
á¥ááá á áá ci.md
ášáá
á°áµ ááá á«áµá
áš á áá "sneaky bug" ášáá áœáá á áá«ááá¢
áš CI á°ášáááœá áááá á«áµá°á«áá á¥á áá° áá áááá±áµá¢
ášá
ááá«áá ášáá
á°áµ áá áá á áá ááá°áááᢠfeature
. ááá«á ááá á áá ááá áµá
á°áµ ášáá¥áá master
. áá¥áá áá ááµ ášáá áá£áááµ á«áá ášáá
á°áµ á¥ááááᜠáááá«áœá á áá·áᢠáµááá
ᣠá áá³á¥ á°ášá ᣠááµá°á«ášá«áá áá° áá»ááá¹ áá°áá á á áá¥á feature
á¥á áá° á¥ááá± áááá± master
ášááµá°á«ášá«á áá.
áœáá©á á á°áá«áš ááááµ ááááášá°á á¥ááœáááá¡-
- áá
á°áµá ášáá«áááµ ááá áááµá áááá±
feature
Ñmaster
; - áááá³ááµ ášááµáá ááážáá
feature
.
á áá áá³á áá ášá°áá«á© ášáááµ á¡áµáᜠášá°áá«á© á áá«ášáŠáœá áá áááᣠááá áá á áá ááá áááµá áá°á°ááš á ááá«á á¥áááá³á á³áá á¥á ááá á á²áµ á ááá«á ášá°ááš ášáá³á¥ á¥á«á á¥ááá¥á«ááá¢
ïžá°áá£á
- ášáá£á áá ááá á©
feature-fix
á¥á áá° á¥á± áááá©. -
áááá ááŽá³áᜠášááµáá á ááá«á á«ááá©
feature
áá° á á²áµ áá. á áµá°áµ áá áµ ášá°ášá°á±áµá ášáá á°áµ ááá¶áœ ááá³áµá¢ -
ášáµáá áá°áá áá° áá á«áá
ci.test.js
:it('does not contain the sneaky bug', () => { expect( /.*sneakys+bug.*/gi.test(fileContents)).toBe(false); });
- á áááá°áážáá ááášááᥠáá°ááá¹á á á á«á£á¢á á«á«áá±á¢
- áœááá "á áµá¥á
á³áá«" á áµáááµ
ci.md
. - á áášá á ááá áá ášáášá« áááŠáœá á¥á ášá¥ááá áááá áááŠáœá áášáá© á¥á á«áµááœáá¢
- á ááá«áá áá° ášáááµ áášáá» á«áµáá¢
ášáá
áá ášááá³á°á ááá áášášáµ á ááŠáµá¡-
á¡áµááœ
# СПзЎайÑе веÑÐºÑ Ð¿ÐŸÐŽ МазваМОеЌ feature-fix О пеÑеклÑÑОÑеÑÑ ÐœÐ° Мее.
git checkout -b feature-fix
# ÐеÑеМеÑОÑе вÑе кПЌЌОÑÑ ÐžÐ· бÑвÑей веÑкО feature в МПвÑÑ Ð²ÐµÑкÑ. РазÑеÑОÑе кПМÑлОкÑÑ ÑлОÑМОÑ, кПÑПÑÑе вПзМОклО пÑО пеÑеМПÑе.
# ОÑпПлÑзÑйÑе ОÑÑПÑÐžÑ ÑÑÐŸÐ±Ñ ÑзМаÑÑ Ñ
ÑÑО кПЌЌОÑПв:
# - пÑеЎÑеÑÑвÑÑÑегП кПЌЌОÑÑ Ñ Ð¿ÐµÑвПй ÑаÑÑÑÑ ÑпОÑка: C0
# - ЎПбавлÑÑÑегП пПÑлеЎМОе ÑлеЌеМÑÑ ÑпОÑка: C2
git log --oneline --graph
git cherry-pick C0..C2
# ÑазÑеÑОÑе кПМÑлОкÑÑ ÑлОÑМОÑ
# - ПÑÑеЎакÑОÑÑйÑе ci.md О/ОлО ci.test.js
# - ЎПбавÑÑе ÑÐ°Ð¹Ð»Ñ Ð² ОМЎекÑ
# - вÑпПлМОÑе "git cherry-pick --continue", ЌПжеÑе Ме ЌеМÑÑÑ ÑППбÑеМОе кПЌЌОÑа
# ÐПбавÑÑе ÑегÑеÑÑОПММÑй ÑеÑÑ Ð² ci.test.js
# ÐапÑÑÑОÑе ÑеÑÑÑ Ð»ÐŸÐºÐ°Ð»ÑМП, ÑÑÐŸÐ±Ñ ÑбеЎОÑÑÑÑ, ÑÑП ПМО Ме завеÑÑаÑÑÑÑ ÑÑпеÑМП.
# УЎалОÑе ÑекÑÑ " with a sneaky bug" в ci.md.
# ÐПбавÑÑе в ÐžÐœÐŽÐµÐºÑ ÐžÐ·ÐŒÐµÐœÐµÐœÐžÑ ÑеÑÑПв О в ÑпОÑке ÑагПв О закПЌЌОÑÑÑе ОÑ
.
git add ci.md ci.test.js
git commit -m "Fix the bug in steps list"
# ÐпÑблОкÑйÑе веÑÐºÑ Ð² ÑЎалÑММÑй ÑепПзОÑПÑОй.
git push --set-upstream origin feature-fix
ášáá³á¥ á¥á«á áá áá¢
ášáááµ áá ášáá³á¥ á¥á«á ááá á© á£á
áªáá á ááµá°á«ášá áá. á«á feature-fix
á¥áá° "ášááá
ááµ á
ááá«á" á¥á master
á¥áá° "áá°ášá³á á
ááá«á".
á¥á£áá áá°ááá¹ á¥áµáªá ááá áµášáµ áá á¥áᢠá PR ááááµ ááá áá ášáá°ááá¹á ááá³ áášáµ ááœááá¢
áá«áá á«ášááá¡
master
á á¥á± ááµá¥ ááµááá«áá á¹á« á¥áá° "áá°ášá³á á ááá«á" á á®áá± áá³áá¶áœ áášáá» áá ááááá¡ áááŠáœ ááᜠá áá°á¥áá¢
ášááá°áµ á¥á«áá á áœáµá "á£á áªáá ááµá°á«ášá"
áµá á¥áááµá á¥ááá°áááá! á¥á£áá áááŠá¹á á«áœáµá master
ášááá°áµ á¥á«á.
ïžá°áá£á
- "ášááµáµ á¥á«áá á áá áµ" á á á á«áµááá¢
- "áá á°á±á á ášááá¥" á á á á«áµááá¢
- ášá áá á áá áµááá«áµáááá "á ááá«á á°áá" á á á á«áµááá¢
á á áá áá áááááµ ášááá£á áá
ááá¢
á¥áá³á á°áµ á ááœá!
á á°ášá³á³á áá á°áµ áá áµ á°áᜠá á°ááᶠášáááµá·ážáá áááá á¥ááááᜠášáá°ááá¢
á áµáá
áá± áá áááážáá áœáá®áœ á«áµá°áá ááá á¥ááŽáµ áá»á»á á¥áá°ááœá á«áá á¥á£ááá áœáá ááá á©
ááá: hab.com