αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž’αž˜αŸ’αž˜αžαžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹

αžαžΎαž’αŸ’αž“αž€αž”αžΆαž“αžšαŸ€αž“αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ Git αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž…αž„αŸ‹αžŸαŸ’αžšαž˜αŸƒαž˜αžΎαž›αžαžΆαžαžΎαž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹ (CI) αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž–αž·αžαžŠαŸ‚αžšαž¬αž‘αŸ? αž¬αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž’αŸ’αž“αž€αž…αž„αŸ‹αž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž”αŸ’αžšαž…αžΆαŸ†αžαŸ’αž„αŸƒαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€? αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆαž“αŸαŸ‡αž“αžΉαž„αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž’αŸ’αž“αž€αž“αžΌαžœαž‡αŸ†αž“αžΆαž‰αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αžŠαŸ„αž™αž”αŸ’αžšαžΎαžƒαŸ’αž›αžΆαŸ†αž„ GitHub αŸ” αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆαž“αŸαŸ‡αž˜αž·αž“αž˜αžΆαž“αž”αŸ†αžŽαž„αž€αŸ’αž›αžΆαž™αž‡αžΆαž’αŸ’αž“αž€αž‡αŸ†αž“αž½αž™αž€αžΆαžšαžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž…αž»αž…αž”αžΆαž“αž“αŸ„αŸ‡αž‘αŸ αž•αŸ’αž‘αž»αž™αž‘αŸ…αžœαž·αž‰ αž’αŸ’αž“αž€αž“αžΉαž„αž’αž“αž»αžœαžαŸ’αžαžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αžŠαžΌαž…αž‚αŸ’αž“αžΆαžŠαŸ‚αž›αž˜αž“αž»αžŸαŸ’αžŸαž–αž·αžαž‡αžΆαž’αŸ’αžœαžΎαž“αŸ…αž€αž“αŸ’αž›αŸ‚αž„αž’αŸ’αžœαžΎαž€αžΆαžš αžαžΆαž˜αžšαž”αŸ€αž”αžŠαžΌαž…αž‚αŸ’αž“αžΆαžŠαŸ‚αž›αž–αž½αž€αž‚αŸαž’αŸ’αžœαžΎαžœαžΆαŸ” αžαŸ’αž‰αž»αŸ†β€‹αž“αžΉαž„β€‹αž–αž“αŸ’αž™αž›αŸ‹β€‹αž–αžΈβ€‹αž‘αŸ’αžšαžΉαžŸαŸ’αžŠαžΈβ€‹αžŠαžΌαž…β€‹αžŠαŸ‚αž›β€‹αž’αŸ’αž“αž€β€‹αž†αŸ’αž›αž„β€‹αž€αžΆαžαŸ‹β€‹αž‡αŸ†αž αžΆαž“β€‹αžŠαŸ‚αž›β€‹αž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αŸ”

αžαžΎβ€‹αž™αžΎαž„β€‹αž’αŸ’αžœαžΎαž’αŸ’αžœαžΈ?

αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž™αžΎαž„αžšαžΈαž€αž…αž˜αŸ’αžšαžΎαž“ αž™αžΎαž„αž“αžΉαž„αž”αž„αŸ’αž€αžΎαžαž‡αžΆαž”αžŽαŸ’αžαžΎαžšαŸ—αž“αžΌαžœαž”αž‰αŸ’αž‡αžΈαž“αŸƒαž‡αŸ†αž αžΆαž“ CI αž’αž˜αŸ’αž˜αžαžΆ αžŠαŸ‚αž›αž‡αžΆαžœαž·αž’αžΈαžŠαŸαž›αŸ’αž’αž€αŸ’αž“αž»αž„αž€αžΆαžšαž…αž„αž…αžΆαŸ†αž”αž‰αŸ’αž‡αžΈαž“αŸαŸ‡αŸ” αž˜αŸ’αž™αŸ‰αžΆαž„αžœαž·αž‰αž‘αŸ€αž αž™αžΎαž„αž“αžΉαž„αž”αž„αŸ’αž€αžΎαžαž”αž‰αŸ’αž‡αžΈαžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž’αŸ’αžœαžΎ αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αž’αŸ’αžœαžΎαžŸαž˜αžΆαž αžšαžŽαž€αž˜αŸ’αž˜αž”αž“αŸ’αž αž’αŸ’αžœαžΎαžŸαž˜αžΆαž αžšαžŽαž€αž˜αŸ’αž˜αž”αž“αŸ’αžαŸ” αž™αžΎαž„αž€αŸαž“αžΉαž„αž”αŸ’αžšαžΎαžŸαŸ†αžŽαž»αŸ†αžαŸαžŸαŸ’αžαžŸαžΆαž˜αž‰αŸ’αž‰ αžŠαžΎαž˜αŸ’αž”αžΈαž“αžΆαŸ†αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš CI αžšαž”αžŸαŸ‹αž™αžΎαž„αžαž·αžαž‘αŸ…αž‡αž·αžαž—αžΆαž–αž–αž·αžαŸ”

GIF αž“αŸαŸ‡αž”αž„αŸ’αž αžΆαž‰αž–αžΈαž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž“αŸ…αž–αŸαž›αž’αŸ’αž“αž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆαŸ” αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αž˜αž·αž“αž˜αžΆαž“αž’αŸ’αžœαžΈαžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž‘αŸαž αžΎαž™αž˜αžΆαž“αžαŸ‚αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž”αŸ†αž•αž»αžαŸ”

αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž’αž˜αŸ’αž˜αžαžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹

αž’αŸ’αž“αž€αž“αžΉαž„αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžŸαŸαžŽαžΆαžšαžΈαž™αŸ‰αžΌ CI αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

  • αž’αŸ’αžœαžΎαž€αžΆαžšαž›αžΎαž˜αž»αžαž„αžΆαžšαž˜αž½αž™;
  • αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžŠαžΎαž˜αŸ’αž”αžΈαž’αžΆαž“αžΆαž‚αž»αžŽαž—αžΆαž–;
  • αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž„αžΆαžšαž’αžΆαž‘αž·αž—αžΆαž–;
  • αž€αžΆαžšβ€‹αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™β€‹αž‡αž˜αŸ’αž›αŸ„αŸ‡β€‹αž–αŸαž›β€‹αžŠαŸ‚αž›β€‹αž€αžΆαžšβ€‹αž…αŸ’αžšαž”αžΆαž…αŸ‹β€‹αž”αž‰αŸ’αž…αžΌαž›β€‹αž‚αŸ’αž“αžΆβ€‹αž“αŸƒβ€‹αž˜αŸ‚αž€αž’αžΆαž„ (αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆβ€‹αž‡αž˜αŸ’αž›αŸ„αŸ‡);
  • αž€αŸ†αž αž»αžŸαž€αžΎαžαž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αž™αžΆαž€αžΆαžŸαž•αž›αž·αžαž€αž˜αŸ’αž˜αŸ”

αžαžΎαž’αŸ’αž“αž€αž“αžΉαž„αžšαŸ€αž“αž’αŸ’αžœαžΈαžαŸ’αž›αŸ‡?

αž’αŸ’αž“αž€αž“αžΉαž„αž’αžΆαž…αž†αŸ’αž›αžΎαž™αžŸαŸ†αžŽαž½αžšαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

  • αžαžΎαžŸαž˜αžΆαž αžšαžŽαž€αž˜αŸ’αž˜αž”αž“αŸ’αž (CI) αž‡αžΆαž’αŸ’αžœαžΈ?
  • αžαžΎαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž”αŸ’αžšαž—αŸαž‘αžŽαžΆαžαŸ’αž›αŸ‡αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž“αŸ…αž€αŸ’αž“αž»αž„ CI αž αžΎαž™αžŠαžΎαž˜αŸ’αž”αžΈαž†αŸ’αž›αžΎαž™αžαž”αž‘αŸ…αž“αžΉαž„αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž’αŸ’αžœαžΈαžαŸ’αž›αŸ‡αžŠαŸ‚αž›αž–αž½αž€αž‚αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αž‘αžΎαž„?
  • αžαžΎβ€‹αž’αŸ’αžœαžΈβ€‹αž‘αŸ…β€‹αž‡αžΆβ€‹αžŸαŸ†αžŽαžΎβ€‹αž‘αžΆαž‰β€‹αž™αž€ αž αžΎαž™β€‹αžαžΎβ€‹αžœαžΆβ€‹αžαŸ’αžšαžΌαžœβ€‹αž€αžΆαžšβ€‹αž“αŸ…β€‹αž–αŸαž›β€‹αžŽαžΆ?
  • αž’αŸ’αžœαžΈαž‘αŸ…αž‡αžΆ Test Driven Development (TDD) αž αžΎαž™αžαžΎαžœαžΆαž‘αžΆαž€αŸ‹αž‘αž„αž“αžΉαž„ CI αž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?
  • αžαžΎβ€‹αžαŸ’αž‰αž»αŸ†β€‹αž‚αž½αžšβ€‹αžŠαžΆαž€αŸ‹β€‹αž”αž‰αŸ’αž…αžΌαž›β€‹αž‚αŸ’αž“αžΆ αž¬β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž€αžΆαžšβ€‹αž•αŸ’αž›αžΆαžŸαŸ‹β€‹αž”αŸ’αžαžΌαžšβ€‹αž‘αžΎαž„β€‹αžœαž·αž‰?
  • αžαŸ’αžšαž‘αž”αŸ‹ αž¬αž‡αž½αžŸαž‡αž»αž›αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαŸ‚αž”αž“αŸ’αž‘αžΆαž”αŸ‹?

αžŠαŸ†αž”αžΌαž„β€‹αž‘αžΎαž™ αžαŸ’αž‰αž»αŸ†β€‹αž”αžΆαž“β€‹αž”αž€αž”αŸ’αžšαŸ‚β€‹αžšαžΏαž„β€‹αžŠαžΌαž…αž‡αžΆ β€œαž‘αžΆαž‰β€‹αžŸαŸ†αžŽαžΎβ€ αž‚αŸ’αžšαž”αŸ‹β€‹αž‘αžΈαž€αž“αŸ’αž›αŸ‚αž„ αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž‡αžΆβ€‹αž›αž‘αŸ’αž’αž•αž› αžαŸ’αž‰αž»αŸ†β€‹αž”αžΆαž“β€‹αžŸαž˜αŸ’αžšαŸαž…β€‹αž…αž·αžαŸ’αžβ€‹αžαŸ’αžšαž‘αž”αŸ‹β€‹αžƒαŸ’αž›αžΆβ€‹αž‡αžΆβ€‹αž—αžΆαžŸαžΆβ€‹αž’αž„αŸ‹αž‚αŸ’αž›αŸαžŸβ€‹αž“αŸ…β€‹αž€αž“αŸ’αž›αŸ‚αž„β€‹αžαŸ’αž›αŸ‡ αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž€αžΆαžαŸ‹β€‹αž”αž“αŸ’αžαž™β€‹αž€αž˜αŸ’αžšαž·αžβ€‹αž“αŸƒβ€‹αž€αžΆαžšβ€‹αž†αŸ’αž€αž½αžβ€‹αž€αŸ’αž“αž»αž„β€‹αž’αžαŸ’αžαž”αž‘αŸ” αž–αŸαž›αžαŸ’αž›αŸ‡αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αŸ’αžšαžΎ "programmer surzhik" αžŠαžΌαž…αž‡αžΆαž€αž·αžšαž·αž™αžΆαžŸαž–αŸ’αž‘αžŠαŸαž’αžŸαŸ’αž…αžΆαžšαŸ’αž™ "commit" αžŠαŸ‚αž›αž˜αž“αž»αžŸαŸ’αžŸαž–αž·αžαž‡αžΆαž”αŸ’αžšαžΎαžœαžΆαž“αŸ…αž€αž“αŸ’αž›αŸ‚αž„αž’αŸ’αžœαžΎαž€αžΆαžšαŸ”

αžαžΎαžŸαž˜αžΆαž αžšαžŽαž€αž˜αŸ’αž˜αž”αž“αŸ’αžαž‚αžΊαž‡αžΆαž’αŸ’αžœαžΈ?

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž¬ CI αž‚αžΊαž‡αžΆαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž”αž…αŸ’αž…αŸαž€αž‘αŸαžŸαžŠαŸ‚αž›αžŸαž˜αžΆαž‡αž·αž€αž€αŸ’αžšαž»αž˜αž“αžΈαž˜αž½αž™αŸ—αž”αž‰αŸ’αž…αžΌαž›αž€αžΌαžŠαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž‘αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αž‘αžΌαž‘αŸ…αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αž˜αŸ’αžαž„αž€αŸ’αž“αž»αž„αž˜αž½αž™αžαŸ’αž„αŸƒ αž αžΎαž™αž€αžΌαžŠαž›αž‘αŸ’αž’αž•αž›αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αžαŸ’αžšαžΌαžœαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž€αŸ†αž αž»αžŸαŸ”

αž˜αžΆαž“αž€αžΆαžšαžαŸ’αžœαŸ‚αž„αž‚αŸ†αž“αž·αžαž‚αŸ’αž“αžΆαž’αŸ†αž–αžΈαž–αžΆαž€αŸ’αž™αž“αŸαŸ‡αŸ”

αž…αŸ†αžŽαž»αž…αž“αŸƒαž€αžΆαžšαžˆαŸ’αž›αŸ„αŸ‡αž”αŸ’αžšαž€αŸ‚αž€αž‚αŸ’αž“αžΆαž‚αžΊαž—αžΆαž–αž‰αžΉαž€αž‰αžΆαž”αŸ‹αž“αŸƒαž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αŸ” αž’αŸ’αž“αž€αžαŸ’αž›αŸ‡αž”αŸ’αžšαž€αŸ‚αž€αžαžΆαž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž€αžΌαžŠαžαŸ‚αž˜αž½αž™αžŠαž„αž€αŸ’αž“αž»αž„αž˜αž½αž™αžαŸ’αž„αŸƒαž‚αžΊαž˜αž·αž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž‘αŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αŸ” αž§αž‘αžΆαž αžšαžŽαŸαž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž€αŸ’αžšαž»αž˜αžŠαŸ‚αž›αž˜αž“αž»αžŸαŸ’αžŸαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αž“αžΆαž™αž€αž€αžΌαžŠαžαŸ’αž˜αžΈαŸ—αž“αŸ…αž–αŸαž›αž–αŸ’αžšαžΉαž€ αž αžΎαž™αž”αž‰αŸ’αž…αžΌαž›αžœαžΆαž˜αŸ’αžαž„αž“αŸ…αž–αŸαž›αž›αŸ’αž„αžΆαž…αŸ” αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αžΆαžšαž‡αŸ†αž‘αžΆαžŸαŸ‹αžŠαŸαžŸαž˜αž αŸαžαž»αžŸαž˜αž•αž› αž‡αžΆαž‘αžΌαž‘αŸ…αž‚αŸαž‡αžΏαžαžΆαž“αž·αž™αž˜αž“αŸαž™αž˜αŸ’αžαž„αž€αŸ’αž“αž»αž„αž˜αž½αž™αžαŸ’αž„αŸƒαž‚αžΊαžŸαž˜αž αŸαžαž»αž•αž›αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹ αž“αž·αž„αžŸαž˜αžšαž˜αŸ’αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ’αžšαž»αž˜αžŠαŸ‚αž›αž˜αžΆαž“αž‘αŸ†αž αŸ†αžαž»αžŸαŸ—αž‚αŸ’αž“αžΆαŸ”

αž€αžΆαžšαž‡αŸ†αž‘αžΆαžŸαŸ‹αž˜αž½αž™αž‘αŸ€αžαž‚αžΊαžαžΆ C ++ αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž—αžΆαžŸαžΆαžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž“αŸ„αŸ‡αž‘αŸ αž αžΎαž™αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž‘αžΆαž˜αž‘αžΆαžšαž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž€αŸ†αž αž»αžŸαž‡αžΆαž˜αž’αŸ’αž™αŸ„αž”αžΆαž™αž“αŸƒαžŸαž»αž–αž›αž—αžΆαž–αž‚αžΊαžαŸ’αžŸαŸ„αž™αŸ” αžŸαŸ†αžŽαž»αŸ†αž“αŸƒαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž˜αž½αž™αž…αŸ†αž“αž½αž“ (αž§αž‘αžΆαž αžšαžŽαŸ αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž―αž€αžαžΆαžŠαŸ‚αž›αž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“) αž€αŸαžαŸ’αžšαžΌαžœαžαŸ‚αž”αž‰αŸ’αž…αž”αŸ‹αžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™αž•αž„αžŠαŸ‚αžšαŸ” αž“αŸ…αž–αŸαž›αž“αŸαŸ‡ αžŸαž αž‚αž˜αž“αŸαž€αŸ†αž–αž»αž„αž†αŸ’αž–αŸ„αŸ‡αž‘αŸ…αžšαž€αž€αžΆαžšαž’αŸ’αžœαžΎαž±αŸ’αž™αž“αŸαŸ‡αž‡αžΆαžαž˜αŸ’αžšαžΌαžœαž€αžΆαžš αž αžΎαž™αž“αŸ…αž–αŸαž›αž’αž“αžΆαž‚αž "αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŸαžΆαž„αžŸαž„αŸ‹ + αž―αž€αžαžΆ" αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž“αžΉαž„αž€αŸ’αž›αžΆαž™αž‘αŸ…αž‡αžΆαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž’αž˜αŸ’αž˜αžαžΆ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αž·αž“αž‘αžΆαž“αŸ‹αž˜αžΆαž“αŸ”

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹ αžαž»αžŸαž‚αŸ’αž“αžΆαž–αžΈ αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž”αž“αŸ’αž (αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž”αž“αŸ’αž, ស៊ីឌី) αž“αŸ…αž€αŸ’αž“αž»αž„αž“αŸ„αŸ‡αžœαžΆαž˜αž·αž“αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž˜αžΆαž“αž”αŸαž€αŸ’αžαž‡αž“αž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžœαžŠαŸ’αžαž“αŸƒαž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž“αžΈαž˜αž½αž™αŸ—αŸ”

αž”αž‰αŸ’αž‡αžΈαž“αŸƒαž‡αŸ†αž αžΆαž“αžŠαŸ‚αž›αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαž–αŸαž‰αž˜αž½αž™αžœαž‚αŸ’αž‚

  1. αž‘αžΆαž‰αž›αŸαžαž€αžΌαžŠαž…αž»αž„αž€αŸ’αžšαŸ„αž™αŸ” αž”αž„αŸ’αž€αžΎαžαžŸαžΆαžαžΆαž–αžΈ master. αž…αžΆαž”αŸ‹β€‹αž•αŸ’αžαžΎβ€‹αž˜β€‹αž’αŸ’αžœαžΎβ€‹αž€αžΆαžšαž„αžΆαžšαŸ”
  2. αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαžŸαž“αŸ’αž™αžΆαž“αŸ…αž›αžΎαžŸαžΆαžαžΆαžαŸ’αž˜αžΈαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αžŸαžΆαž„αžŸαž„αŸ‹αž“αž·αž„αžŸαžΆαž€αž›αŸ’αž”αž„αž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€αŸ” αž†αŸ’αž›αž„αž€αžΆαžαŸ‹? αž‘αŸ…αž‡αŸ†αž αžΆαž“αž”αž“αŸ’αž‘αžΆαž”αŸ‹αŸ” αž”αžšαžΆαž‡αŸαž™? αž‡αž½αžŸαž‡αž»αž›αž€αŸ†αž αž»αžŸ αž¬αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž αž αžΎαž™αž–αŸ’αž™αžΆαž™αžΆαž˜αž˜αŸ’αžαž„αž‘αŸ€αžαŸ”
  3. αžšαž»αž‰αž‘αŸ…αžƒαŸ’αž›αžΆαŸ†αž„αž–αžΈαž…αž˜αŸ’αž„αžΆαž™ αž¬αžŸαžΆαžαžΆαž–αžΈαž…αž˜αŸ’αž„αžΆαž™αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”
  4. αž”αž„αŸ’αž€αžΎαžαžŸαŸ†αžŽαžΎαžšαž‘αžΆαž‰αŸ” αž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž’αŸ†αž–αžΈαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αž αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž”αž“αŸ’αžαŸ” αž’αŸ’αžœαžΎβ€‹αž±αŸ’αž™β€‹αž€αžΆαžšβ€‹αž’αŸ’αžœαžΎβ€‹αžαŸβ€‹αžŸαŸ’αžβ€‹αž†αŸ’αž›αž„β€‹αž‘αŸ…β€‹αž›αžΎβ€‹αžŸαžΆαžαžΆβ€‹αž›αž€αŸ’αžαžŽαŸˆβ€‹αž–αž·αžŸαŸαžŸβ€‹αŸ”
  5. αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆ / αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αžΎαž„αžœαž·αž‰αž’αŸ’αžœαžΎαž‘αžΎαž„αž–αžΈαž˜αŸαŸ” αž’αŸ’αžœαžΎαž±αŸ’αž™αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž›αž‘αŸ’αž’αž•αž›αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαŸ”
  6. αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž–αžΈαž•αŸ’αž“αŸ‚αž€αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž‘αŸ…αž•αž›αž·αžαž€αž˜αŸ’αž˜αŸ”
  7. αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αžœαžΈαŸ—αž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž›αŸ’αž’αž€αŸ’αž“αž»αž„αž•αž›αž·αžαž€αž˜αŸ’αž˜αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αžŽαžΆαž˜αž½αž™ αžŸαžΌαž˜αž”αž‰αŸ’αž…αžΌαž›αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αŸ…αž‡αžΆαž˜αŸαŸ”

αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž’αž˜αŸ’αž˜αžαžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹

️ αž€αžΆαžšαžšαŸ€αž”αž…αŸ†

αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΆαž€αžŠαžαžΆαž’αŸ’αž“αž€αž˜αžΆαž“αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž™αž€αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆαž“αŸαŸ‡αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αžΆαžš Node.js ΠΈ αž’αžαž·αžαž·αž‡αž“ Git.

αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž—αŸ’αž‰αŸ€αžœ Git αžŽαžΆαž˜αž½αž™αž”αžΆαž“ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž•αŸ’αžαž›αŸ‹αžαŸ‚αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž“αŸ’αž‘αžΆαžαŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ”

αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΆαž€αžŠαžαžΆαž’αŸ’αž“αž€αž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Git αžŠαŸ‚αž›αž‚αžΆαŸ†αž‘αŸ’αžšαž”αž“αŸ’αž‘αžΆαžαŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž˜αž·αž“αž‘αžΆαž“αŸ‹αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž—αŸ’αž‰αŸ€αžœ Git αžŠαŸ‚αž›αž‚αžΆαŸ†αž‘αŸ’αžšαž”αž“αŸ’αž‘αžΆαžαŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž‘αŸ αž’αŸ’αž“αž€αž’αžΆαž…αžŸαŸ’αžœαŸ‚αž„αžšαž€αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈαž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ αž“αŸ…αž‘αžΈαž“αŸαŸ‡.

αžšαŸ€αž”αž…αŸ†αžƒαŸ’αž›αžΆαŸ†αž„

αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αž„αŸ’αž€αžΎαžαž…αŸ’αž”αžΆαž”αŸ‹αž…αž˜αŸ’αž›αž„αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“ (fork) αžƒαŸ’αž›αžΆαŸ†αž„αž‚αŸ†αžšαžΌαžŠαŸ‚αž›αž˜αžΆαž“αž›αŸαžαž€αžΌαžŠαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆ αž“αŸ…αž›αžΎ GitHub αŸ” αž…αžΌαžšαž™αžΎαž„αž™αž›αŸ‹αž–αŸ’αžšαž˜αž αŸ…αž…αŸ’αž”αžΆαž”αŸ‹αž…αž˜αŸ’αž›αž„αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αž“αŸαŸ‡αŸ” αžƒαŸ’αž›αžΆαŸ†αž„αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆ.

αžšαž½αž…αžšαžΆαž›αŸ‹? αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž˜αž·αž“αž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αž‘αŸ αžƒαŸ’αž›αžΆαŸ†αž„αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‘αŸ†αž“αž„αž‡αžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆ continuous-integration-team-scenarios-studentsαžœαžΆαž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ…αž€αŸ’αž“αž»αž„αž‚αžŽαž“αžΈ GitHub αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž αžΎαž™ URL αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡

https://github.com/<вашС имя ползоватСля Π½Π° GitHub>/continuous-integration-team-scenarios-students

αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž αŸ…αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αž“αŸαŸ‡αžŠαŸ„αž™αžŸαžΆαž˜αž‰αŸ’αž‰ <URL рСпозитория>.

αžαž„αŸ’αž€αŸ€αž”αž˜αž»αŸ†αžŠαžΌαž… <Ρ‚ΡƒΡ‚> αž“αžΉαž„αž˜αžΆαž“αž“αŸαž™αžαžΆαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžαŸ‚αž‡αŸ†αž“αž½αžŸαž€αž“αŸ’αžŸαŸ„αž˜αž”αŸ‚αž”αž“αŸαŸ‡αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžαž˜αŸ’αž›αŸƒαžŸαž˜αžŸαŸ’αžšαž”αŸ”

αž’αŸ’αžœαžΎβ€‹αž±αŸ’αž™β€‹αž”αŸ’αžšαžΆαž€αžŠβ€‹αžαžΆ αžŸαž€αž˜αŸ’αž˜αž—αžΆαž– GitHub αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆαž“αŸαŸ‡αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž–αž½αž€αžœαžΆαž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΎαž€αž‘αŸ αžŸαžΌαž˜αž”αžΎαž€αž–αž½αž€αžœαžΆαžŠαŸ„αž™αž…αž»αž…αž”αŸŠαžΌαžαž»αž„αž’αŸ†αž“αŸ…αž€αžŽαŸ’αžαžΆαž›αž‘αŸ†αž–αŸαžš αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž…αžΌαž›αž‘αŸ…αž”αžΆαž“αžŠαŸ„αž™αž…αž»αž… αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž“αŸ…αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹ GitHub αŸ”

αž’αŸ’αž“αž€αž“αžΉαž„αž˜αž·αž“αž’αžΆαž…αž”αž‰αŸ’αž…αž”αŸ‹αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆαžαžΆαž˜αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž‘αŸ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžŸαž€αž˜αŸ’αž˜αž—αžΆαž– GitHub αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΎαž€αŸ”

αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž’αž˜αŸ’αž˜αžαžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹

αž’αŸ’αž“αž€αžαŸ‚αž„αžαŸ‚αž’αžΆαž…αž”αŸ’αžšαžΎαžŸαž˜αžαŸ’αžαž—αžΆαž–αžšαž”αžŸαŸ‹ GitHub αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž αžΆαž‰ Markdown αžŠαžΎαž˜αŸ’αž”αžΈαž˜αžΎαž›αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž“αŸƒαž”αž‰αŸ’αž‡αžΈαžŠαŸ‚αž›αž™αžΎαž„αž€αŸ†αž–αž»αž„αžŸαžšαžŸαŸαžšαž“αŸ…αž‘αžΈαž“αŸαŸ‡

https://github.com/<your GitHub user name>/continuous-integration-team-scenarios-students/blob/master/ci.md

αž’αŸ†αž–αžΈαž…αž˜αŸ’αž›αžΎαž™

αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αžœαž·αž’αžΈαžŠαŸαž›αŸ’αž’αž”αŸ†αž•αž»αžαžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž…αž”αŸ‹αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆαž“αŸαŸ‡αž‚αžΊαžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžœαžΆαžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„ αž’αŸ’αž“αž€αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž˜αžΆαž“αž€αžΆαžšαž›αŸ†αž”αžΆαž€αž˜αž½αž™αž…αŸ†αž“αž½αž“αŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž˜αžΆαž“αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαžαžΆαž’αŸ’αž“αž€αž˜αž·αž“αž™αž›αŸ‹αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎ αž“αž·αž„αž˜αž·αž“αž’αžΆαž…αž”αž“αŸ’αžαž”αžΆαž“ αž’αŸ’αž“αž€αž’αžΆαž…αžšαž€αž˜αžΎαž›αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžŽαŸ’αžαžΆαž‰αž“αŸαŸ‡αŸ” solutionαžŠαŸ‚αž›αžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”
αžŸαžΌαž˜β€‹αž€αž»αŸ†β€‹αž”αž‰αŸ’αž…αžΌαž›β€‹αž‚αŸ’αž“αžΆαŸ” solution Π² master αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆαŸ” αž’αŸ’αž“αž€β€‹αž’αžΆαž…β€‹αž”αŸ’αžšαžΎβ€‹αžŸαžΆαžαžΆβ€‹αž“αŸαŸ‡β€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž‚αž·αžβ€‹αž–αžΈβ€‹αž’αŸ’αžœαžΈβ€‹αžŠαŸ‚αž›β€‹αžαŸ’αžšαžΌαžœβ€‹αž’αŸ’αžœαžΎ αž¬β€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž”αŸ’αžšαŸ€αž”αž’αŸ€αž”β€‹αž€αžΌαžŠβ€‹αžšαž”αžŸαŸ‹β€‹αž’αŸ’αž“αž€β€‹αž‡αžΆαž˜αž½αž™β€‹αž“αžΉαž„β€‹αž’αŸ’αž“αž€β€‹αž“αž·αž–αž“αŸ’αž’ αžŠαŸ„αž™β€‹αž”αŸ’αžšαžΎβ€‹αž‚αŸ’αžšαž”αŸ‹β€‹αžŸαž˜αžαŸ’αžαž—αžΆαž–β€‹αžŠαŸ‚αž› Git αž•αŸ’αžŠαž›αŸ‹β€‹αž±αŸ’αž™β€‹αž™αžΎαž„αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž”αžΆαžαŸ‹αž”αž„αŸ‹αž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„ αž’αŸ’αž“αž€αž’αžΆαž…αž‡αŸ†αž“αž½αžŸαžŸαžΆαžαžΆαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„ 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, αž…αžΆαž”αŸ‹β€‹αž•αŸ’αžαžΎβ€‹αž˜β€‹αž’αŸ’αžœαžΎβ€‹αž€αžΆαžšαž„αžΆαžš

  1. αž€αŸ’αž›αžΌαž“αžƒαŸ’αž›αžΆαŸ†αž„αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆαž–αžΈ <URL рСпозитория>.
  2. αžšαžαŸ‹ npm install αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž‰αŸ’αž‡αžΈαž“αŸƒαžƒαŸ’αž›αžΆαŸ†αž„αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆ; αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαžœαžΆαžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αž‘αžΎαž„ Jest αžŠαŸ‚αž›αž™αžΎαž„αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαŸαžŸαŸ’αžαŸ”
  3. αž”αž„αŸ’αž€αžΎαžαžŸαžΆαžαžΆαž˜αž½αž™αž αžΎαž™αžŠαžΆαž€αŸ‹αžˆαŸ’αž˜αŸ„αŸ‡αžœαžΆαŸ” feature. αž”αŸ’αžαžΌαžšαž‘αŸ…αžαŸ’αžŸαŸ‚αž“αŸαŸ‡αŸ”
  4. αž”αž“αŸ’αžαŸ‚αž˜αž›αŸαžαž€αžΌαžŠαžŸαžΆαž€αž›αŸ’αž”αž„αž‘αŸ… 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);
    });

  5. αž”αž“αŸ’αžαŸ‚αž˜αž’αžαŸ’αžαž”αž‘αž‡αžΆαž˜αž½αž™ 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 ΠΊΠ°ΠΊ описано Π²Ρ‹ΡˆΠ΅

αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαž›αžΎαžŸαžΆαžαžΆαžαŸ’αž˜αžΈ αž”αž„αŸ’αž€αžΎαž αž“αž·αž„αžŸαžΆαž€αž›αŸ’αž”αž„αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“

αž™αžΎαž„β€‹αž“αžΉαž„β€‹αžšαŸ€αž”αž…αŸ†β€‹αž€αžΆαžšβ€‹αž’αŸ’αžœαžΎβ€‹αžαŸαžŸαŸ’αžβ€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšβ€‹αž˜αž»αž“β€‹αž“αžΉαž„β€‹αž’αŸ’αžœαžΎ αž αžΎαž™β€‹αž”αž“αŸ’αž‘αžΆαž”αŸ‹β€‹αž˜αž€β€‹αž”αž‰αŸ’αž…αžΌαž›β€‹αž€αžΌαžŠαŸ”

αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž’αž˜αŸ’αž˜αžαžΆαž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·

  • αž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€αŸ–
    • αž”αž“αŸ’αžαž¬αž†αŸ’αž›αžΎαž™αžαž”αž‘αŸ…αž“αžΉαž„αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αžΌαžŠαžŸαž˜αžŸαŸ’αžšαž”;
    • αž“αŸ…αž›αžΎαž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€ (αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž—αžΆαžŸαžΆαžŠαŸ‚αž›αž”αžΆαž“αž”αž€αž”αŸ’αžšαŸ‚αž¬ JIT-αž…αž„αž€αŸ’αžšαž„);
    • αž€αŸ†αž‘αž»αž„αž–αŸαž›αž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆ (αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαž…αž„αž€αŸ’αžšαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αžΆαž˜αž‘αžΆαžš);
    • αž“αŸ…αž›αžΎαž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž;
    • αž“αŸ…αž–αŸαž›αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž•αŸ’αžŸαžΆαž™αž‘αŸ…αžƒαŸ’αž›αžΆαŸ†αž„αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αŸ”

  • αž“αŸ…αž›αžΎ build server ឬ build environmentαŸ–
    • αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž›αŸαžαž€αžΌαžŠαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžŸαž–αŸ’αžœαž•αŸ’αžŸαžΆαž™αž‘αŸ…αž€αžΆαž“αŸ‹αžŸαžΆαžαžΆ/αžƒαŸ’αž›αžΆαŸ†αž„αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αŸ”
    • αž€αžΌαžŠαž“αŸ…αž€αŸ’αž“αž»αž„αžαŸ’αžŸαŸ‚αž“αŸαŸ‡αž€αŸ†αž–αž»αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžΆαž€αž›αŸ’αž”αž„αŸ”
    • αž›αž‘αŸ’αž’αž•αž›αžŸαž€αŸ’αžαžΆαž“αž»αž–αž›αž“αŸƒαž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžΆαž€αž›αŸ’αž”αž„ (αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαž‡αžΆαž˜αž½αž™ master).
    • αž‡αžΆαžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αžŸαž˜αžΆαž αžšαžŽαž€αž˜αŸ’αž˜αž”αž“αŸ’αž / αž”αŸ†αž–αž„αŸ‹αž…αŸ‚αž€αž…αžΆαž™αž”αž“αŸ’αž

αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆ αžˆαž»αžαžŸαžΆαž€αž›αŸ’αž”αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαž“αŸ‹αžαŸ‚αž›αžΏαž“ αž’αŸ’αž“αž€αž’αžΆαž…αž˜αžΆαž“αž›αž‘αŸ’αž’αž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžœαžΆαž”αžΆαž“αž‰αžΉαž€αž‰αžΆαž”αŸ‹αŸ” αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž’αž˜αŸ’αž˜αžαžΆαž’αžΆαž…αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ”

  • αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž―αž€αžαžΆαž›αžΏαž“ - αž€αŸ†αž‘αž»αž„αž–αŸαž›αžŸαžΆαž„αžŸαž„αŸ‹αž€αŸ’αž“αž»αž„αž”αŸ†αž–αž„αŸ‹ CI
  • αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž―αž€αžαžΆαž™αžΊαž αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŸαž˜αžΆαžŸαž’αžΆαžαž»αžšαž αŸαžŸ αž“αž·αž„αž€αžΆαžšαž’αŸ’αžœαžΎαžŸαž˜αžΆαž αžšαžŽαž€αž˜αŸ’αž˜ - αž“αŸ…αž›αžΎαž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ†αž–αž„αŸ‹ CI
  • αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŸαž˜αžΆαžŸαž’αžΆαžαž»αž™αžΊαž αž“αž·αž„αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› - αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ†αž–αž„αŸ‹ CI
  • αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž•αŸ’αž‘αž»αž€ αž“αž·αž„αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŠαŸ‚αž›αž…αŸ†αžŽαžΆαž™αž–αŸαž›αžœαŸαž›αžΆ αž¬αž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαžαŸ’αž›αŸƒαž•αŸ’αžŸαŸαž„αž‘αŸ€αž - αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ†αž–αž„αŸ‹ CI/CD αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αžΆαž“αžαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„αžšαž”αŸ€αž”/αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›/αž”αŸ†αž–αž„αŸ‹αž“αŸƒαž€αžΆαžšαžŸαžΆαž„αžŸαž„αŸ‹αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ αž§αž‘αžΆαž αžšαžŽαŸ αž“αŸ…αž–αŸαž›αžšαŸ€αž”αž…αŸ†αž”αŸαž€αŸ’αžαž‡αž“αž…αŸαž‰αž•αŸ’αžŸαžΆαž™ αž¬αž“αŸ…αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αžŠαŸƒαŸ”

️ αž€αž·αž…αŸ’αž…αž€αžΆαžš

αžαŸ’αž‰αž»αŸ†αžŸαŸ’αž“αžΎαž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŠαŸ„αž™αžŠαŸƒαž‡αžΆαž˜αž»αž“αžŸαž·αž“αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ npm test. αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡ αžŸαžΌαž˜αž”αž“αŸ’αžαŸ‚αž˜ git hook αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžšαž”αžŸαŸ‹αž™αžΎαž„αž“αŸ…αž›αžΎαž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαŸ” αž˜αžΆαž“αž€αžΆαžšαž…αžΆαž”αŸ‹αž˜αž½αž™αŸ– αž‘αŸ†αž–αž€αŸ‹ Git αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαžαŸ‹αž‘αž»αž€αžαžΆαž‡αžΆαž•αŸ’αž“αŸ‚αž€αž˜αž½αž™αž“αŸƒαžƒαŸ’αž›αžΆαŸ†αž„αž‘αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž αžΎαž™αž˜αž·αž“αž’αžΆαž…αž€αŸ’αž›αžΌαž“αž…αŸαž‰αž–αžΈ GitHub αžšαž½αž˜αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαž˜αŸ’αž—αžΆαžšαŸˆαžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆαžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹αž”αžΆαž“αž‘αŸαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αž‘αžΎαž„αž‘αŸ†αž–αž€αŸ‹αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš install_hook.sh αž¬αž…αž˜αŸ’αž›αž„αž―αž€αžŸαžΆαžš repo/hooks/pre-commit αž‘αŸ…αž€αžΆαž“αŸ‹αžαžαž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€ .git/hooks/.
αž“αŸ…αž–αŸαž›αž’αŸ’αž“αž€αž”αŸ’αžšαž–αŸ’αžšαžΉαžαŸ’αž αž’αŸ’αž“αž€αž“αžΉαž„αžƒαžΎαž‰αžαžΆαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž αžΎαž™αž–αž½αž€αž‚αŸαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαžαžΎαž–αžΆαž€αŸ’αž™αž‚αž“αŸ’αž›αžΉαŸ‡αž˜αž½αž™αž…αŸ†αž“αž½αž“αž˜αžΆαž“αžœαžαŸ’αžαž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž‰αŸ’αž‡αžΈαžŠαŸ‚αžšαž¬αž‘αŸαŸ”

  1. αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŠαŸ„αž™αžŠαŸƒαžŠαŸ„αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ npm test αž“αŸ…αž€αŸ’αž“αž»αž„αžαžαžƒαŸ’αž›αžΆαŸ†αž„αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αžαžΆαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αŸ”
  2. αž€αŸ†αžŽαžαŸ‹ commit hook (pre-commit hook) αžŠαŸ„αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš install_hook.sh.
  3. αž’αŸ’αžœαžΎαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‘αŸ…αž€αžΆαž“αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”
  4. αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΆαž€αžŠαžαžΆαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž»αž“αž–αŸαž›αž’αŸ’αžœαžΎαŸ”

αžƒαŸ’αž›αžΆαŸ†αž„αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‚αž½αžšαžαŸ‚αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž’αŸ’αžœαžΎαžαžΆαž˜αž‡αŸ†αž αžΆαž“αž‘αžΆαŸ†αž„αž“αŸαŸ‡αŸ”
αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž’αž˜αŸ’αž˜αžαžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹

αž€αŸ’αžšαž»αž˜

# УстановитС 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 "αžŸαžΆαžαžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“" αž‚αžΊαž‡αžΆαžŸαžΆαžαžΆαžŠαŸ‚αž›αž’αŸ’αž“αž€αž•αŸ’αž’αŸ‚αž€αž›αžΎαž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž αžΎαž™ "αžŸαžΆαžαžΆαž€αŸ’αž”αžΆαž›" αž‚αžΊαž‡αžΆαžŸαžΆαžαžΆαžŠαŸ‚αž›αž˜αžΆαž“αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŠαŸ‚αž›αž”αžΆαž“αžŸαŸ’αž“αžΎαž‘αžΎαž„αŸ”

αž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž’αŸ†αž–αžΈαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαžαŸ’αž˜αžΈ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž”αž“αŸ’αž

αžŸαŸ†αžŽαžΎαž‘αžΆαž‰ (PR)

αžŸαŸ†αžŽαžΎαž‘αžΆαž‰ (PR) αž‚αžΊαž‡αžΆαžœαž·αž’αžΈαž˜αž½αž™αžŠαžΎαž˜αŸ’αž”αžΈαž–αž·αž—αžΆαž€αŸ’αžŸαžΆ αž“αž·αž„αžŸαžšαžŸαŸαžšαž€αžΌαžŠ αž€αŸαžŠαžΌαž…αž‡αžΆαž’αŸ’αžœαžΎαž€αžΆαžšαž–αž·αž“αž·αžαŸ’αž™αž€αžΌαžŠαŸ” αžŸαŸ†αžŽαžΎαž‘αžΆαž‰αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αžˆαŸ’αž˜αŸ„αŸ‡αžαžΆαž˜αžœαž·αž’αžΈαž‘αžΌαž‘αŸ…αž“αŸƒαž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αž»αž‚αŸ’αž‚αž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαžšαž½αž˜αŸ” αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆ αž˜αž“αž»αžŸαŸ’αžŸαž˜αŸ’αž“αžΆαž€αŸ‹αž€αŸ’αž›αžΌαž“αžƒαŸ’αž›αžΆαŸ†αž„αž•αŸ’αž›αžΌαžœαž€αžΆαžšαž–αžΈαž…αž˜αŸ’αž„αžΆαž™αžšαž”αžŸαŸ‹αž‚αž˜αŸ’αžšαŸ„αž„ αž αžΎαž™αž’αŸ’αžœαžΎαž€αžΆαžšαž›αžΎαž€αžΌαžŠαž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡ αž‚αžΆαžαŸ‹αžŠαžΆαž€αŸ‹αž›αŸαžαž€αžΌαžŠαž‘αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αž–αžΈαž…αž˜αŸ’αž„αžΆαž™αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αž‚αžΆαžαŸ‹ αž αžΎαž™αžŸαž»αŸ†αž±αŸ’αž™αž’αŸ’αž“αž€αž‘αž‘αž½αž›αžαž»αžŸαžαŸ’αžšαžΌαžœαž…αŸ†αž–αŸ„αŸ‡αžƒαŸ’αž›αžΆαŸ†αž„αž•αŸ’αž›αžΌαžœαž€αžΆαžšαž˜αž€αž™αž€(αž‘αžΆαž‰) αž€αžΌαžŠαžšαž”αžŸαŸ‹αžœαžΆαž‘αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸ αžŠαŸ‚αž›αž–αž½αž€αž‚αŸαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž› αž“αž·αž„αž’αžΆαž…αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› (αž”αž‰αŸ’αž…αžΌαž›) αžšαž”αžŸαŸ‹αž‚αžΆαžαŸ‹αŸ” αž‚αŸ†αž“αž·αžαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαžŸαŸ’αž‚αžΆαž›αŸ‹αž•αž„αžŠαŸ‚αžšαžŠαŸ„αž™αžˆαŸ’αž˜αŸ„αŸ‡αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž§αž‘αžΆαž αžšαžŽαŸαŸ” αž–αžΆαž€αŸ’αž™αžŸαž»αŸ†αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆ.

αž’αŸ’αž“αž€αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž”αŸ’αžšαžΎαž˜αž»αžαž„αžΆαžšαžŸαŸ†αžŽαžΎαžšαž‘αžΆαž‰αžšαž”αžŸαŸ‹ GitHub αž¬αžœαŸαž‘αž·αž€αžΆαžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆαž“αŸ„αŸ‡αž‘αŸαŸ” αž€αŸ’αžšαž»αž˜αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž’αžΆαž…αž”αŸ’αžšαžΎαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αž•αŸ’αžŸαŸαž„αž‘αŸ€αž αžšαž½αž˜αž‘αžΆαŸ†αž„αž€αžΆαžšαž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αž‘αž›αŸ‹αž˜αž»αž αž€αžΆαžšαž αŸ…αž‡αžΆαžŸαŸ†αž‘αŸαž„ αž¬αž’αŸŠαžΈαž˜αŸ‚αž› αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αžαŸ‚αž˜αžΆαž“αž αŸαžαž»αž•αž›αž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΎαžŸαŸ†αžŽαžΎαž‘αžΆαž‰αž‘αž˜αŸ’αžšαž„αŸ‹αžœαŸαž‘αž·αž€αžΆαŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž–αž½αž€αž‚αŸαž˜αž½αž™αž…αŸ†αž“αž½αž“αŸ–

  • αž€αžΆαžšαž–αž·αž—αžΆαž€αŸ’αžŸαžΆαžŠαŸ‚αž›αž”αžΆαž“αžšαŸ€αž”αž…αŸ†αž‘αžΆαž€αŸ‹αž‘αž„αž“αžΉαž„αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αžΌαžŠαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹;
  • αž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αžΎαž›αž˜αžαž·αž€αŸ‚αž›αž˜αŸ’αž’αž›αžΎαž€αžΆαžšαž„αžΆαžšαžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΈ autotesters αž“αž·αž„αžŸαž αž€αžΆαžšαžΈ;
  • αž•αŸ’αž›αžΌαžœαž€αžΆαžšαž“αŸƒαž€αžΆαžšαž–αž·αž“αž·αžαŸ’αž™αž€αžΌαžŠ;
  • αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž“αŸ…αž–αŸαž›αž€αŸ’αžšαŸ„αž™ αž’αŸ’αž“αž€αž’αžΆαž…αžšαž€αžƒαžΎαž‰αž αŸαžαž»αž•αž› αž“αž·αž„αž€αžΆαžšαž–αž·αž…αžΆαžšαžŽαžΆαž“αŸ…αž–αžΈαž€αŸ’αžšαŸ„αž™αž“αŸαŸ‡ αž¬αž”αŸ†αžŽαŸ‚αž€αž“αŸƒαž€αžΌαžŠαž“αŸ„αŸ‡αŸ”

αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆ αž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαžαžŸαŸ†αžŽαžΎαžšαž‘αžΆαž‰ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž’αŸ’αžœαžΈαž˜αž½αž™ αž¬αž‘αž‘αž½αž›αž”αžΆαž“αž˜αžαž·αž€αŸ‚αž›αž˜αŸ’αž’αŸ” αž§αž‘αžΆαž αžšαžŽαŸ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž€αŸ†αž–αž»αž„αž’αŸ’αžœαžΎαž€αžΆαžšαž›αžΎαž˜αž»αžαž„αžΆαžšαžŠαŸ‚αž›αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž…αŸ’αžšαžΎαž“αž‡αžΆαž„αž˜αž½αž™ αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž€αžΎαžαžŸαŸ†αžŽαžΎαž‘αžΆαž‰ αž˜αž»αž“αž–αŸαž›αžŸαžšαžŸαŸαžšαž€αžΌαžŠαžŠαŸ†αž”αžΌαž„αžŠαžΎαž˜αŸ’αž”αžΈαž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αž‚αŸ†αž“αž·αžαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž“αž·αž„αž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž’αŸ†αž–αžΈαž•αŸ‚αž“αž€αžΆαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‡αžΆαž˜αž½αž™αž’αŸ’αž“αž€αžŸαž αž€αžΆαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αžΆαžšαž„αžΆαžšαž˜αžΆαž“αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‡αžΆαž„αž“αŸαŸ‡ αžŸαŸ†αžŽαžΎαžšαž‘αžΆαž‰αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΎαž€αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž’αŸ’αžœαžΈαž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžšαž½αž… αž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αž·αž„αž’αžΆαž…αž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž”αžΆαž“αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸαžŽαžΆαžšαžΈαž™αŸ‰αžΌαž˜αž½αž™αž…αŸ†αž“αž½αž“ αž’αŸ’αž“αž€αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž…αž„αŸ‹αž”αžΎαž€ PR αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ‚αž αŸαžαž»αž•αž›αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž‚αž»αžŽαž—αžΆαž–αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ– αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· αž¬αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αžΆαžšαž–αž·αž“αž·αžαŸ’αž™αž€αžΌαžŠαŸ” αž’αŸ’αžœαžΈαž€αŸαžŠαŸ„αž™αžŠαŸ‚αž›αž’αŸ’αž“αž€αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αž αž€αž»αŸ†αž—αŸ’αž›αŸαž… @mention αž˜αž“αž»αžŸαŸ’αžŸαžŠαŸ‚αž›αž˜αžΆαž“αž€αžΆαžšαž™αž›αŸ‹αž–αŸ’αžšαž˜αžŠαŸ‚αž›αž’αŸ’αž“αž€αž…αž„αŸ‹αž”αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ†αžŽαžΎαž‘αžΆαž‰αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”

αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαž PR αž’αŸ’αž“αž€αž’αŸ’αžœαžΎαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ”

  • αž…αž„αŸ’αž’αž»αž›αž”αž„αŸ’αž αžΆαž‰αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αžŸαŸ’αž“αžΎαž±αŸ’αž™αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš αž“αž·αž„αž€αž“αŸ’αž›αŸ‚αž„αžŽαžΆαŸ”
  • αžŸαžšαžŸαŸαžšαž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž–αž“αŸ’αž™αž›αŸ‹αž–αžΈαž‚αŸ„αž›αž”αŸ†αžŽαž„αž“αŸƒαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž…αž„αŸ‹αž”αžΆαž“αŸ–
    • αž”αž“αŸ’αžαŸ‚αž˜β€‹αž’αŸ’αžœαžΈβ€‹αžŠαŸ‚αž›β€‹αžŸαŸ†αžαžΆαž“αŸ‹β€‹αžŠαŸ‚αž›β€‹αž˜αž·αž“β€‹αž…αŸ’αž”αžΆαžŸαŸ‹β€‹αž–αžΈβ€‹αž€αžΌαžŠ αž¬β€‹αž’αŸ’αžœαžΈβ€‹αžŠαŸ‚αž›β€‹αž˜αžΆαž“β€‹αž”αŸ’αžšαž™αŸ„αž‡αž“αŸβ€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž€αžΆαžšβ€‹αž™αž›αŸ‹β€‹αž–αžΈβ€‹αž”αžšαž·αž”αž‘β€‹αžŠαžΌαž…αž‡αžΆ #bugs αžŠαŸ‚αž›β€‹αž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’ αž“αž·αž„β€‹αž›αŸαžβ€‹αž”αŸ’αžšαž–αŸ’αžšαžΉαžαŸ’αžαŸ”
    • @mention αž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αžŠαŸ‚αž›αž’αŸ’αž“αž€αž…αž„αŸ‹αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ αž¬αž’αŸ’αž“αž€αž’αžΆαž… @mention αž–αž½αž€αž‚αŸαž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžαž·αž™αŸ„αž”αž›αŸ‹αž“αŸ…αž–αŸαž›αž€αŸ’αžšαŸ„αž™αŸ”
    • αžŸαž»αŸ†αž±αŸ’αž™αžŸαž αžŸαŸαžœαž·αž€αž‡αž½αž™αž’αŸ’αžœαžΈαž˜αž½αž™ αž¬αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž’αŸ’αžœαžΈαž˜αž½αž™αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αŸ”

αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž’αŸ’αž“αž€αž”αžΎαž€ PR αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž”αŸ‚αž”αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ αž“αŸαŸ‡αž“αžΉαž„αž‡αžΆαžŸαŸ†αžŽαž»αŸ†αž“αŸƒαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŠαžΌαž…αž‚αŸ’αž“αžΆαžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„αž–αž·αž αžœαžΆαž’αžΆαž…αž˜αžΆαž“αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž αž“αž·αž„αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž”αž“αŸ’αžαŸ‚αž˜αŸ”

αžŸαžΌαž˜αžšαž„αŸ‹αž…αžΆαŸ†αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αŸ” αž’αŸ’αž“αž€αž’αžΆαž…αžƒαžΎαž‰αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸƒαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž“αŸ…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸƒαž€αžΆαžšαž–αž·αž—αžΆαž€αŸ’αžŸαžΆ PR αž“αŸ…αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹ GitHub αŸ” αž”αž“αŸ’αžαž“αŸ…αž–αŸαž›αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αŸ”

️ αž”αž“αŸ’αžαŸ‚αž˜αž€αŸ†αžŽαžαŸ‹αž…αŸ†αžŽαžΆαŸ†αž’αŸ†αž–αžΈαž—αžΆαž–αž…αŸƒαžŠαž“αŸ’αž™αž“αŸƒαž”αž‰αŸ’αž‡αžΈαž‡αŸ†αž αžΆαž“ CI

αž”αž‰αŸ’αž‡αžΈαžŠαŸ‚αž›αž”αŸ’αžšαžΎαž€αŸ’αž“αž»αž„αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆαž“αŸαŸ‡αž‚αžΊαž”αŸ†αž–αžΆαž“ αž“αž·αž„αž”αŸ’αžšαž’αžΆαž“αž”αž‘ αž™αžΎαž„αž‚αž½αžšαž”αž“αŸ’αžαŸ‚αž˜αž…αŸ†αžŽαžΆαŸ†αž’αŸ†αž–αžΈαžšαžΏαž„αž“αŸαŸ‡αŸ”

️ αž€αž·αž…αŸ’αž…αž€αžΆαžšαŸ– αž”αž„αŸ’αž€αžΎαžαžŸαŸ†αžŽαžΎαž‘αžΆαž‰αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αžαž·αž™αŸ„αž”αž›αŸ‹αž“αŸαŸ‡αŸ”

  1. αž”αŸ’αžαžΌαžšαž‘αŸ…αžŸαžΆαžαžΆ master.
  2. αž”αž„αŸ’αž€αžΎαžαžŸαžΆαžαžΆαžŠαŸ‚αž›αž˜αžΆαž“αžˆαŸ’αž˜αŸ„αŸ‡ bugfix.
  3. αž”αž“αŸ’αžαŸ‚αž˜αž’αžαŸ’αžαž”αž‘αž…αŸ†αžŽαžΆαŸ†αž‘αŸ…αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαž―αž€αžŸαžΆαžš 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/).
  4. αž’αŸ’αžœαžΎαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαŸ”
  5. αž”αŸ„αŸ‡αž•αŸ’αžŸαžΆαž™αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™ bugfix αž‘αŸ…αžƒαŸ’αž›αžΆαŸ†αž„αž–αžΈαž…αž˜αŸ’αž„αžΆαž™αŸ”
  6. αž”αž„αŸ’αž€αžΎαžαž–αžΆαž€αŸ’αž™αžŸαž»αŸ†αž‘αžΆαž‰αžŠαŸ‚αž›αž˜αžΆαž“αžˆαŸ’αž˜αŸ„αŸ‡ αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹ αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαžΆαžαžΆαž€αŸ’αž”αžΆαž› 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 ΠΊΠ°ΠΊ описано Π²Ρ‹ΡˆΠ΅

αž’αž“αž»αž˜αŸαžαžŸαŸ†αžŽαžΎαž‘αžΆαž‰ "αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹"

️ αž€αž·αž…αŸ’αž…αž€αžΆαžš

  1. αž”αž„αŸ’αž€αžΎαžαžŸαŸ†αžŽαžΎαžšαž‘αžΆαž‰αŸ”
  2. αž…αž»αž… "αž”αž‰αŸ’αž…αžΌαž›αžŸαŸ†αžŽαžΎαž‘αžΆαž‰" αŸ”
  3. αž…αž»αž… "αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆ" αŸ”
  4. αž…αž»αž… "αž›αž»αž”αžŸαžΆαžαžΆ" αž™αžΎαž„αž›αŸ‚αž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαžœαžΆαž‘αŸ€αžαž αžΎαž™αŸ”

αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜αž“αŸƒαž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαŸ”
αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž’αž˜αŸ’αž˜αžαžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹

οΈαž”αž“αŸ’αžαž’αŸ’αžœαžΎαž€αžΆαžš αž“αž·αž„αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž

αž€αžΆαžšαžŸαž αž€αžΆαžšαž‚αŸ’αž“αžΆαž›αžΎαžŸαŸ†αžŽαžΎαžšαž‘αžΆαž‰αž‡αžΆαž‰αžΉαž€αž‰αžΆαž”αŸ‹αž“αžΆαŸ†αž‘αŸ…αžšαž€αž€αžΆαžšαž„αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αŸ” αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆ αž“αŸαŸ‡β€‹αž‡αžΆβ€‹αž›αž‘αŸ’αž’αž•αž›β€‹αž“αŸƒβ€‹αž€αžΆαžšβ€‹αž–αž·αž“αž·αžαŸ’αž™β€‹αž€αžΌαžŠ αž¬β€‹αž€αžΆαžšβ€‹αž–αž·αž—αžΆαž€αŸ’αžŸαžΆ αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž€αŸ’αž“αž»αž„β€‹αžœαž‚αŸ’αž‚β€‹αžŸαž·αž€αŸ’αžŸαžΆβ€‹αžšαž”αžŸαŸ‹β€‹αž™αžΎαž„ αž™αžΎαž„β€‹αž“αžΉαž„β€‹αž’αŸ’αžœαžΎβ€‹αž‡αžΆβ€‹αž‚αŸ†αžšαžΌβ€‹αžŠαŸ„αž™β€‹αž”αž“αŸ’αžαŸ‚αž˜β€‹αž’αžΆαžαž»β€‹αžαŸ’αž˜αžΈβ€‹αž‘αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž”αž‰αŸ’αž‡αžΈβ€‹αž‡αŸ†αž αžΆαž“ CI αžšαž”αžŸαŸ‹β€‹αž™αžΎαž„αŸ”

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž“αžΉαž„αž€αžΆαžšαž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž˜αž½αž™αž…αŸ†αž“αž½αž“αŸ” αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αž›αžΎαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž˜αžΆαž“αž—αžΆαž–αžαž»αžŸαž”αŸ’αž›αŸ‚αž€αž‚αŸ’αž“αžΆ αž αžΎαž™αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž αŸ…αžαžΆαž’αŸ’αžœαžΈαž˜αž½αž™αžŠαžΌαž…αž‡αžΆ "αž‚αŸ„αž›αž€αžΆαžšαžŽαŸαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈαž€αžΆαžšαžšαž½αž˜αž…αŸ†αžŽαŸ‚αž€"αŸ” αž™αžΎαž„αž“αžΉαž„αžšαž€αŸ’αžŸαžΆαžœαžΆαž±αŸ’αž™αžŸαžΆαž˜αž‰αŸ’αž‰ αž αžΎαž™αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž“αŸ’αž‘αžΆαžαŸ‹αž“αžΈαž˜αž½αž™αŸ—αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž‰αŸ’αž‡αžΈαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ”

αž“αŸ…αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž·αž…αŸ’αž…αž€αžΆαžš αžŸαžΌαž˜αžŸαžΆαž€αž›αŸ’αž”αž„αž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž‡αžΆαž˜αž»αž“αžŸαž·αž“αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αžŠαŸ†αž‘αžΎαž„αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ” pre-commit αž‘αŸ†αž–αž€αŸ‹αž˜αž»αž“αž“αŸαŸ‡ αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŠαŸ‚αž›αž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αžαŸ’αž˜αžΈαž“αžΉαž„αžαŸ’αžšαžΌαžœαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž“αžΉαž„αž”αžšαžΆαž‡αŸαž™ αž αžΎαž™αž‚αŸ’αž˜αžΆαž“αž’αŸ’αžœαžΈαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαž‘αžΎαž™αŸ” αž…αŸ†αžŽαžΆαŸ†αžαžΆαž“αŸαŸ‡αž‡αžΆαžšαž”αŸ€αž”αžŠαŸ‚αž›αž™αžΎαž„αžŠαžΉαž„αžαžΆαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžšαž”αžŸαŸ‹αž™αžΎαž„αž–αž·αžαž‡αžΆαž€αŸ†αž–αž»αž„αžŸαžΆαž€αž›αŸ’αž”αž„αž’αŸ’αžœαžΈαž˜αž½αž™αŸ” αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‡αžΆαž˜αž½αž™αž€αžΌαžŠαž˜αž»αž“αž–αŸαž›αž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž αž€αžΆαžšαž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž’αžΆαž…αž˜αžΆαž“αž“αŸαž™αžαžΆαž›αŸαžαž€αžΌαžŠαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαžΌαž…αž€αžΆαžšαžšαŸ†αž–αžΉαž„αž‘αž»αž€ αž¬αžαžΆαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž–αž·αžαž‡αžΆαž˜αž·αž“αž”αžΆαž“αžŸαžΆαž€αž›αŸ’αž”αž„αž’αŸ’αžœαžΈαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž˜αž·αž“αž”αžΆαž“αžŸαžšαžŸαŸαžšαž€αžΆαžšαž”αŸ’αžšαž›αž„αžαžΆαŸ†αž„αž–αžΈαžŠαŸ†αž”αžΌαž„αž‘αŸ αž™αžΎαž„αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž—αŸ’αž›αŸαž…αž’αŸ†αž–αžΈαžœαžΆαž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„ αž–αŸ’αžšαŸ„αŸ‡αž‚αŸ’αž˜αžΆαž“αž’αŸ’αžœαžΈαž’αžΆαž…αžšαŸ†αž›αžΉαž€αž™αžΎαž„αž–αžΈαžœαžΆαž”αžΆαž“αž‘αŸαŸ”

αžŸαžΆαž€αž›αŸ’αž”αž„αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž‡αŸ†αžšαž»αž‰ (TDD)

TDD αžŽαŸ‚αž“αžΆαŸ†αž±αŸ’αž™αžŸαžšαžŸαŸαžšαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž˜αž»αž“αž–αŸαž›αžŸαžšαžŸαŸαžšαž€αžΌαžŠαŸ” αž›αŸ†αž αžΌαžšαž€αžΆαžšαž„αžΆαžšαž’αž˜αŸ’αž˜αžαžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎ TDD αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ”

  1. αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαŸ”
  2. αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αž αžΎαž™αž’αžΆαž“αžΆαžαžΆαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžαŸ’αž˜αžΈαž”αžšαžΆαž‡αŸαž™αŸ”
  3. αžŸαžšαžŸαŸαžšαž€αžΌαžŠαŸ”
  4. αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΆαž€αžŠαžαžΆαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αŸ”
  5. αž€αŸ‚αž€αžΌαžŠαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”
  6. αž’αŸ’αžœαžΎαž˜αŸ’αžαž„αž‘αŸ€αžαŸ”

αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž›αž‘αŸ’αž’αž•αž›αž“αŸƒαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŠαŸ‚αž›αž”αžšαžΆαž‡αŸαž™αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αž‡αžΆαž–αžŽαŸŒαž€αŸ’αžšαž αž˜ αž αžΎαž™αž’αŸ’αž“αž€αžŠαŸ‚αž›αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αž‡αžΆαž–αžŽαŸŒαž”αŸƒαžαž„ αžœαžŠαŸ’αžαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαžŸαŸ’αž‚αžΆαž›αŸ‹αžαžΆαž‡αžΆ red-green-refactorαŸ”

️ αž€αž·αž…αŸ’αž…αž€αžΆαžš

αžŠαŸ†αž”αžΌαž„ αžŸαžΆαž€αž›αŸ’αž”αž„αž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž αž αžΎαž™αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž–αž½αž€αž‚αŸαž”αžšαžΆαž‡αŸαž™ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž”αž“αŸ’αžαŸ‚αž˜ αž“αž·αž„αž”αž‰αŸ’αž…αžΌαž›αž’αžαŸ’αžαž”αž‘αž“αŸƒαž”αž‰αŸ’αž‡αžΈαž‡αŸ†αž αžΆαž“ CI αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αŸ” αž’αŸ’αž“αž€αž“αžΉαž„αžƒαžΎαž‰αžαžΆαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž€αŸ†αž–αž»αž„αž†αŸ’αž›αž„αž€αžΆαžαŸ‹ ("αž”αŸƒαžαž„") αŸ”
αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž”αŸ„αŸ‡αž•αŸ’αžŸαžΆαž™αž›αŸαžαž€αžΌαžŠαžαŸ’αž˜αžΈαž‘αŸ…αž€αžΆαž“αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„αž–αžΈαž…αž˜αŸ’αž„αžΆαž™ αž αžΎαž™αž˜αžΎαž›αž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹ GitHub αž“αŸ…αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸƒαž€αžΆαžšαž–αž·αž—αžΆαž€αŸ’αžŸαžΆαžŸαŸ†αžŽαžΎαž‘αžΆαž‰ αž“αž·αž„αž€αžΆαžšαž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αžŸαŸ’αžαžΆαž“αž—αžΆαž– PR αŸ”

  1. αž”αŸ’αžαžΌαžšαž‘αŸ…αžŸαžΆαžαžΆ feature.
  2. αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž‘αŸ… 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);
    });

  3. αžŸαžΆαž€αž›αŸ’αž”αž„αž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎ pre-commit αž‘αŸ†αž–αž€αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„ αž€αžΆαžšαž”αŸ‰αž»αž“αž”αŸ‰αž„αž“αžΉαž„αž”αžšαžΆαž‡αŸαž™αŸ”
  4. αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž”αž“αŸ’αžαŸ‚αž˜αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž‘αŸ… 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. 
  5. αž’αŸ’αžœαžΎβ€‹αž“αž·αž„β€‹αž’αŸ’αžœαžΎβ€‹αž€αžΆαžšβ€‹αž•αŸ’αž›αžΆαžŸαŸ‹β€‹αž”αŸ’αžαžΌβ€‹αžšβ€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“β€‹αŸ”
  6. αž”αŸ’αžšαž€αžΆαžŸαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αŸ…αžŸαžΆαžαžΆ 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 αž–αž·αžαž‡αžΆαž’αžΆαž…αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αž·αž“αž˜αžΆαž“αž€αžΆαžšαž”αŸ‰αŸ‡αž‘αž„αŸ’αž‚αž·αž…αŸ” Alas αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžšαž”αžŸαŸ‹αž™αžΎαž„ αžŸαžΆαžαžΆαž‘αžΆαŸ†αž„αž–αžΈαžšαž˜αžΆαž“αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αŸ’αžšαž€αž½αžαž”αŸ’αžšαž‡αŸ‚αž„αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš ci.md. αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαžŸαŸ’αž‚αžΆαž›αŸ‹αžαžΆαž‡αžΆαž‡αž˜αŸ’αž›αŸ„αŸ‡αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆ αž αžΎαž™αž™αžΎαž„αžαŸ’αžšαžΌαžœαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžœαžΆαžŠαŸ„αž™αžŠαŸƒαŸ”

αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆ αž¬αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžœαž·αž‰

αž”αž‰αŸ’αž…αžΌαž›αž…αžΌαž›αž‚αŸ’αž“αžΆ

  • αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž”αž“αŸ’αžαŸ‚αž˜ αž“αž·αž„αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž”αŸ’αžšαžœαžαŸ’αžαž·αž€αžΆαžšαž„αžΆαžšαŸ”
    • αžšαž€αŸ’αžŸαžΆαž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαžŠαžΎαž˜αž“αŸƒαžŸαžΆαžαžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αžαŸ’αžšαžΆαž–αŸαž›αžœαŸαž›αžΆαžŠαžΎαž˜ αž“αž·αž„αž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαŸ”
    • αžšαž€αŸ’αžŸαžΆαž‘αž»αž€ SHA αž“αŸƒαž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αž·αž„αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž–αž½αž€αž‚αŸαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž–αž·αž—αžΆαž€αŸ’αžŸαžΆαžŸαŸ†αžŽαžΎαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαŸ”
  • αž‘αžΆαž˜αž‘αžΆαžšαžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‡αž˜αŸ’αž›αŸ„αŸ‡αžαŸ‚αž˜αŸ’αžαž„αŸ”
  • αž’αŸ’αžœαžΎαž±αŸ’αž™αžŸαžΆαž…αŸ‹αžšαžΏαž„αž˜αž·αž“αžαŸ’αžšαž„αŸ‹αŸ”
    • αžšαžΏαž„β€‹αž’αžΆαž…β€‹αž–αž·αž”αžΆαž€β€‹αž’αžΆαž“β€‹αžŠαŸ„αž™αžŸαžΆαžšβ€‹αž…αŸ†αž“αž½αž“β€‹αžŸαžΆαžαžΆβ€‹αž…αŸ’αžšαžΎαž“ (αž“αžΉαž€β€‹αžƒαžΎαž‰β€‹αžŠαž›αŸ‹β€‹αžαŸ’αžŸαŸ‚ IDE)αŸ”
    • αž’αŸ’αžœαžΎαž±αŸ’αž™αž€αžΆαžšαž€αŸ‚αž€αŸ†αž αž»αžŸαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž€αžΆαž“αŸ‹αžαŸ‚αž–αž·αž”αžΆαž€ ឧ. git bisect αž˜αž·αž“αžŸαžΌαžœαž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸ - αžœαžΆαž“αžΉαž„αžšαž€αžƒαžΎαž‰αžαŸ‚αž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ”

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž”αŸ’αžšαžΆαž€αŸ‹αž‘αžΎαž„αžœαž·αž‰

  • αž€αžΆαžšβ€‹αž…αžΆαž€αŸ‹β€‹αž‘αžΎαž„αžœαž·αž‰β€‹αž”αŸ’αžšαž–αŸ’αžšαžΉαžαŸ’αžβ€‹αž–αžΈβ€‹αžŸαžΆαžαžΆβ€‹αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“β€‹αž“αŸ…β€‹αž›αžΎβ€‹αž€αŸ†αž–αžΌαž›β€‹αž“αŸƒβ€‹αžŸαžΆαžαžΆβ€‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“β€‹αž˜αž½αž™β€‹αž”αž“αŸ’αž‘αžΆαž”αŸ‹β€‹αž–αžΈβ€‹αž˜αž½αž™αž‘αŸ€αžαŸ”
    • αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαžαŸ’αž˜αžΈαž‡αžΆαž˜αž½αž™ SHAs αžαŸ’αž˜αžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαž αžŠαŸ‚αž›αž”αžŽαŸ’αžαžΆαž›αž±αŸ’αž™αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαž“αŸ…αž€αŸ’αž“αž»αž„ GitHub αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž“αžΉαž„αžŸαŸ†αžŽαžΎαž‘αžΆαž‰αžŠαžΎαž˜ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž˜αžαž·αž™αŸ„αž”αž›αŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž“αŸ„αŸ‡αž‘αŸαŸ”
    • αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžŸαŸ†αž‘αžΎαž„αžœαž·αž‰ αž“αž·αž„αž€αŸ‚αž”αŸ’αžšαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž¬αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž‘αŸ…αž‡αžΆαž˜αž½αž™αŸ”
  • αž‡αž˜αŸ’αž›αŸ„αŸ‡αž‡αžΆαž…αŸ’αžšαžΎαž“αž’αžΆαž…αž“αžΉαž„αžαŸ’αžšαžΌαžœαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αŸ”
  • αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžšαž€αŸ’αžŸαžΆαžŸαžΆαž…αŸ‹αžšαžΏαž„αž›αžΈαž“αŸαž’αŸŠαŸ‚αžšαŸ”
    • αžŸαžΆαž…αŸ‹αžšαžΏαž„αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž’αžΆαž“ αžŠαžšαžΆαž”αžŽαžΆαžœαžΆαž˜αž·αž“αž‘αžΆαž“αŸ‹αžœαŸ‚αž„αž–αŸαž€ αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž αŸαžαž»αž•αž›αžŸαž˜αž αŸαžαž»αž•αž›αŸ”
    • αž€αžΆαžšαž€αŸ‚αž€αŸ†αž αž»αžŸαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· αž“αž·αž„αž€αžΆαžšαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαž‚αžΊαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž‡αžΆαž„αž”αž“αŸ’αžαž·αž…αŸ– αž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“ git bisectαž’αžΆαž…αž’αŸ’αžœαžΎαž±αŸ’αž™ rollbacks αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αž”αžΆαžŸαŸ‹ αž“αž·αž„αž’αžΆαž…αž–αŸ’αž™αžΆαž€αžšαžŽαŸαž”αžΆαž“αŸ”
  • αžαž˜αŸ’αžšαžΌαžœβ€‹αž±αŸ’αž™β€‹αž˜αžΆαž“β€‹αž€αžΆαžšβ€‹αž”αŸ„αŸ‡β€‹αž–αž»αž˜αŸ’αž–β€‹αž•αŸ’αžŸαžΆαž™β€‹αžŸαžΆαžαžΆβ€‹αžŠαŸ‚αž›β€‹αž˜αžΆαž“β€‹αž€αžΆαžšβ€‹αž’αŸ’αžœαžΎβ€‹αž…αŸ†αžŽαžΆαž€β€‹αžŸαŸ’αžšαž»αž€β€‹αžŠαŸ„αž™β€‹αž˜αžΆαž“β€‹αž‘αž„αŸ‹ --force αž“αŸ…αž–αŸαž›αž”αŸ’αžšαžΎαž‡αžΆαž˜αž½αž™αžŸαŸ†αžŽαžΎαž‘αžΆαž‰αŸ”

αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆ αž€αŸ’αžšαž»αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž™αž›αŸ‹αž–αŸ’αžšαž˜αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžšαŸ’αžαžŠαžΌαž…αž‚αŸ’αž“αžΆαž‡αžΆαž“αž·αž…αŸ’αž… αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž–αž½αž€αž‚αŸαžαŸ’αžšαžΌαžœαž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαŸ” αž“αŸαŸ‡αž’αžΆαž…αž‡αžΆαž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆ "αž”αžšαž·αžŸαž»αž‘αŸ’αž’" αž¬αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž "αž”αžšαž·αžŸαž»αž‘αŸ’αž’" αž“αŸ…αž›αžΎαž€αŸ†αž–αžΌαž› αž¬αž’αŸ’αžœαžΈαž˜αž½αž™αž“αŸ…αž…αž“αŸ’αž›αŸ„αŸ‡ αžŠαžΌαž…αž‡αžΆαž€αžΆαžšαž’αŸ’αžœαžΎαž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž“αŸ…αž›αžΎαž€αŸ†αž–αžΌαž› (git rebase -i) αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαžΆαžαžΆαžŠαŸ‚αž›αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ„αŸ‡αž•αŸ’αžŸαžΆαž™αž‘αŸ…αžƒαŸ’αž›αžΆαŸ†αž„αžŸαžΆαž’αžΆαžšαžŽαŸˆ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαžΆαžαžΆ "αžŸαžΆαž’αžΆαžšαžŽαŸˆ" αŸ”

αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαŸ”

️ αž€αž·αž…αŸ’αž…αž€αžΆαžš

  1. αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΆαž€αžŠαžαžΆαž›αŸαžαž€αžΌαžŠαžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αž“αž»αž„αžŸαžΆαžαžΆαž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€ master αž”αžΆαž“αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž–αžΈαžƒαŸ’αž›αžΆαŸ†αž„αž–αžΈαž…αž˜αŸ’αž„αžΆαž™αŸ”
  2. αž”αŸ’αžαžΌαžšαž‘αŸ…αžŸαžΆαžαžΆ feature.
  3. αž•αŸ’αžαž½αž…αž•αŸ’αžαžΎαž˜αž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™αžŸαžΆαžαžΆ master. αž‡αž˜αŸ’αž›αŸ„αŸ‡β€‹αžŠαŸ‚αž›β€‹αžšαž½αž˜β€‹αž”αž‰αŸ’αž…αžΌαž›β€‹αž‚αŸ’αž“αžΆβ€‹αžŠαŸ„αž™β€‹αžŸαžΆαžšβ€‹αžαŸ‚β€‹αž€αžΆαžšβ€‹αž•αŸ’αž›αžΆαžŸαŸ‹β€‹αž”αŸ’αžαžΌβ€‹αžšβ€‹αž‚αžΌβ€‹αž”αŸ’αžšαž‡αŸ‚αž„β€‹αž‘αŸ…β€‹αž“αžΉαž„ ci.md.
  4. αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‡αž˜αŸ’αž›αŸ„αŸ‡αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αž”αž‰αŸ’αž‡αžΈαž‡αŸ†αž αžΆαž“ CI αžšαž”αžŸαŸ‹αž™αžΎαž„αž‘αžΆαŸ†αž„αž–αžΈαžš αž“αž·αž„αž€αŸ†αžŽαžαŸ‹αž…αŸ†αžŽαžΆαŸ†αž’αŸ†αž–αžΈαžœαžΆαž“αŸ…αžαŸ‚αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αŸ”
  5. αž”αŸ„αŸ‡αž•αŸ’αžŸαžΆαž™αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž‘αŸ…αžŸαžΆαžαžΆαž–αžΈαž…αž˜αŸ’αž„αžΆαž™ feature.
  6. αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸƒαžŸαŸ†αžŽαžΎαžšαž‘αžΆαž‰αž“αŸ…αž€αŸ’αž“αž»αž„ 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.

️ αž€αž·αž…αŸ’αž…αž€αžΆαžšαŸ– αž’αž“αž»αž˜αŸαžαžŸαŸ†αžŽαžΎαžšαž‘αžΆαž‰ "αž€αžΆαžšαž–αž·αž“αž·αžαŸ’αž™αž‡αŸ†αž αžΆαž“"

  1. αž”αžΎαž€αžŸαŸ†αžŽαžΎαž‘αžΆαž‰αŸ”
  2. αž…αž»αž… "αž”αž‰αŸ’αž…αžΌαž›αžŸαŸ†αžŽαžΎαž‘αžΆαž‰" αŸ”
  3. αž…αž»αž… "αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆ" αŸ”
  4. αž…αž»αž… "αž›αž»αž”αžŸαžΆαžαžΆ" αž–αŸ’αžšαŸ„αŸ‡αž™αžΎαž„αž›αŸ‚αž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαžœαžΆαž‘αŸ€αžαž αžΎαž™αŸ”

αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžƒαŸ’αž›αžΆαŸ†αž„αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž“αŸ…αž–αŸαž›αž“αŸαŸ‡
αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž’αž˜αŸ’αž˜αžαžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹

αž€αŸ†αž αž»αžŸαž•αž›αž·αžαž•αž›

αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž“αž·αž™αžΆαž™αžαžΆ "αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž αžΆαž‰αž–αžΈαžœαžαŸ’αžαž˜αžΆαž“αž“αŸƒαž€αŸ†αž αž»αžŸαž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αž»αŸ†αž”αž„αŸ’αž αžΆαž‰αž’αžœαžαŸ’αžαž˜αžΆαž“αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸ" αŸ” αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž™αžΎαž„αž˜αžΆαž“αž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„ αž αžΎαž™αž–αž½αž€αž‚αŸαž˜αž·αž“αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αž™αžΎαž„αž“αžΌαžœαž€αŸ†αž αž»αžŸαž€αŸαžŠαŸ„αž™ αž€αŸαž€αŸ†αž αž»αžŸαžŠαŸαž’αžΆαž€αŸ’αžšαž€αŸ‹αž˜αž½αž™αž”αžΆαž“αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž•αž›αž·αžαž€αž˜αŸ’αž˜αŸ”

αž€αŸ’αž“αž»αž„β€‹αžŸαŸαžŽαžΆαžšαžΈαž™αŸ‰αžΌβ€‹αž”αŸ‚αž”β€‹αž“αŸαŸ‡ αž™αžΎαž„β€‹αžαŸ’αžšαžΌαžœβ€‹αžαŸ‚αžšαž€αŸ’αžŸαžΆαŸ–

  • αž’αŸ’αžœαžΈαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž•αž›αž·αžαž€αž˜αŸ’αž˜;
  • αž€αžΌαžŠαž“αŸ…αž€αŸ’αž“αž»αž„αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™ master αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αŸ†αž αž»αžŸαžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž’αžΆαž…αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αžΆαžšαž„αžΆαžšαžαŸ’αž˜αžΈαŸ”

αžαžΎβ€‹αžαŸ’αž‰αž»αŸ†β€‹αž‚αž½αžšβ€‹αžαŸ’αžšαž‘αž”αŸ‹β€‹αž¬β€‹αž‡αž½αžŸαž‡αž»αž›β€‹αžœαžΆβ€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž€αŸ†αžŽαŸ‚β€‹αž”αž“αŸ’αž‘αžΆαž”αŸ‹β€‹?

αž€αžΆαžšαžαŸ’αžšαž›αž”αŸ‹αž˜αž€αžœαž·αž‰αž‚αžΊαž‡αžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸƒαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αŸ†αžŽαŸ‚αž˜αž»αž“αžŠαŸ‚αž›αž‚αŸαžŸαŸ’αž‚αžΆαž›αŸ‹αžαžΆαž›αŸ’αž’αž‘αŸ…αž•αž›αž·αžαž€αž˜αŸ’αž˜ αž“αž·αž„αžαŸ’αžšαž‘αž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαž–αŸ’αžšαžΉαžαŸ’αžαžŠαŸ‚αž›αž˜αžΆαž“αž€αŸ†αž αž»αžŸαŸ” "αž‡αž½αžŸαž‡αž»αž›αž‘αŸ…αž˜αž»αž" αž‚αžΊαž‡αžΆαž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αž“αŸƒαž€αžΆαžšαž‡αž½αžŸαž‡αž»αž›αž‘αŸ… master αž“αž·αž„αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αŸ†αžŽαŸ‚αžαŸ’αž˜αžΈαž±αŸ’αž™αž”αžΆαž“αž†αžΆαž”αŸ‹αžαžΆαž˜αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αŸ” αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚ APIs αž“αž·αž„αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αžΌαžŠαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž”αž“αŸ’αž αž“αž·αž„αž€αžΆαžšαž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž›αŸ’αž’ αž€αžΆαžšαžœαž·αž›αžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαž˜αžΆαž“αž€αžΆαžšαž›αŸ†αž”αžΆαž€ αž“αž·αž„αž”αŸ’αžšαžαž»αž™αž”αŸ’αžšαžαžΆαž“αž‡αžΆαž„αž€αžΆαžšαž‡αž½αžŸαž‡αž»αž›αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαŸ‚αž”αž“αŸ’αž‘αžΆαž”αŸ‹αŸ”

αžŠαŸ„αž™αžŸαžΆαžšαž€αžΆαžšαžœαž·αž›αžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰αž˜αž·αž“αž˜αžΆαž“αž‚αŸ’αžšαŸ„αŸ‡αžαŸ’αž“αžΆαž€αŸ‹αž’αŸ’αžœαžΈαž‘αŸαž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ αž™αžΎαž„αž“αžΉαž„αž‘αŸ…αž•αŸ’αž›αžΌαžœαž“αŸαŸ‡ αž–αŸ’αžšαŸ„αŸ‡αžœαžΆαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž™αžΎαž„

  • αž‡αž½αžŸαž‡αž»αž›αž€αŸ†αž αž»αžŸαž›αžΎαž•αž›αž·αžαž•αž›αž±αŸ’αž™αž”αžΆαž“αž†αžΆαž”αŸ‹αžαžΆαž˜αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“;
  • αž”αž„αŸ’αž€αžΎαžαž›αŸαžαž€αžΌαžŠ master αž—αŸ’αž›αžΆαž˜αŸ—αžŸαž˜αžšαž˜αŸ’αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αžΆαžšαž„αžΆαžšαžαŸ’αž˜αžΈαŸ”

️ αž€αž·αž…αŸ’αž…αž€αžΆαžš

  1. αž”αŸ’αžαžΌαžšαž‘αŸ…αžŸαžΆαžαžΆ master αž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€αŸ”
  2. αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αžƒαŸ’αž›αžΆαŸ†αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž–αžΈαžƒαŸ’αž›αžΆαŸ†αž„αž–αžΈαž…αž˜αŸ’αž„αžΆαž™αŸ”
  3. αžαŸ’αžšαž‘αž”αŸ‹αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž PR αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆ αž‡αŸ†αž αžΆαž“αž–αž·αž“αž·αžαŸ’αž™αž‘αžΎαž„αžœαž·αž‰ Π² master.
  4. αž”αŸ„αŸ‡αž•αŸ’αžŸαžΆαž™αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αŸ…αžƒαŸ’αž›αžΆαŸ†αž„αž–αžΈαž…αž˜αŸ’αž„αžΆαž™αŸ”

αž“αŸαŸ‡β€‹αž‡αžΆβ€‹αž”αŸ’αžšαžœαžαŸ’αžαž·β€‹αž“αŸƒβ€‹αžƒαŸ’αž›αžΆαŸ†αž„β€‹αžŠαŸ‚αž›β€‹αž˜αžΆαž“β€‹αž€αžΆαžšβ€‹αžŠαžΆαž€αŸ‹β€‹αž”αž‰αŸ’αž…αžΌαž›β€‹αž‚αŸ’αž“αžΆβ€‹αžαŸ’αžšαž‘αž”αŸ‹β€‹αž˜αž€β€‹αžœαž·αž‰αŸ”
αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž’αž˜αŸ’αž˜αžαžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹

αž€αŸ’αžšαž»αž˜

# ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ΡΡŒ Π½Π° Π²Π΅Ρ‚ΠΊΡƒ 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. αžŠαŸ†αžŽαžΉαž„β€‹αž’αžΆαž€αŸ’αžšαž€αŸ‹β€‹αž‚αžΊβ€‹αžαžΆβ€‹αž”αž‰αŸ’αž‡αžΈβ€‹αžŠαŸβ€‹αž˜αžΆαž“β€‹αžαž˜αŸ’αž›αŸƒβ€‹αž“αŸƒβ€‹αž‡αŸ†αž αžΆαž“β€‹αžŸαž˜αžΆαž αžšαžŽαž€αž˜αŸ’αž˜β€‹αž”αž“αŸ’αžβ€‹αžšαž”αžŸαŸ‹β€‹αž™αžΎαž„β€‹αž€αŸβ€‹αž”αžΆαžαŸ‹β€‹αž‘αŸ…β€‹αžŠαŸ‚αžšαŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžαžΆαž˜αž§αžαŸ’αžŠαž˜αž‚αžαž· αž™αžΎαž„αžαŸ’αžšαžΌαžœαž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž€αŸ‚αžαž˜αŸ’αžšαžΌαžœαž…αŸ†αž–αŸ„αŸ‡ commits αž–αžΈ feature αž αžΎαž™αž”αž‰αŸ’αž‡αžΌαž“αž–αž½αž€αž‚αŸαž‘αŸ… master αžšαž½αž˜αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž‡αž½αžŸαž‡αž»αž›αŸ”

αž™αžΎαž„αž’αžΆαž…αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαžαžΆαž˜αžœαž·αž’αžΈαž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαŸ–

  • αžαŸ’αžšαž‘αž”αŸ‹β€‹αž€αžΆαžšβ€‹αž”αŸ’αžšαž–αŸ’αžšαžΉαžαŸ’αžβ€‹αžŠαŸ‚αž›β€‹αž˜αž·αž“β€‹αž’αŸ’αžœαžΎβ€‹αž€αžΆαžšβ€‹αž”αž‰αŸ’αž…αžΌαž›β€‹αž‚αŸ’αž“αžΆαŸ” feature с master;
  • αž•αŸ’αž›αžΆαžŸαŸ‹αž‘αžΈβ€‹αž”αŸ’αžšαž–αŸ’αžšαžΉαžαŸ’αžβ€‹αž–αžΈβ€‹αž’αžαžΈαž feature.

αž€αŸ’αžšαž»αž˜αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαž”αŸ’αžšαžΎαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž™αžΎαž„αž“αžΉαž„αž•αŸ’αž›αžΆαžŸαŸ‹αž‘αžΈαž€αžΆαžšαžŸαž“αŸ’αž™αžΆαžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž‘αŸ…αž€αžΆαž“αŸ‹αžŸαžΆαžαžΆαžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αž˜αž½αž™ αž αžΎαž™αž”αž„αŸ’αž€αžΎαžαžŸαŸ†αžŽαžΎαž‘αžΆαž‰αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαžΆαžαžΆαžαŸ’αž˜αžΈαž“αŸαŸ‡αŸ”

️ αž€αž·αž…αŸ’αž…αž€αžΆαžš

  1. αž”αž„αŸ’αž€αžΎαžβ€‹αžαŸ’αžŸαŸ‚β€‹αžŠαŸ‚αž›β€‹αž αŸ…β€‹αžαžΆβ€‹ feature-fix αž αžΎαž™αž”αŸ’αžαžΌαžšαž‘αŸ…αžœαžΆαŸ”
  2. αž•αŸ’αž‘αŸαžšαž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž–αžΈαž’αžαžΈαžαžŸαžΆαžαžΆ feature αž‘αŸ…αž€αžΆαž“αŸ‹αžαŸ’αžŸαŸ‚αžαŸ’αž˜αžΈαŸ” αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‡αž˜αŸ’αž›αŸ„αŸ‡αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαžŠαŸ‚αž›αž”αžΆαž“αž€αžΎαžαž‘αžΎαž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αž’αŸ’αžœαžΎαž…αŸ†αžŽαžΆαž€αžŸαŸ’αžšαž»αž€αŸ”

    αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž’αž˜αŸ’αž˜αžαžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹

  3. αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžαŸ†αžšαŸ‚αžαŸ†αžšαž„αŸ‹αž‘αŸ… ci.test.js:

    it('does not contain the sneaky bug', () => {
    expect( /.*sneakys+bug.*/gi.test(fileContents)).toBe(false);
    });

  4. αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαžΆαž€αžŠαžαžΆαž–αž½αž€αž‚αŸαž˜αž·αž“αž”αžšαžΆαž‡αŸαž™αŸ”
  5. αž›αž»αž”αž’αžαŸ’αžαž”αž‘ "αž‡αžΆαž˜αž½αž™αž€αŸ†αž αž»αžŸαž†αŸ’αž‚αž„" αž“αŸ…αž€αŸ’αž“αž»αž„ ci.md.
  6. αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž αž“αž·αž„αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αž‰αŸ’αž‡αžΈαž‡αŸ†αž αžΆαž“αž‘αŸ…αž€αžΆαž“αŸ‹αž›αž·αž”αž·αž€αŸ’αžšαž˜ αž αžΎαž™αž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαž–αž½αž€αž‚αŸαŸ”
  7. αž”αŸ„αŸ‡αž•αŸ’αžŸαžΆαž™αžŸαžΆαžαžΆαž‘αŸ…αžƒαŸ’αž›αžΆαŸ†αž„αž–αžΈαž…αž˜αŸ’αž„αžΆαž™αŸ”

αž’αŸ’αž“αž€αž‚αž½αžšαžαŸ‚αž”αž‰αŸ’αž…αž”αŸ‹αžŠαŸ„αž™αž’αŸ’αžœαžΈαž˜αž½αž™αžŸαŸ’αžšαžŠαŸ€αž„αž“αžΉαž„αž“αŸαŸ‡αŸ–
αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž’αž˜αŸ’αž˜αžαžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹

αž€αŸ’αžšαž»αž˜

# Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π²Π΅Ρ‚ΠΊΡƒ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ 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 αž–αžΈαž€αžΆαžšαžŸαŸ’αž“αžΎαžŸαž»αŸ†αž‘αžΆαž‰αŸ”

️ αž€αž·αž…αŸ’αž…αž€αžΆαžš

  1. αž…αž»αž… "αž”αž‰αŸ’αž…αžΌαž›αžŸαŸ†αžŽαžΎαž‘αžΆαž‰" αŸ”
  2. αž…αž»αž… "αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆ" αŸ”
  3. αž…αž»αž… "αž›αž»αž”αžŸαžΆαžαžΆ" αž–αŸ’αžšαŸ„αŸ‡αž™αžΎαž„αž›αŸ‚αž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαžœαžΆαž‘αŸ€αžαž αžΎαž™αŸ”

αž“αŸαŸ‡αž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αž‚αž½αžšαžαŸ‚αž˜αžΆαž“αž“αŸ…αž–αŸαž›αž“αŸαŸ‡αŸ”
αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž’αž˜αŸ’αž˜αžαžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹

αž’αž”αž’αžšαžŸαžΆαž‘αžš!

αž’αŸ’αž“αž€αž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αž‡αŸ†αž αžΆαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž˜αž“αž»αžŸαŸ’αžŸαž‘αžΌαž‘αŸ…αž’αŸ’αžœαžΎαž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž”αž‰αŸ’αž αžΆαžŽαžΆαž˜αž½αž™αž‡αžΆαž˜αž½αž™αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆ αž¬αžŠαžΉαž„αž–αžΈαžšαž”αŸ€αž”αž€αŸ‚αž›αž˜αŸ’αž’αžœαžΆ αžŸαžΌαž˜αž”αž„αŸ’αž€αžΎαžαž”αž‰αŸ’αž αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ αžƒαŸ’αž›αžΆαŸ†αž„αž‡αžΆαž˜αž½αž™αžŸαž˜αŸ’αž—αžΆαžšαŸˆαžŸαž·αž€αŸ’αžŸαžΆ. αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆαž“αŸαŸ‡αž€αŸαž˜αžΆαž“ αž€αŸ†αžŽαŸ‚αž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜ αžŠαŸ„αž™αž”αŸ’αžšαžΎ GitHub Learning Lab αž‡αžΆαžœαŸαž‘αž·αž€αžΆαž˜αž½αž™αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹