ΠΡ ΠΈΠ·ΡΡΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Git Π½ΠΎ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ, ΠΊΠ°ΠΊ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½Π°Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ (Continuous Integration, CI) ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΡΡΠΈ? ΠΠ»ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΈ Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ? ΠΡΠΎΡ ΠΊΡΡΡ Π΄Π°ΡΡ Π²Π°ΠΌ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π½Π°Π²ΡΠΊΠΈ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΠΉ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π½Π° GitHub. ΠΠ°Π½Π½ΡΠΉ ΠΊΡΡΡ Π½Π΅ Π·Π°Π΄ΡΠΌΠ°Π½ ΠΊΠ°ΠΊ Π½Π΅ΠΊΠΈΠΉ Π²ΠΈΠ·Π°ΡΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΎΠΊΠ»ΠΈΠΊΠ°ΡΡ, Π½Π°ΠΏΡΠΎΡΠΈΠ², Π²Ρ Π±ΡΠ΄Π΅ΡΠ΅ ΡΠΎΠ²Π΅ΡΡΠ°ΡΡ ΡΠ΅ ΠΆΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΡΡΠΎ Π»ΡΠ΄ΠΈ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π΄Π΅Π»Π°ΡΡ Π½Π° ΡΠ°Π±ΠΎΡΠ΅, ΡΠ΅ΠΌ ΠΆΠ΅ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΌ ΠΎΠ½ΠΈ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ. Π― Π±ΡΠ΄Ρ ΠΎΠ±ΡΡΡΠ½ΡΡΡ ΡΠ΅ΠΎΡΠΈΡ ΠΏΠΎ ΠΌΠ΅ΡΠ΅ ΠΏΡΠΎΡ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ Π²Π°ΠΌΠΈ ΠΈΠΌΠ΅ΡΡΠΈΡ ΠΊ Π½Π΅ΠΉ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π³ΠΎΠ².
Π§ΡΠΎ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ Π΄Π΅Π»Π°ΡΡ?
ΠΠΎ ΠΌΠ΅ΡΠ΅ ΠΏΡΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ, ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠΏΠΈΡΠΎΠΊ ΡΠΈΠΏΠΎΠ²ΡΡ ΡΠ°Π³ΠΎΠ² CI, ΡΡΠΎ Π΅ΡΡΡ ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡΡ ΡΡΠΎΡ ΡΠΏΠΈΡΠΎΠΊ. ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠΏΠΈΡΠΎΠΊ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΠΎΠ²Π΅ΡΡΠ°ΡΡ, ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ, ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ. Π’Π°ΠΊΠΆΠ΅ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΡΠΎΠΉ Π½Π°Π±ΠΎΡ ΡΠ΅ΡΡΠΎΠ² ΡΡΠΎΠ±Ρ ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΡ Π½Π°Ρ ΠΏΡΠΎΡΠ΅ΡΡ CI ΠΊ ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌΡ.
ΠΡΠΎΡ GIF ΡΡ Π΅ΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΊΠΎΠΌΠΌΠΈΡΡ Π² Π²Π°ΡΠ΅ΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ ΠΏΠΎ ΠΌΠ΅ΡΠ΅ ΠΏΡΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ ΠΏΠΎ ΠΊΡΡΡΡ. ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΡ Π½Π΅Ρ Π½ΠΈΡΠ΅Π³ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΠ³ΠΎ ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΌΠΎΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠ΅.
ΠΡ ΠΏΡΠΎΠΉΠ΄ΡΡΠ΅ ΡΠ°ΠΊΠΈΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ Π΄Π»Ρ CI ΡΡΠ΅Π½Π°ΡΠΈΠΈ:
- Π Π°Π±ΠΎΡΠ° Π½Π°Π΄ ΡΠΈΡΠ΅ΠΉ;
- ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π°Π²ΡΠΎΡΠ΅ΡΡΠΎΠ² Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΠ°ΡΠ΅ΡΡΠ²Π°;
- Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ½ΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ;
- Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ° ΠΏΡΠΈ ΡΠ»ΠΈΡΠ½ΠΈΠΈ Π²Π΅ΡΠ²Π΅ΠΉ (merge conflict);
- ΠΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΠ²Π½ΠΎΠΉ ΡΡΠ΅Π΄Π΅.
Π§ΡΠΎ Π²Ρ ΡΠ·Π½Π°Π΅ΡΠ΅?
ΠΡ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΡΠ²Π΅ΡΠΈΡΡ Π½Π° ΡΠ°ΠΊΠΈΠ΅ Π²ΠΎΠΏΡΠΎΡΡ:
- Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½Π°Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ(CI)?
- ΠΠ°ΠΊΠΈΠ΅ ΡΠΈΠΏΡ Π°Π²ΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΏΡΠΈ CI, ΠΈ Π² ΠΎΡΠ²Π΅Ρ Π½Π° ΠΊΠ°ΠΊΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΎΠ½ΠΈ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ?
- Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ pull request ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π½ΡΠΆΠ½Ρ?
- Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠ΅ΡΠ΅Π· ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ (Test Driven Development, TDD) ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½Π° ΡΠΎΠΎΡΠ½ΠΎΡΠΈΡΡΡ Ρ CI?
- ΠΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡ ΡΠ»ΠΈΡΠ½ΠΈΠ΅(merge) ΠΈΠ»ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΠΎΠ²Π΅ΡΡ (rebase)?
- ΠΡΠΊΠ°ΡΡΠ²Π°ΡΡ ΠΈΠ»ΠΈ ΡΠΈΠ½ΠΈΡΡ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠΈ?
Π― Π²Π½Π°ΡΠ°Π»Π΅ Π²Π΅Π·Π΄Π΅ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΠ» ΡΡΡΠΊΠΈ ΡΠΈΠΏΠ° "pull request", Π½ΠΎ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ΅ΡΠΈΠ» Π²Π΅ΡΠ½ΡΡΡ ΡΡΠ°Π·Ρ Π½Π° Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠΌ Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΌΠ΅ΡΡΠ°Ρ ΡΡΠΎΠ±Ρ ΡΠ½ΠΈΠ·ΠΈΡΡ Π³ΡΠ°Π΄ΡΡ Π±Π΅Π·ΡΠΌΠΈΡ Π² ΡΠ΅ΠΊΡΡΠ΅. Π― ΠΏΠΎΡΠΎΠΉ Π±ΡΠ΄Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ "ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡΠΊΠΈΠΉ ΡΡΡΠΆΠΈΠΊ" Π²ΡΠΎΠ΄Π΅ ΡΡΠ΄Π½ΠΎΠ³ΠΎ Π³Π»Π°Π³ΠΎΠ»Π° "Π·Π°ΠΊΠΎΠΌΠΌΠΈΡΠΈΡΡ" ΡΠ°ΠΌ, Π³Π΄Π΅ Π»ΡΠ΄ΠΈ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π½Π° ΡΠ°Π±ΠΎΡΠ΅ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ.
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½Π°Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ?
ΠΠ΅ΠΏΡΠ΅ΡΡΠ²Π½Π°Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ, ΠΈΠ»ΠΈ CI, ΡΡΠΎ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅Π½ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΡΠ΅Ρ ΡΠ²ΠΎΠΉ ΠΊΠΎΠ΄ Π² ΠΎΠ±ΡΠΈΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Ρ ΠΎΡΡ Π±Ρ ΡΠ°Π· Π² Π΄Π΅Π½Ρ, ΠΏΡΠΈΡΡΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ ΠΏΡΠΈ ΡΡΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ ΠΎΡΡ Π±Ρ ΡΠΎΠ±ΠΈΡΠ°ΡΡΡΡ Π±Π΅Π· ΠΎΡΠΈΠ±ΠΎΠΊ.
Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡ ΡΠ°Π·Π½ΠΎΡΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρ ΡΡΠΎΠ³ΠΎ ΡΠ΅ΡΠΌΠΈΠ½Π°
ΠΡΠ΅Π΄ΠΌΠ΅ΡΠΎΠΌ ΡΠΏΠΎΡΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΡΠΎΡΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ. ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ²Π΅ΡΠΆΠ΄Π°ΡΡ, ΡΡΠΎ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΡΡ ΠΊΠΎΠ΄ Π»ΠΈΡΡ ΡΠ°Π· Π² Π΄Π΅Π½Ρ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎ. Π ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π°, Π³Π΄Π΅ Π²ΡΠ΅ Π±Π΅ΡΡΡ ΡΠ²Π΅ΠΆΠΈΠΉ ΠΊΠΎΠ΄ ΡΡΡΠΎΠΌ ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΡΡΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Π²Π΅ΡΠ΅ΡΠΎΠΌ. Π₯ΠΎΡΡ ΡΡΠΎ ΠΈ ΡΠ°Π·ΡΠΌΠ½ΠΎΠ΅ Π²ΠΎΠ·ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, Π²ΡΡ ΠΆΠ΅ Π² ΡΠ΅Π»ΠΎΠΌ ΡΡΠΈΡΠ°Π΅ΡΡΡ, ΡΡΠΎ Π²Π°ΡΠΈΠ°Π½Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ "ΡΠ°Π· Π² Π΄Π΅Π½Ρ" Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅Π½, ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½, ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΠΊΠΎΠΌΠ°Π½Π΄ ΡΠ°Π·Π½ΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠ².
ΠΡΡΠ³ΠΎΠ΅ Π²ΠΎΠ·ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ C++ Π΄Π°Π²Π½ΠΎ Π½Π΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠ·ΡΠΊ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ ΠΏΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅, ΠΈ ΠΏΡΠΎΡΡΠΎΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ±ΠΎΡΠΊΠΈ Π±Π΅Π· ΠΎΡΠΈΠ±ΠΎΠΊ, ΠΊΠ°ΠΊ ΡΠΏΠΎΡΠΎΠ± Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ, ΡΠ»Π°Π±ΠΎΠ²Π°ΡΠΎ. ΠΠ΅ΠΊΠΈΠΉ Π½Π°Π±ΠΎΡ ΡΠ΅ΡΡΠΎΠ² (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΡ (unit), Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ) ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ. Π Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ, ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²ΠΎ ΡΡΠ³ΠΎΡΠ΅Π΅Ρ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎΠ±Ρ ΡΠ°ΠΊΠΎΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΡΠ»ΠΎ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌ, ΠΈ, Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ "ΡΠ±ΠΎΡΠΊΠ° + ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΠ΅ ΡΠ΅ΡΡΡ", Π²ΠΈΠ΄ΠΈΠΌΠΎ, ΡΡΠ°Π½Π΅Ρ ΠΎΠ±ΡΠ΅ΠΏΡΠΈΠ½ΡΡΡΠΌ, Π΅ΡΠ»ΠΈ ΡΡΠΎ ΡΠΆΠ΅ Π½Π΅ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ.
ΠΠ΅ΠΏΡΠ΅ΡΡΠ²Π½Π°Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΠΉ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈ (Continuous Delivery, CD) ΡΠ΅ΠΌ, ΡΡΠΎ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠ΅Π»ΠΈΠ·-ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠ° ΠΏΠΎΡΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ.
Π‘ΠΏΠΈΡΠΎΠΊ ΡΠ°Π³ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π° ΠΏΡΠΎΡΡΠΆΠ΅Π½ΠΈΠΈ ΠΊΡΡΡΠ°
- Pull in the latest code. Create a branch from
master
. Start working. - Create commits on your new branch. Build and test locally. Pass? Go to the next step. Fail? Fix errors or tests and try again.
- Push to your remote repository or remote branch.
- Create a pull request. Discuss the changes, add more commits as discussion continues. Make tests pass on the feature branch.
- Merge/rebase commits from master. Make tests pass on the merge result.
- Deploy from the feature branch to production.
- If everything is good in production for some period of time, merge changes to master.
οΈ ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ°
Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ Π² Π½Π°Π»ΠΈΡΠΈΠΈ Π½ΡΠΆΠ½ΠΎΠ³ΠΎ ΠΠ
Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠΉΡΠΈ ΡΡΠΎΡ ΠΊΡΡΡ Π²Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ
ΠΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠ±ΠΎΠΉ Git-ΠΊΠ»ΠΈΠ΅Π½Ρ, Π½ΠΎ Ρ Π±ΡΠ΄Ρ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ.
Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Ρ Π²Π°Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Git-ΠΊΠ»ΠΈΠ΅Π½Ρ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡΡ ΡΡΡΠΎΠΊΡ
ΠΡΠ»ΠΈ Ρ Π²Π°Ρ ΠΏΠΎΠΊΠ° Π½Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Git-ΠΊΠ»ΠΈΠ΅Π½Ρ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡΡ ΡΡΡΠΎΠΊΡ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΉΡΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΏΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅
ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΡΡΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ
ΠΠ°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΎΠ·Π΄Π°ΡΡ Π»ΠΈΡΠ½ΡΡ ΠΊΠΎΠΏΠΈΡ(fork)
Π‘Π΄Π΅Π»Π°Π»ΠΈ? ΠΡΠ»ΠΈ Π²Ρ Π½Π΅ ΠΌΠ΅Π½ΡΠ»ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π²Π°Ρ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΠΊΡΡΡΠ° ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ continuous-integration-team-scenarios-students
, ΠΎΠ½ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π² Π²Π°ΡΠ΅ΠΌ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ΅ Π½Π° GitHub, ΠΈ URL Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ
https://github.com/<Π²Π°ΡΠ΅ ΠΈΠΌΡ ΠΏΠΎΠ»Π·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π° GitHub>/continuous-integration-team-scenarios-students
Π― Π±ΡΠ΄Ρ Π½Π°Π·ΡΠ²Π°ΡΡ ΡΡΠΎΡ Π°Π΄ΡΠ΅Ρ ΠΏΡΠΎΡΡΠΎ <URL ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ>
.
Π£Π³Π»ΠΎΠ²ΡΠ΅ ΡΠΊΠΎΠ±ΠΊΠΈ ΠΊΠ°ΠΊ
<ΡΡΡ>
Π±ΡΠ΄ΡΡ ΠΎΠ·Π½Π°ΡΠ°ΡΡ, ΡΡΠΎ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΡΠ°ΠΊΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ ΡΡΠΎ GitHub actions Π²ΠΊΠ»ΡΡΠ΅Π½Ρ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΊΡΡΡΠ°. ΠΡΠ»ΠΈ ΠΎΠ½ΠΈ Π½Π΅ Π±ΡΠ΄ΡΡ Π²ΠΊΠ»ΡΡΠ΅Π½Ρ, ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, Π²ΠΊΠ»ΡΡΠΈΡΠ΅ ΠΈΡ , Π½Π°ΠΆΠ°Π² Π½Π° Π±ΠΎΠ»ΡΡΡΡ ΠΊΠ½ΠΎΠΏΠΊΡ Π² ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π΅ ΡΡΡΠ°Π½ΠΈΡΡ, Π½Π° ΠΊΠΎΡΠΎΡΡΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠΏΠ°ΡΡΡ, ΠΊΠ»ΠΈΠΊΠ½ΡΠ² Actions Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ GitHub.
Π£ Π²Π°Ρ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ ΠΏΡΠΎΠΉΡΠΈ ΠΊΡΡΡ, ΡΠ»Π΅Π΄ΡΡ ΠΌΠΎΠΈΠΌ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡΠΌ, Π΅ΡΠ»ΠΈ GitHub Actions Π½Π΅ Π±ΡΠ΄ΡΡ Π²ΠΊΠ»ΡΡΠ΅Π½Ρ.
ΠΡ Π²ΡΠ΅Π³Π΄Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ GitHub ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ Markdown ΡΡΠΎΠ±Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΠ΅ΠΊΡΡΠ΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΡΠΎΡΠΈΠ½ΡΠ΅ΠΌ, ΡΡΡ
https://github.com/<your GitHub user name>/continuous-integration-team-scenarios-students/blob/master/ci.md
ΠΡΠΎ ΠΎΡΠ²Π΅ΡΡ
Π₯ΠΎΡΡ Π»ΡΡΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± Π·Π°Π²Π΅ΡΡΠΈΡΡ ΡΡΠΎΡ ΠΊΡΡΡ β ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ Π²ΡΡ ΡΠ²ΠΎΠΈΠΌΠΈ ΡΡΠΊΠ°ΠΌΠΈ, Ρ Π²Π°Ρ ΠΌΠΎΠ³ΡΡ ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ.
ΠΡΠ»ΠΈ Π²Ρ ΡΡΠ²ΡΡΠ²ΡΠ΅ΡΠ΅, ΡΡΠΎ Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΡΠ΅ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ, ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ΄ΡΠΌΠΎΡΡΠ΅ΡΡ Π² Π²Π΅ΡΠΊΡ solution
, ΠΊΠΎΡΠΎΡΠ°Ρ Π΅ΡΡΡ Π² Π²Π°ΡΠ΅ΠΌ ΡΡΠ°ΡΡΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ.
ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, Π½Π΅ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠΉΡΠ΅ ΡΠ»ΠΈΡΠ½ΠΈΠ΅ solution
Π² master
Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΡΡΡΠ°. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡ Π²Π΅ΡΠΊΡ ΡΡΠΎΠ±Ρ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ, ΠΈΠ»ΠΈ ΡΡΠΎΠ±Ρ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡ ΡΠ²ΠΎΠΉ ΠΊΠΎΠ΄ Ρ Π°Π²ΡΠΎΡΡΠΊΠΈΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄Π°ΡΡ Π½Π°ΠΌ Git. ΠΡΠ»ΠΈ Π²Ρ ΡΠΎΠ²ΡΠ΅ΠΌ ΠΏΠΎΡΠ΅ΡΡΠ»ΠΈΡΡ, ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΡΠ²ΠΎΡ Π²Π΅ΡΠΊΡ master
Π½Π° Π²Π΅ΡΠΊΡ solution
ΠΈ Π·Π°ΡΠ΅ΠΌ ΡΠ±ΡΠΎΡΠΈΡΡ ΡΠ²ΠΎΡ ΡΠ°Π±ΠΎΡΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π΄ΠΎ ΡΠΎΠ³ΠΎ ΡΠ°Π³Π° ΠΊΡΡΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π²Π°ΠΌ Π½ΡΠΆΠ΅Π½.
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΡΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ Π²Π°ΠΌ ΡΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½ΡΠΆΠ½ΠΎ
ΠΠ°ΠΊΠΎΠΌΠΌΠΈΡΡΡΠ΅(commit) ΡΠ²ΠΎΠΉ ΠΊΠΎΠ΄
git add .
git commit -m "Backing up my work"
ΠΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
- ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²ΡΠ²Π°ΡΡ
master
Π²master-backup
; - ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²ΡΠ²Π°ΡΡ
solution
Π²master
; - ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΡ(checkout) Π½Π° Π½ΠΎΠ²ΡΡ Π²Π΅ΡΠΊΡ
master
ΠΈ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΡΠ²Π°ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ°Π±ΠΎΡΠ΅ΠΉ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ; - ΡΠΎΠ·Π΄Π°ΡΡ Π²Π΅ΡΠΊΡ "solution" ΠΈΠ· "master" (ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ°Π½ΡΡΠ΅ Π±ΡΠ»Π° "solution") Π½Π° ΡΠ»ΡΡΠ°ΠΉ Π΅ΡΠ»ΠΈ Π²Π°ΠΌ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ Π²Π΅ΡΠΊΠ° "solution".
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>
ΠΡΠ»ΠΈ Π²Ρ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ, Π² ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ Π²Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ Π²Π°ΡΡ Π²Π΅ΡΡΠΈΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π² ΡΠ΄Π°Π»ΡΠ½Π½ΡΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ(remote). ΠΠ΅ Π·Π°Π±ΡΠ΄ΡΡΠ΅ ΡΠ²Π½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΡΠ΄Π°Π»ΡΠ½Π½ΡΡ Π²Π΅ΡΠΊΡ ΠΊΠΎΠ³Π΄Π° Π±ΡΠ΄Π΅ΡΠ΅ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ.
git push --force origin master
ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ° ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ git push --force
. ΠΡΡΠ΄ Π»ΠΈ Π²Ρ ΡΠ°ΡΡΠΎ Π·Π°Ρ
ΠΎΡΠΈΡΠ΅ ΡΠ°ΠΊ ΠΏΠΎΡΡΡΠΏΠ°ΡΡ, Π½ΠΎ Ρ Π½Π°Ρ ΡΡΡ ΠΊΡΠ°ΠΉΠ½Π΅ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΡΠΉ ΡΡΠ΅Π½Π°ΡΠΈΠΉ Ρ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π²Π΄ΠΎΠ±Π°Π²ΠΎΠΊ, ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ, ΡΡΠΎ ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ.
Starting working
ΠΠ°ΡΠ½Π΅ΠΌ ΡΠΎΡΡΠ°Π²Π»ΡΡΡ Π½Π°Ρ ΡΠΏΠΈΡΠΎΠΊ ΡΠ°Π³ΠΎΠ² CI. ΠΠ±ΡΡΠ½ΠΎ Π²Ρ Π½Π°ΡΠΈΠ½Π°Π΅ΡΠ΅ ΡΡΠΎΡ ΡΠ°Π³ Ρ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΈΠ· ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ, Π½ΠΎ Ρ Π½Π°Ρ Π΅ΡΠ΅ Π½Π΅Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΌΡ ΠΊΠ»ΠΎΠ½ΠΈΡΡΠ΅ΠΌ Π΅Π³ΠΎ ΠΈΠ· ΡΠ΄Π°Π»ΡΠ½Π½ΠΎΠ³ΠΎ.
οΈ ΠΠ°Π΄Π°Π½ΠΈΠ΅: ΠΎΠ±Π½ΠΎΠ²ΠΈΡΠ΅ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ, ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π²Π΅ΡΠΊΡ ΠΈΠ· master
, Π½Π°ΡΠ½ΠΈΡΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ
- ΠΠ»ΠΎΠ½ΠΈΡΡΠΉΡΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΠΊΡΡΡΠ° ΠΈΠ·
<URL ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ>
. - ΠΠ°ΠΏΡΡΡΠΈΡΠ΅
npm install
Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΊΡΡΡΠ°; ΠΎΠ½ Π½ΡΠΆΠ΅Π½ Π½Π°ΠΌ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Jest, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΡΠ΅ΡΡΠΎΠ². - Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π²Π΅ΡΠΊΡ ΠΈ Π½Π°Π·ΠΎΠ²ΠΈΡΠ΅ Π΅Π΅
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 ΠΊΠ°ΠΊ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π²ΡΡΠ΅
Π‘ΠΎΠ·Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΊΠΎΠΌΠΌΠΈΡΡ Π² Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΠΊΠ΅, ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠΉΡΠ΅ ΡΠ±ΠΎΡΠΊΡ ΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ
ΠΡ ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌΡΡ Π½Π°ΡΡΡΠΎΠΈΡΡ ΡΠ΅ΡΡΡ ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π»ΠΈΡΡ ΠΏΠ΅ΡΠ΅Π΄ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠΌ, Π° Π·Π°ΡΠ΅ΠΌ Π·Π°ΠΊΠΎΠΌΠΌΠΈΡΠΈΡΡ ΠΊΠΎΠ΄.
Π’ΠΈΠΏΠΎΠ²ΡΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° ΡΠ΅ΡΡΡ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ
- ΠΠΎΠΊΠ°Π»ΡΠ½ΠΎ:
- ΠΠΎΡΡΠΎΡΠ½Π½ΠΎ ΠΈΠ»ΠΈ Π² ΠΎΡΠ²Π΅Ρ Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π°;
- ΠΡΠΈ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠΈ (Π΄Π»Ρ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΠ΅ΠΌΡΡ ΠΈΠ»ΠΈ JIT-ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌΡΡ ΡΠ·ΡΠΊΠΎΠ²);
- ΠΡΠΈ ΡΠ±ΠΎΡΠΊΠ΅ (ΠΊΠΎΠ³Π΄Π° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ);
- ΠΡΠΈ ΠΊΠΎΠΌΠΌΠΈΡΠ΅;
- ΠΡΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ Π² ΠΎΠ±ΡΠΈΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ.
- ΠΠ° ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΡΠ±ΠΎΡΠΊΠΈ(build server) ΠΈΠ»ΠΈ Π² ΡΡΠ΅Π΄Π΅ ΡΠ±ΠΎΡΠΊΠΈ:
- ΠΠΎΠ³Π΄Π° ΠΊΠΎΠ΄ ΠΏΡΠ±Π»ΠΈΠΊΡΠ΅ΡΡΡ Π² ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΡΠ½ΡΡ Π²Π΅ΡΠΊΡ / ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ.
- Π’Π΅ΡΡΠΈΡΡΠ΅ΡΡΡ ΠΊΠΎΠ΄ Π² ΡΡΠΎΠΉ Π²Π΅ΡΠΊΠ΅.
- Π’Π΅ΡΡΠΈΡΡΠ΅ΡΡΡ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠ»ΠΈΡΠ½ΠΈΡ (ΠΎΠ±ΡΡΠ½ΠΎ Ρ
master
). - Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΠ°ΠΏΠ° Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΠΉ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ/ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΠΉ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈ
ΠΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΡΠ΅ΠΌ Π±ΡΡΡΡΠ΅Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π½Π°Π±ΠΎΡ ΡΠ΅ΡΡΠΎΠ², ΡΠ΅ΠΌ ΡΠ°ΡΠ΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ ΡΠ΅Π±Π΅ Π΅Π³ΠΎ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ. Π’ΠΈΠΏΠΈΡΠ½ΠΎΠ΅ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΡΠ°ΠΏΠ°ΠΌ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ°ΠΊ.
- ΠΡΡΡΡΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΠ΅ ΡΠ΅ΡΡΡ β ΠΏΡΠΈ ΡΠ±ΠΎΡΠΊΠ΅, Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ΅ CI
- ΠΠ΅Π΄Π»Π΅Π½Π½ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΠ΅ ΡΠ΅ΡΡΡ, Π±ΡΡΡΡΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ½ΡΠ΅ ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΠ΅ΡΡΡ β ΠΏΡΠΈ ΠΊΠΎΠΌΠΌΠΈΡΠ΅, Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ΅ CI
- ΠΠ΅Π΄Π»Π΅Π½Π½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ½ΡΠ΅ ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΠ΅ΡΡΡ β Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ΅ CI
- Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ, Π½Π°Π³ΡΡΠ·ΠΎΡΠ½ΠΎΠ΅ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΈΠ»ΠΈ Π΄ΠΎΡΠΎΠ³ΠΎΡΡΠΎΡΡΠΈΠ΅ ΡΠ΅ΡΡΡ β Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°Ρ CI/CD, Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΡΠ΅ΠΆΠΈΠΌΠ°Ρ /ΡΡΠ°ΠΏΠ°Ρ /ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°Ρ ΡΠ±ΠΎΡΠΊΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ΅ ΡΠ΅Π»ΠΈΠ·-ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠ° ΠΈΠ»ΠΈ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ Π²ΡΡΡΠ½ΡΡ.
οΈ ΠΠ°Π΄Π°Π½ΠΈΠ΅
Π― ΠΏΡΠ΅Π΄Π»Π°Π³Π°Ρ ΡΠ½Π°ΡΠ°Π»Π° Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ΅ΡΡΡ Π²ΡΡΡΠ½ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ npm test
. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π΄Π°Π²Π°ΠΉΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ git hook Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° Π½Π°ΡΠΈΡ
ΡΠ΅ΡΡΠΎΠ² ΠΏΡΠΈ ΠΊΠΎΠΌΠΌΠΈΡΠ΅. ΠΡΡΡ ΠΎΠ΄Π½Π° Π·Π°Π³Π²ΠΎΠ·Π΄ΠΊΠ°: Git hooks Π½Π΅ ΡΡΠΈΡΠ°ΡΡΡΡ ΡΠ°ΡΡΡΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΊΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½Ρ ΠΈΠ· GitHub Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΎΡΡΠ°Π»ΡΠ½ΡΠΌΠΈ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π°ΠΌΠΈ ΠΊΡΡΡΠ°. Π§ΡΠΎΠ±Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ hook, Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ install_hook.sh
ΠΈΠ»ΠΈ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΉΠ» repo/hooks/pre-commit
Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ .git/hooks/
.
ΠΡΠΈ ΠΊΠΎΠΌΠΌΠΈΡΠ΅ Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΡΠ΅ΡΡΡ, ΠΈ ΠΎΠ½ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ, ΠΏΡΠΈΡΡΡΡΡΠ²ΡΡΡ Π»ΠΈ Π² ΡΠΏΠΈΡΠΊΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ»ΠΎΠ²Π°.
- ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ ΡΠ΅ΡΡΡ Π²ΡΡΡΠ½ΡΡ, Π²ΡΠΏΠΎΠ»Π½ΠΈΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ
npm test
Π² ΠΏΠ°ΠΏΠΊΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΊΡΡΡΠ°. Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ ΡΠ΅ΡΡΡ Π±ΡΠ»ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Ρ. - Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ hook Π½Π° ΠΊΠΎΠΌΠΌΠΈΡ (pre-commit hook), Π·Π°ΠΏΡΡΡΠΈΠ²
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 ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΠΎ Π΄ΠΎΡΡΠΈΠ³Π°Π΅ΡΡΡ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ ΡΠ°Π±ΠΎΡΡ Π»ΠΈΠ±ΠΎ Π² ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΡΠ½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ(personal fork, ΡΠΎΡΠΊ), Π»ΠΈΠ±ΠΎ Π² Π»ΠΈΡΠ½ΠΎΠΉ Π²Π΅ΡΠΊΠ΅.
- ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠΎΡΠΊΠΎΠ² ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΊΠ»ΠΎΠ½ΠΈΡΡΠ΅Ρ ΡΠ΄Π°Π»Π΅Π½Π½ΡΠΉ ΠΎΠ±ΡΠΈΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ, ΡΠΎΠ·Π΄Π°Π²Π°Ρ Π΅Π³ΠΎ Π»ΠΈΡΠ½ΡΡ ΡΠ΄Π°Π»Π΅Π½Π½ΡΡ ΠΊΠΎΠΏΠΈΡ, ΡΠ°ΠΊΠΆΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ ΠΊΠ°ΠΊ ΡΠΎΡΠΊ. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΎΠ½ ΠΊΠ»ΠΎΠ½ΠΈΡΡΠ΅Ρ ΡΡΠΎΡ Π»ΠΈΡΠ½ΠΎΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ, ΡΡΠΎΠ±Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π½ΠΈΠΌ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ. ΠΠΎΠ³Π΄Π° ΡΠ°Π±ΠΎΡΠ° Π·Π°Π²Π΅ΡΡΠ΅Π½Π° ΠΈ ΠΊΠΎΠΌΠΌΠΈΡΡ ΡΠΎΠ·Π΄Π°Π½Ρ, ΠΎΠ½ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ ΠΈΡ
Π² ΡΠ²ΠΎΠΉ ΡΠΎΡΠΊ, Π³Π΄Π΅ ΠΎΠ½ΠΈ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π΄ΡΡΠ³ΠΈΠΌ ΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°Π½Ρ Π² ΠΎΠ±ΡΠΈΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ. ΠΡΠΎΡ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ ΠΎΠ±ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ
Ρ ΠΎΡΠΊΡΡΡΡΠΌ ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Π½Π° GitHub. ΠΠ½ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΠΌΠΎΠ΅ΠΌ ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΠΎΠΌ ΠΊΡΡΡΠ΅ [Team Work and CI with Git] (
http://devops.redpill.solutions/ ). - ΠΡΡΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ΄Π°Π»ΡΠ½Π½ΡΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΠΈ ΡΡΠΈΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²Π΅ΡΠΊΡ
master
ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ "Π·Π°ΡΠΈΡΠ΅Π½Π½ΠΎΠΉ". Π ΡΡΠΎΠΌ ΡΡΠ΅Π½Π°ΡΠΈΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΏΡΠ±Π»ΠΈΠΊΡΡΡ ΡΠ²ΠΎΠΉ ΠΊΠΎΠ΄ Π² Π²Π΅ΡΠΊΠΈ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ, ΡΡΠΎΠ±Ρ Π΄ΡΡΠ³ΠΈΠ΅ ΠΌΠΎΠ³Π»ΠΈ ΡΡΠΎΡ ΠΊΠΎΠ΄ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, Π΅ΡΠ»ΠΈ Π²ΡΠ΅ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅, ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΠΈΡΡ Ρmaster
ΠΎΠ±ΡΠ΅Π³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ.
Π ΡΡΠΎΠΌ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌ ΠΊΡΡΡΠ΅ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°Π±ΠΎΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΉ Π²Π΅ΡΠΊΠΈ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΎΠΏΡΠ±Π»ΠΈΠΊΡΠ΅ΠΌ Π½Π°Ρ ΠΊΠΎΠ΄.
οΈ ΠΠ°Π΄Π°Π½ΠΈΠ΅
- ΠΠΏΡΠ±Π»ΠΈΠΊΡΠΉΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΡΠ΄Π°Π»Π΅Π½Π½ΡΡ Π²Π΅ΡΠΊΡ Ρ ΡΠ΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΡΡΠΎ ΠΈ Π²Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ°Ρ Π²Π΅ΡΠΊΠ°
ΠΠΎΠΌΠ°Π½Π΄Ρ
git push --set-upstream origin feature
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ pull request
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ pull request Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Steps review. Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ feature
ΠΊΠ°ΠΊ "head branch" ΠΈ master
ΠΊΠ°ΠΊ "base branch".
Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ
master
Π² ΡΠ²ΠΎΠ΅ΠΌ ΡΠΎΡΠΊΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ "base branch", Ρ Π½Π΅ Π±ΡΠ΄Ρ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π½Π° Π·Π°ΠΏΡΠΎΡΡ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Ρ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π°ΠΌΠΈ ΠΊΡΡΡΠ°.
ΠΠ° ΡΠ»Π΅Π½Π³Π΅ GitHub "base branch" β ΡΡΠΎ Π²Π΅ΡΠΊΠ°, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΉ Π²Ρ ΠΎΡΠ½ΠΎΠ²ΡΠ²Π°Π΅ΡΠ΅ ΡΠ²ΠΎΡ ΡΠ°Π±ΠΎΡΡ, Π° "head branch" β ΡΡΠΎ Π²Π΅ΡΠΊΠ°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ°Ρ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΠΌΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ.
ΠΠ±ΡΡΠ΄ΠΈΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ Π½ΠΎΠ²ΡΠ΅ ΠΊΠΎΠΌΠΌΠΈΡΡ ΠΏΠΎ ΠΌΠ΅ΡΠ΅ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΡ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ
Pull request(PR)
Pull request(PR) β ΡΡΠΎ ΡΠΏΠΎΡΠΎΠ± ΠΎΠ±ΡΡΠ΄ΠΈΡΡ ΠΈ Π·Π°Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ(code review) ΠΊΠΎΠ΄Π°. Pull request Π½Π°Π·Π²Π°Π½Ρ Π² ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ΅Π³ΠΎ ΡΠΏΠΎΡΠΎΠ±Π° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΎΠ±ΡΠΈΠΉ ΠΊΠΎΠ΄. ΠΠ±ΡΡΠ½ΠΎ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ ΠΊΠ»ΠΎΠ½ΠΈΡΡΠ΅Ρ ΡΠ΄Π°Π»Π΅Π½Π½ΡΠΉ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π°Π΄ ΠΊΠΎΠ΄ΠΎΠΌ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΎΠ½ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ ΠΊΠΎΠ΄ Π² ΡΠ²ΠΎΠΉ Π»ΠΈΡΠ½ΡΠΉ ΡΠ΄Π°Π»Π΅Π½Π½ΡΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΠΈ ΠΏΡΠΎΡΠΈΡ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΡΡ Π·Π° ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π·Π°Π±ΡΠ°ΡΡ(pull) Π΅Π³ΠΎ ΠΊΠΎΠ΄ Π² ΡΠ²ΠΎΠΈ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ, Π³Π΄Π΅ ΠΎΠ½ΠΈ ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΡΡΡ(merge) Π΅Π³ΠΎ. ΠΡΠΎ ΠΏΠΎΠ½ΡΡΠΈΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ ΠΈ ΠΏΠΎΠ΄ Π΄ΡΡΠ³ΠΈΠΌΠΈ Π½Π°Π·Π²Π°Π½ΠΈΡΠΌΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, merge request.
ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π²Π°ΠΌ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ pull request GitHub ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΡ ΠΏΠ»Π°ΡΡΠΎΡΠΌ. ΠΠΎΠΌΠ°Π½Π΄Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ ΡΠ²ΡΠ·ΠΈ, Π²ΠΊΠ»ΡΡΠ°Ρ Π»ΠΈΡΠ½ΠΎΠ΅ ΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, Π³ΠΎΠ»ΠΎΡΠΎΠ²ΡΠ΅ Π·Π²ΠΎΠ½ΠΊΠΈ ΠΈΠ»ΠΈ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΡΡ ΠΏΠΎΡΡΡ, Π½ΠΎ Π΅ΡΡΡ Π²ΡΡ ΠΆΠ΅ ΡΡΠ΄ ΠΏΡΠΈΡΠΈΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°ΠΊΠΈΠ΅ pull requests Π² ΡΡΠΈΠ»Π΅ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ Π½Π° ΡΠΎΡΡΠΌΠ΅. ΠΠΎΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· Π½ΠΈΡ :
- ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΠΌΠΈ Π² ΠΊΠΎΠ΄Π΅;
- ΠΊΠ°ΠΊ ΠΌΠ΅ΡΡΠΎ Π΄Π»Ρ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° ΠΎΡΠ·ΡΠ²ΠΎΠ² ΠΎ Π½Π΅Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΠΎΠΉ ΡΠ°Π±ΠΎΡΠ΅ ΠΊΠ°ΠΊ ΠΎΡ Π°Π²ΡΠΎΡΠ΅ΡΡΠΎΠ², ΡΠ°ΠΊ ΠΈ ΠΎΡ ΠΊΠΎΠ»Π»Π΅Π³;
- ΡΠΎΡΠΌΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ ΠΊΠΎΠ΄Π°;
- ΡΡΠΎΠ±Ρ ΠΏΠΎΠ·ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π²ΡΡΡΠ½ΠΈΡΡ ΠΏΡΠΈΡΠΈΠ½Ρ ΠΈ ΡΠΎΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΡΡΠΎΡΡΠΈΠ΅ Π·Π° ΡΠ΅ΠΌ ΠΈΠ»ΠΈ ΠΈΠ½ΡΠΌ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠΎΠΌ ΠΊΠΎΠ΄Π°.
ΠΠ±ΡΡΠ½ΠΎ Π²Ρ ΡΠΎΠ·Π΄Π°Π΅ΡΠ΅ pull request ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΡΠΎ-ΡΠΎ ΠΎΠ±ΡΡΠ΄ΠΈΡΡ ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΡΡ ΡΠ²ΡΠ·Ρ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π²Ρ ΡΠ°Π±ΠΎΡΠ°Π΅ΡΠ΅ Π½Π°Π΄ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ Π·Π°ΠΏΡΠΎΡ Π½Π° Π²Π½Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π΅ΡΠ΅ Π΄ΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΠΊΠΎΠ΄Π°, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ ΡΠ²ΠΎΠΈΠΌΠΈ ΠΈΠ΄Π΅ΡΠΌΠΈ ΠΈ ΠΎΠ±ΡΡΠ΄ΠΈΡΡ ΡΠ²ΠΎΠΈ ΠΏΠ»Π°Π½Ρ Ρ ΡΠΎΠ°Π²ΡΠΎΡΠ°ΠΌΠΈ. ΠΡΠ»ΠΈ ΡΠ°Π±ΠΎΡΠ° Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠ°, pull request ΠΎΡΠΊΡΡΠ²Π°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΡΡΠΎ-ΡΠΎ ΡΠΆΠ΅ ΡΠ΄Π΅Π»Π°Π½ΠΎ, Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΎ ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΎ. Π Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΡΠ΅Π½Π°ΡΠΈΡΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΡΠΊΡΡΡΡ PR ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ· ΡΠΎΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π·Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎΠΌ: ΡΡΠΎΠ±Ρ Π·Π°ΠΏΡΡΡΠΈΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ΅ΡΡΡ ΠΈΠ»ΠΈ ΠΈΠ½ΠΈΡΠΈΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΠΊΠΎΠ΄Π°. Π§ΡΠΎ Π±Ρ Π²Ρ Π½ΠΈ ΡΠ΅ΡΠΈΠ»ΠΈ, Π½Π΅ Π·Π°Π±ΡΠ²Π°ΠΉΡΠ΅ @ΡΠΏΠΎΠΌΠΈΠ½Π°ΡΡ Π»ΡΠ΄Π΅ΠΉ, ΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΡΡ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π² Π²Π°ΡΠ΅ΠΌ pull request’Π΅.
ΠΠ±ΡΡΠ½ΠΎ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ PR Π²Ρ Π΄Π΅Π»Π°Π΅ΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅.
- Π£ΠΊΠ°Π·ΡΠ²Π°Π΅ΡΠ΅, ΡΡΠΎ Π²Ρ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΈ Π³Π΄Π΅.
- ΠΠΈΡΠ΅ΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅, ΠΎΠ±ΡΡΡΠ½ΡΡΡΠ΅Π΅ ΡΠ΅Π»Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°Ρ
ΠΎΡΠ΅ΡΡ:
- Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π²Π°ΠΆΠ½ΠΎΠ΅, ΡΡΠΎ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠΌ ΠΈΠ· ΠΊΠΎΠ΄Π°, ΠΈΠ»ΠΈ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ Π΄Π»Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ #Π±Π°Π³ΠΈ ΠΈ Π½ΠΎΠΌΠ΅ΡΠ° ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²;
- @ΡΠΏΠΎΠΌΡΠ½ΡΡΡ Π²ΡΠ΅Ρ , Ρ ΠΊΠ΅ΠΌ Ρ ΠΎΡΠΈΡΠ΅ Π½Π°ΡΠ°ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π²ΠΌΠ΅ΡΡΠ΅, ΠΈΠ»ΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ @ΡΠΏΠΎΠΌΡΠ½ΡΡΡ ΠΈΡ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ ΠΏΠΎΠ·ΠΆΠ΅;
- ΠΏΠΎΠΏΡΠΎΡΠΈΡΡ ΠΊΠΎΠ»Π»Π΅Π³ ΠΏΠΎΠΌΠΎΡΡ Ρ ΡΠ΅ΠΌ-ΡΠΎ ΠΈΠ»ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΡΠΎ-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ΅.
ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π²Ρ ΠΎΡΠΊΡΠΎΠ΅ΡΠ΅ PR Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΡΠ΅ΡΡΡ, Π½Π°ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° Π² ΡΠ°ΠΊΠΈΡ ΡΠ»ΡΡΠ°ΡΡ . Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΎΡ ΠΆΠ΅ Π½Π°Π±ΠΎΡ ΡΠ΅ΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ Π·Π°ΠΏΡΡΠΊΠ°Π»ΠΈ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ, Π½ΠΎ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ΅ΡΡΡ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ.
ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΠΏΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡΠ΅ ΠΏΠΎΠΊΠ° Π·Π°Π²Π΅ΡΡΠ°ΡΡΡ ΡΠ΅ΡΡΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΡΠ°ΡΡΡ ΡΠ΅ΡΡΠΎΠ² Π² Π½ΠΈΠΆΠ½Π΅ΠΉ ΡΠ°ΡΡΠΈ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ PR Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ GitHub. ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉΡΠ΅ ΠΊΠΎΠ³Π΄Π° ΡΠ΅ΡΡΡ Π±ΡΠ΄ΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½Ρ.
οΈ ΠΠΎΠ±Π°Π²ΡΡΠ΅ Π·Π°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΡΡΠΈ ΡΠΏΠΈΡΠΊΠ° ΡΠ°Π³ΠΎΠ² CI
Π‘ΠΏΠΈΡΠΎΠΊ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π½ΡΠΉ Π² ΡΡΠΎΠΌ ΠΊΡΡΡΠ΅, ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ ΠΈ ΡΡΠ±ΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΌ, ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ ΠΎΠ± ΡΡΠΎΠΌ.
οΈ ΠΠ°Π΄Π°Π½ΠΈΠ΅: ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ pull request Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ΅Π½ΠΈΡ
- ΠΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΡΠ΅ΡΡ Π½Π° Π²Π΅ΡΠΊΡ
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
Π² ΡΠ΄Π°Π»ΡΠ½Π½ΡΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ. - Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ pull request Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ Adding a remark Ρ Π³ΠΎΠ»ΠΎΠ²Π½ΠΎΠΉ Π²Π΅ΡΠΊΠΎΠΉ
bugfix
ΠΈ Π±Π°Π·ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΠΊΠΎΠΉmaster
.
Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ
master
Π² ΡΠ²ΠΎΠ΅ΠΌ ΡΠΎΡΠΊΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ "base branch", Ρ Π½Π΅ Π±ΡΠ΄Ρ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π½Π° Π·Π°ΠΏΡΠΎΡΡ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Ρ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π°ΠΌΠΈ ΠΊΡΡΡΠ°.
ΠΠΎΡ ΠΊΠ°ΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ Π²Π°Ρ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ.
ΠΠΎΠΌΠ°Π½Π΄Ρ
# ΠΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΡΠ΅ΡΡ Π½Π° Π²Π΅ΡΠΊΡ 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 ΠΊΠ°ΠΊ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π²ΡΡΠ΅
Π£ΡΠ²Π΅ΡΠ΄ΠΈΡΠ΅ pull request "Adding a remark"
οΈ ΠΠ°Π΄Π°Π½ΠΈΠ΅
- Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ pull request.
- ΠΠ°ΠΆΠΌΠΈΡΠ΅ "Merge pull request".
- ΠΠ°ΠΆΠΌΠΈΡΠ΅ "Confirm merge".
- ΠΠ°ΠΆΠΌΠΈΡΠ΅ "Delete branch", ΠΎΠ½Π° Π½Π°ΠΌ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π½ΡΠΆΠ½Π°.
ΠΡΠΎ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΠ° ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ² ΠΏΠΎΡΠ»Π΅ ΡΠ»ΠΈΡΠ½ΠΈΡ.
οΈ ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉΡΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΡΠ΅ΡΡΡ
Π‘ΠΎΠ²ΠΌΠ΅ΡΡΠ½Π°Ρ ΡΠ°Π±ΠΎΡΠ° Π½Π°Π΄ pull request ΡΠ°ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ. ΠΠ±ΡΡΠ½ΠΎ ΡΡΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ, Π½ΠΎ Π² Π½Π°ΡΠ΅ΠΌ ΠΊΡΡΡΠ΅ ΠΌΡ ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌΡΡ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΎ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π½ΠΎΠ²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π² Π½Π°Ρ ΡΠΏΠΈΡΠΎΠΊ ΡΠ°Π³ΠΎΠ² CI.
ΠΡΠΈ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΠΉ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠΊΡΡΡΠΈΠ΅. Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΊ ΠΏΠΎΠΊΡΡΡΠΈΡ ΡΠ΅ΡΡΠ°ΠΌΠΈ ΡΠ°Π·Π»ΠΈΡΠ°ΡΡΡΡ ΠΈ ΠΎΠ±ΡΡΠ½ΠΎ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ΅ Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Π²ΡΠΎΠ΄Π΅ "ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ Π΄Π»Ρ Π°Π²ΡΠΎΡΠΎΠ²"(contribution guidelines). ΠΡ ΠΏΠΎΡΡΡΠΏΠΈΠΌ ΠΏΡΠΎΡΡΠΎ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠΎ ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π² Π½Π°ΡΠ΅ΠΌ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅.
ΠΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π·Π°Π΄Π°Π½ΠΈΠΉ ΡΠ½Π°ΡΠ°Π»Π° ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ Π·Π°ΠΊΠΎΠΌΠΌΠΈΡΠΈΡΡ ΡΠ΅ΡΡΡ. ΠΡΠ»ΠΈ Π²Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ pre-commit
hook ΡΠ°Π½Π΅Π΅, ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΠΉ ΡΠ΅ΡΡ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΠ΅Π½, Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΉΠ΄Π΅Π½, ΠΈ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΊΠΎΠΌΠΌΠΈΡΠ΅Π½ΠΎ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΡΠ°ΠΊ ΠΌΡ ΡΠ·Π½Π°Π΅ΠΌ, ΡΡΠΎ Π½Π°ΡΠΈ ΡΠ΅ΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΡΠΎ-ΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ. ΠΡΠ±ΠΎΠΏΡΡΠ½ΠΎ, ΡΡΠΎ Π΅ΡΠ»ΠΈ Π±Ρ ΠΌΡ Π½Π°ΡΠ°Π»ΠΈ Ρ ΠΊΠΎΠ΄Π° Π΄ΠΎ ΡΠ΅ΡΡΠΎΠ², ΠΏΡΠΎΡ
ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΠΎΠ² ΠΌΠΎΠ³Π»ΠΎ ΠΎΠ·Π½Π°ΡΠ°ΡΡ Π»ΠΈΠ±ΠΎ ΡΠΎ, ΡΡΠΎ ΠΊΠΎΠ΄ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ ΠΎΠΆΠΈΠ΄Π°Π»ΠΎΡΡ, Π»ΠΈΠ±ΠΎ ΡΡΠΎ ΡΠ΅ΡΡΡ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ ΠΌΡ Π½Π΅ Π½Π°ΠΏΠΈΡΠ°Π»ΠΈ ΡΠ΅ΡΡΡ Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π²ΠΎΠ²ΡΠ΅ ΠΈΡ
Π·Π°Π±ΡΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½ΠΈΡΡΠΎ Π½Π΅ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎ Π±Ρ Π½Π°ΠΌ ΠΎΠ± ΡΡΠΎΠΌ.
Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠ΅ΡΠ΅Π· ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ (TDD)
TDD ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅Ρ ΠΏΠΈΡΠ°ΡΡ ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄ ΠΊΠΎΠ΄ΠΎΠΌ. ΠΠ±ΡΡΠ½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ°Π±ΠΎΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ TDD Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ.
- ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠ΅ΡΡ.
- ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ Π²ΡΠ΅ ΡΠ΅ΡΡΡ ΠΈ ΡΠ±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π½ΠΎΠ²ΡΠΉ ΡΠ΅ΡΡ Π½Π΅ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ.
- ΠΠ°ΠΏΠΈΡΠΈΡΠ΅ ΠΊΠΎΠ΄.
- ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ ΡΠ΅ΡΡΡ, ΡΠ±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²ΡΠ΅ ΡΠ΅ΡΡΡ ΠΏΡΠΎΡ ΠΎΠ΄ΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ.
- ΠΡΠΎΠ²Π΅Π΄ΠΈΡΠ΅ ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³ ΠΊΠΎΠ΄Π°.
- ΠΠΎΠ²ΡΠΎΡΠΈΡΠ΅.
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΡΠ°Π±ΠΎΡΡ ΡΠ΅ΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ Π±ΡΠ»ΠΈ ΠΏΡΠΎΠΉΠ΄Π΅Π½Ρ ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΠΎΠ±ΡΡΠ½ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ ΠΊΡΠ°ΡΠ½ΡΠΌ, Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π½ΡΠ΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ β Π·Π΅Π»Π΅Π½ΡΠΌ, ΡΠΈΠΊΠ» ΡΠ°ΠΊΠΆΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΊΠ°ΠΊ "ΠΊΡΠ°ΡΠ½ΡΠΉ-Π·Π΅Π»Π΅Π½ΡΠΉ-ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³"(red-green-refactor).
οΈ ΠΠ°Π΄Π°Π½ΠΈΠ΅
Π‘Π½Π°ΡΠ°Π»Π° ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ Π·Π°ΠΊΠΎΠΌΠΌΠΈΡΠΈΡΡ ΡΠ΅ΡΡΡ ΠΈ Π΄Π°ΡΡ ΠΈΠΌ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ Π½Π΅ΡΡΠΏΠ΅ΡΠ½ΠΎ, Π·Π°ΡΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΠΈ Π·Π°ΠΊΠΎΠΌΠΌΠΈΡΡΡΠ΅ ΡΠ°ΠΌ ΡΠ΅ΠΊΡΡ ΡΠΏΠΈΡΠΊΠ° ΡΠ°Π³ΠΎΠ² 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
hook ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½, ΠΏΠΎΠΏΡΡΠΊΠ° ΠΊΠΎΠΌΠΌΠΈΡΠ° Π·Π°Π²Π΅ΡΡΠΈΡΡΡ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ. - ΠΠΎΡΠ»Π΅ Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΡΡΠΎΡ ΡΠ΅ΠΊΡΡ Π²
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
ΠΠΎΠ½ΡΠ»ΠΈΠΊΡ ΡΠ»ΠΈΡΠ½ΠΈΡ
ΠΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ ΠΊ Π·Π°ΠΏΡΠΎΡΡ Π½Π° Π²Π½Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Steps review.
ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ ΠΌΡ Π½Π΅ ΡΠ΄Π΅Π»Π°Π»ΠΈ Π½ΠΈΡΠ΅Π³ΠΎ ΠΏΠ»ΠΎΡ
ΠΎΠ³ΠΎ, ΠΈ ΡΠ΅ΡΡΡ Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΡΠΎΡΠ»ΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΠΌΡ Π²ΡΠ΅ Π΅ΡΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡΡΡΠ΅ΡΡΠ²ΠΈΡΡ ΡΠ»ΠΈΡΠ½ΠΈΠ΅ Π²Π΅ΡΠΊΠΈ feature
ΠΈ master
. ΠΡΠΎ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ Π΄ΡΡΠ³Π°Ρ Π²Π΅ΡΠΊΠ° bugfix
Π±ΡΠ»Π° ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½Π° Ρ master
ΠΏΠΎΠΊΠ° ΠΌΡ ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ Π½Π°Π΄ ΡΡΠΈΠΌ PR.
ΠΡΠΎ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΡΠ΄Π°Π»Π΅Π½Π½Π°Ρ Π²Π΅ΡΠΊΠ° master
ΠΈΠΌΠ΅Π΅Ρ Π±ΠΎΠ»Π΅Π΅ Π½ΠΎΠ²ΡΡ Π²Π΅ΡΡΠΈΡ, ΡΠ΅ΠΌ ΡΠ°, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΡ ΠΎΡΠ½ΠΎΠ²ΡΠ²Π°Π»ΠΈ Π²Π΅ΡΠΊΡ feature
. ΠΠ·-Π·Π° ΡΡΠΎΠ³ΠΎ ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠΎΡΠ°ΡΡ HEAD master
Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° Π²Π΅ΡΠΊΠΈ feature
. Π ΡΡΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π»ΠΈΠ±ΠΎ ΠΎΡΡΡΠ΅ΡΡΠ²ΠΈΡΡ ΡΠ»ΠΈΡΠ½ΠΈΠ΅(merge), Π»ΠΈΠ±ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΊΠΎΠΌΠΌΠΈΡΡ feature
ΠΏΠΎΠ²Π΅ΡΡ
(rebase) master
. GitHub Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ»ΠΈΡΠ½ΠΈΠ΅, Π΅ΡΠ»ΠΈ Π½Π΅Ρ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ². Π£Π²Ρ, Π² Π½Π°ΡΠ΅ΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ ΠΎΠ±Π΅ Π²Π΅ΡΠΊΠΈ ΠΈΠΌΠ΅ΡΡ ΠΊΠΎΠ½ΠΊΡΡΠΈΡΡΡΡΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΡΠ°ΠΉΠ»Π΅ ci.md
. ΠΡΠ° ΡΠΈΡΡΠ°ΡΠΈΡ ΠΈΠ·Π²Π΅ΡΡΠ½Π° ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡ ΠΏΡΠΈ ΡΠ»ΠΈΡΠ½ΠΈΠΈ(merge conflict), ΠΈ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ Π΅Π΅ Π²ΡΡΡΠ½ΡΡ.
Merge ΠΈΠ»ΠΈ rebase
Merge
- Π‘ΠΎΠ·Π΄Π°Π΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΊΠΎΠΌΠΌΠΈΡ ΡΠ»ΠΈΡΠ½ΠΈΡ(merge commit) ΠΈ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ ΠΈΡΡΠΎΡΠΈΡ ΡΠ°Π±ΠΎΡΡ.
- Π‘ΠΎΡ ΡΠ°Π½ΡΠ΅Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠ΅ ΠΊΠΎΠΌΠΌΠΈΡΡ Π²Π΅ΡΠΎΠΊ Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌΠΈ ΠΎΡΠΌΠ΅ΡΠΊΠ°ΠΌΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈ Π°Π²ΡΠΎΡΠ°ΠΌΠΈ.
- Π‘ΠΎΡ ΡΠ°Π½ΡΠ΅Ρ SHA ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ² ΠΈ ΡΡΡΠ»ΠΊΠΈ Π½Π° Π½ΠΈΡ Π² ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ.
- Π’ΡΠ΅Π±ΡΠ΅Ρ ΠΎΠ΄Π½ΠΎΠΊΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ².
- ΠΠ΅Π»Π°Π΅Ρ ΠΈΡΡΠΎΡΠΈΡ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ.
- ΠΡΡΠΎΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΡΠ΄Π½ΠΎ ΡΠΈΡΠ°ΡΡ ΠΈΠ·-Π·Π° Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° Π²Π΅ΡΠΎΠΊ (Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ ΠΊΠ°Π±Π΅Π»Ρ IDE).
- Π£ΡΠ»ΠΎΠΆΠ½ΡΠ΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ ΠΎΡΠ»Π°Π΄ΠΊΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π΅Π»Π°Π΅Ρ
git bisect
ΠΌΠ΅Π½Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ β ΠΎΠ½ ΡΠΎΠ»ΡΠΊΠΎ Π½Π°ΠΉΠ΄Π΅Ρ ΠΊΠΎΠΌΠΌΠΈΡ ΡΠ»ΠΈΡΠ½ΠΈΡ.
Rebase
- ΠΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ ΠΊΠΎΠΌΠΌΠΈΡΡ ΠΈΠ· ΡΠ΅ΠΊΡΡΠ΅ΠΉ Π²Π΅ΡΠΊΠΈ ΠΏΠΎΠ²Π΅ΡΡ
Π±Π°Π·ΠΎΠ²ΠΎΠΉ ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄ΡΡΠ³ΠΈΠΌ.
- Π€ΠΎΡΠΌΠΈΡΡΡΡΡΡ Π½ΠΎΠ²ΡΠ΅ ΠΊΠΎΠΌΠΌΠΈΡΡ Ρ Π½ΠΎΠ²ΡΠΌΠΈ SHA, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ΅Π³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡΡ Π² GitHub ΡΠΎΠΎΡΠ½ΠΎΡΡΡΡΡ Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌΠΈ pull requests, Π½ΠΎ Π½Π΅ Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌΠΈ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΌΠΈ.
- ΠΠΎΠΌΠΌΠΈΡΡ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ΅ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Ρ ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½Ρ Π² ΠΎΠ΄ΠΈΠ½.
- ΠΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ².
- ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π»ΠΈΠ½Π΅ΠΉΠ½ΡΡ ΠΈΡΡΠΎΡΠΈΡ.
- ΠΡΡΠΎΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΎΡΠ΅ ΡΠΈΡΠ°ΡΡ, Π΅ΡΠ»ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ½Π° Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ Π±Π΅Π· ΡΠ°Π·ΡΠΌΠ½ΡΡ Π½Π° ΡΠΎ ΠΏΡΠΈΡΠΈΠ½.
- ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΎΡΠ»Π°Π΄ΠΊΠ° ΠΈ ΡΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΎΠΊ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΠ΅: Π΄Π΅Π»Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌ
git bisect
, ΠΌΠΎΠΆΠ΅Ρ ΡΠ΄Π΅Π»Π°ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΎΡΠΊΠ°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠΊΠΈΠΌΠΈ ΠΈ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΡΠΌΠΈ.
- Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ Π²Π΅ΡΠ²ΠΈ Ρ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠ½Π½ΡΠΌΠΈ ΠΊΠΎΠΌΠΌΠΈΡΠ°ΠΌΠΈ Ρ ΡΠ»Π°Π³ΠΎΠΌ
--force
ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Ρ Π·Π°ΠΏΡΠΎΡΠ°ΠΌΠΈ Π½Π° Π²Π½Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.
ΠΠ±ΡΡΠ½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΠΎΠ³Π»Π°ΡΠ°ΡΡΡΡ Π²ΡΠ΅Π³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΠΈΠΌ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ "ΡΠΈΡΡΠΎΠ΅" ΡΠ»ΠΈΡΠ½ΠΈΠ΅ ΠΈΠ»ΠΈ "ΡΠΈΡΡΡΠΉ" ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ² ΠΏΠΎΠ²Π΅ΡΡ
ΠΈΠ»ΠΈ ΡΡΠΎ-ΡΠΎ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ² ΠΏΠΎΠ²Π΅ΡΡ
ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅(git rebase -i
) Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ Π²Π΅ΡΠΎΠΊ, Π½Π΅ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½ΡΡ
Π² ΠΎΠ±ΡΠ΅ΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ, Π½ΠΎ ΡΠ»ΠΈΡΠ½ΠΈΠ΅(merge) Π΄Π»Ρ "ΠΎΠ±ΡΠ΅Π΄ΠΎΡΡΡΠΏΠ½ΡΡ
" Π²Π΅ΡΠΎΠΊ.
ΠΠ΄Π΅ΡΡ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ»ΠΈΡΠ½ΠΈΠ΅.
οΈ ΠΠ°Π΄Π°Π½ΠΈΠ΅
- Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ ΠΊΠΎΠ΄ Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ Π²Π΅ΡΠΊΠ΅
master
ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ½ ΠΈΠ· ΡΠ΄Π°Π»ΡΠ½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ. - ΠΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΡΠ΅ΡΡ Π½Π° Π²Π΅ΡΠΊΡ
feature
. - ΠΠ½ΠΈΡΠΈΠΈΡΡΠΉΡΠ΅ ΡΠ»ΠΈΡΠ½ΠΈΠ΅ Ρ Π²Π΅ΡΠΊΠΎΠΉ
master
. ΠΡΠ΄Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΎ ΠΎ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ΅ ΡΠ»ΠΈΡΠ½ΠΈΡ, ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠΌ Ρ ΠΊΠΎΠ½ΠΊΡΡΠΈΡΡΡΡΠΈΠΌΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΠΌΠΈ Π²ci.md
. - Π Π°Π·ΡΠ΅ΡΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ Π² ΡΠ΅ΠΊΡΡΠ΅ ΠΎΡΡΠ°Π»ΡΡ ΠΈ Π½Π°Ρ ΡΠΏΠΈΡΠΎΠΊ ΡΠ°Π³ΠΎΠ² CI, ΠΈ Π·Π°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ ΠΎ Π½Π΅ΠΌ.
- ΠΠΏΡΠ±Π»ΠΈΠΊΡΠΉΡΠ΅ ΠΊΠΎΠΌΠΌΠΈΡ ΡΠ»ΠΈΡΠ½ΠΈΡ Π² ΡΠ΄Π°Π»Π΅Π½Π½ΡΡ Π²Π΅ΡΠΊΡ
feature
. - ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ ΡΡΠ°ΡΡΡ pull request’Π° Π² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ GitHub, Π΄ΠΎΠΆΠ΄ΠΈΡΠ΅ΡΡ ΠΏΠΎΠΊΠ° ΡΠ»ΠΈΡΠ½ΠΈΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ.
ΠΠΎΠΌΠ°Π½Π΄Ρ
# Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ ΠΊΠΎΠ΄ Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ΅ Π²Π΅ΡΠΊΠ΅ `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, Π΄ΠΎΠΆΠ΄ΠΈΡΠ΅ΡΡ ΠΏΠΎΠΊΠ° ΡΠ»ΠΈΡΠ½ΠΈΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ.
ΠΡΠ»ΠΈΡΠ½Π°Ρ ΡΠ°Π±ΠΎΡΠ°!
ΠΡ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΠΈ ΡΠ°Π±ΠΎΡΡ ΡΠΎ ΡΠΏΠΈΡΠΊΠΎΠΌ, ΠΈ ΡΠ΅ΠΏΠ΅ΡΡ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΡΠ²Π΅ΡΠ΄ΠΈΡΡ pull request Π² master
.
οΈ ΠΠ°Π΄Π°Π½ΠΈΠ΅: Π£ΡΠ²Π΅ΡΠ΄ΠΈΡΠ΅ pull request "Steps review"
- ΠΡΠΊΡΠΎΠΉΡΠ΅ pull request.
- ΠΠ°ΠΆΠΌΠΈΡΠ΅ "Merge pull request".
- ΠΠ°ΠΆΠΌΠΈΡΠ΅ "Confirm merge".
- ΠΠ°ΠΆΠΌΠΈΡΠ΅ "Delete branch", ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½Π° Π½Π°ΠΌ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π½ΡΠΆΠ½Π°.
ΠΡΠΎ Π²Π°Ρ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ
ΠΡΠΈΠ±ΠΊΠ° Π½Π° ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΠ²Π΅
ΠΠΎΠ²ΠΎΡΡΡ, ΡΡΠΎ Β«ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΎΡΠΈΠ±ΠΎΠΊ, Π½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° ΡΡΠΎΠ±Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ ΠΈΡ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅Β». ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ Ρ Π½Π°Ρ Π±ΡΠ»ΠΈ ΡΠ΅ΡΡΡ, ΠΈ ΠΎΠ½ΠΈ Π½Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ Π½Π°ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΠΎΡΠΈΠ±ΠΎΠΊ, ΠΊΠΎΠ²Π°ΡΠ½Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΡΠΎΠΊΡΠ°Π»Π°ΡΡ Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ½.
Π ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΌ ΡΡΠ΅Π½Π°ΡΠΈΠΈ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ·Π°Π±ΠΎΡΠΈΡΡΡΡ ΠΎ:
- ΡΠΎΠΌ, ΡΡΠΎ ΡΠ°Π·Π²ΡΡΠ½ΡΡΠΎ Π½Π° ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΠ²Π΅;
- ΠΊΠΎΠ΄Π΅ Π² Π²Π΅ΡΠΊΠ΅
master
Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ, Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΌΠΎΠ³ΡΡ Π½Π°ΡΠΈΠ½Π°ΡΡ Π½ΠΎΠ²ΡΡ ΡΠ°Π±ΠΎΡΡ.
ΠΡΠΊΠ°ΡΡΠ²Π°ΡΡ ΠΈΠ»ΠΈ ΠΈΡΠΏΡΠ°Π²Π»ΡΡΡ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠΈ?
"ΠΡΠΊΠ°ΡΡΠ²Π°Π½ΠΈΠ΅"(rolling back) β ΡΡΠΎ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ ΠΈΡΠΏΡΠ°Π²Π½ΠΎΠΉ Π±ΠΎΠ»Π΅Π΅ ΡΠ°Π½Π½Π΅ΠΉ Π²Π΅ΡΡΠΈΠΈ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΠ²Π½ΡΡ ΡΡΠ΅Π΄Ρ ΠΈ ΠΎΡΠΌΠ΅Π½Π°(revert) ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ², ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΡ
ΠΎΡΠΈΠ±ΠΊΡ. "ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠΈ"(fixing forward) β ΡΡΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π² master
ΠΈ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΡΠ΅Π΅. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ API ΠΈ ΡΡ
Π΅ΠΌΡ Π±Π°Π· Π΄Π°Π½Π½ΡΡ
ΠΌΠ΅Π½ΡΡΡΡΡ ΠΏΠΎ ΠΌΠ΅ΡΠ΅ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ΄Π° Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΡΡΠ΅Π΄Π΅, ΠΏΡΠΈ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΠΉ ΠΏΠΎΡΡΠ°Π²ΠΊΠ΅ ΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ Ρ
ΠΎΡΠΎΡΠ΅Π³ΠΎ ΠΏΠΎΠΊΡΡΡΠΈΡ ΡΠ΅ΡΡΠ°ΠΌΠΈ, ΠΎΡΠΊΠ°ΡΡΠ²Π°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠΆΠ½Π΅Π΅ ΠΈ ΡΠΈΡΠΊΠΎΠ²Π°Π½Π½Π΅Π΅, ΡΠ΅ΠΌ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠΈ.
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΡΠΊΠ°ΡΡΠ²Π°Π½ΠΈΠ΅ Π½Π΅ Π½Π΅ΡΠ΅Ρ Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΡΠΈΡΠΊΠ°, ΠΌΡ ΠΏΠΎΠΉΠ΄ΡΠΌ ΡΡΠΈΠΌ ΠΏΡΡΡΠΌ, Π²Π΅Π΄Ρ ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ
- ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΠΎΡΠΈΠ±ΠΊΡ Π½Π° ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΠ²Π΅ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΡΠ΅Π΅;
- ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠΎΠ΄ Π²
master
ΡΡΠ°Π·Ρ ΠΏΡΠΈΠ³ΠΎΠ΄Π½ΡΠΌ Π΄Π»Ρ Π½Π°ΡΠ°Π»Π° Π½ΠΎΠ²ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ.
οΈ ΠΠ°Π΄Π°Π½ΠΈΠ΅
- ΠΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΡΠ΅ΡΡ Π½Π° Π²Π΅ΡΠΊΡ
master
Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ. - ΠΠ±Π½ΠΎΠ²ΠΈΡΠ΅ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΠΈΠ· ΡΠ΄Π°Π»ΡΠ½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ.
- ΠΡΠΌΠ΅Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠΌΠΈΡ ΡΠ»ΠΈΡΠ½ΠΈΡ PR Steps review Π²
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 ΠΈ Π²Π΅ΡΠ½ΡΡΡ Π΅Π³ΠΎ Π² master
ΠΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΡΠΌΠ΅Π½ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΌΠΈΡ ΡΠ»ΠΈΡΠ½ΠΈΡ Π²Π΅ΡΠΊΠΈ feature
. Π₯ΠΎΡΠΎΡΠ°Ρ Π½ΠΎΠ²ΠΎΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΠ΅ΠΏΠ΅ΡΡ Ρ Π½Π°Ρ Π½Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠΈ Π² master
. ΠΠ»ΠΎΡ
Π°Ρ Π½ΠΎΠ²ΠΎΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΈΡΡΠ΅Π· ΠΈ Π½Π°Ρ Π΄ΡΠ°Π³ΠΎΡΠ΅Π½Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΡΠ°Π³ΠΎΠ² Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΠΉ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ. ΠΡΠ°ΠΊ, Π² ΠΈΠ΄Π΅Π°Π»Π΅, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊ ΠΊΠΎΠΌΠΌΠΈΡΠ°ΠΌ ΠΈΠ· feature
ΠΈ Π²Π΅ΡΠ½ΡΡΡ ΠΈΡ
Π² master
Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ.
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ΄ΠΎΠΉΡΠΈ ΠΊ Π·Π°Π΄Π°ΡΠ΅ ΠΏΠΎ-ΡΠ°Π·Π½ΠΎΠΌΡ:
- ΠΎΡΠΌΠ΅Π½ΠΈΡΡ(revert) ΠΊΠΎΠΌΠΌΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΡΠΌΠ΅Π½ΡΠ΅Ρ ΡΠ»ΠΈΡΠ½ΠΈΠ΅
feature
Ρmaster
; - ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ ΠΊΠΎΠΌΠΌΠΈΡΡ ΠΈΠ· Π±ΡΠ²ΡΠ΅ΠΉ
feature
.
Π Π°Π·Π½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠ°Π·Π½ΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Ρ, ΠΌΡ ΠΆΠ΅ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠΌ ΠΏΠΎΠ»Π΅Π·Π½ΡΠ΅ ΠΊΠΎΠΌΠΌΠΈΡΡ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ Π²Π΅ΡΠΊΡ ΠΈ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ pull request Π΄Π»Ρ ΡΡΠΎΠΉ Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΠΊΠΈ.
οΈ ΠΠ°Π΄Π°Π½ΠΈΠ΅
- Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π²Π΅ΡΠΊΡ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ
feature-fix
ΠΈ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΡΠ΅ΡΡ Π½Π° Π½Π΅Π΅. -
ΠΠ΅ΡΠ΅Π½Π΅ΡΠΈΡΠ΅ Π²ΡΠ΅ ΠΊΠΎΠΌΠΌΠΈΡΡ ΠΈΠ· Π±ΡΠ²ΡΠ΅ΠΉ Π²Π΅ΡΠΊΠΈ
feature
Π² Π½ΠΎΠ²ΡΡ Π²Π΅ΡΠΊΡ. Π Π°Π·ΡΠ΅ΡΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡ ΡΠ»ΠΈΡΠ½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠ΅. -
ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠ΅Π³ΡΠ΅ΡΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡ Π²
ci.test.js
:it('does not contain the sneaky bug', () => { expect( /.*sneakys+bug.*/gi.test(fileContents)).toBe(false); });
- ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ ΡΠ΅ΡΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΠΎΠ½ΠΈ Π½Π΅ Π·Π°Π²Π΅ΡΡΠ°ΡΡΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ.
- Π£Π΄Π°Π»ΠΈΡΠ΅ ΡΠ΅ΠΊΡΡ " with a sneaky bug" Π²
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
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ pull request.
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ pull request Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Fixing the feature. Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ feature-fix
ΠΊΠ°ΠΊ "head branch", Π° master
ΠΊΠ°ΠΊ "base branch".
ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΠΏΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡΠ΅, ΠΏΠΎΠΊΠ° Π·Π°Π²Π΅ΡΡΠ°ΡΡΡ ΡΠ΅ΡΡΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΡΠ°ΡΡΡ ΡΠ΅ΡΡΠΎΠ² Π² Π½ΠΈΠΆΠ½Π΅ΠΉ ΡΠ°ΡΡΠΈ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ PR.
Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ
master
Π² ΡΠ²ΠΎΠ΅ΠΌ ΡΠΎΡΠΊΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ "base branch", Ρ Π½Π΅ Π±ΡΠ΄Ρ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π½Π° Π·Π°ΠΏΡΠΎΡΡ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Ρ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π°ΠΌΠΈ ΠΊΡΡΡΠ°.
Π£ΡΠ²Π΅ΡΠ΄ΠΈΡΠ΅ pull request "Fixing the feature"
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅! ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΡΡΠ²Π΅ΡΠ΄ΠΈΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² master
ΠΈΠ· pull request.
οΈ ΠΠ°Π΄Π°Π½ΠΈΠ΅
- ΠΠ°ΠΆΠΌΠΈΡΠ΅ "Merge pull request".
- ΠΠ°ΠΆΠΌΠΈΡΠ΅ "Confirm merge".
- ΠΠ°ΠΆΠΌΠΈΡΠ΅ "Delete branch", ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½Π° Π½Π°ΠΌ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π½ΡΠΆΠ½Π°.
ΠΡΠΎ ΡΠΎ, ΡΡΠΎ Ρ Π²Π°Ρ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ
ΠΠΎΠ·Π΄ΡΠ°Π²Π»ΡΡ!
ΠΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ Π²ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π»ΡΠ΄ΠΈ ΠΎΠ±ΡΡΠ½ΠΎ ΡΠΎΠ²Π΅ΡΡΠ°ΡΡ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΠΉ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ.
ΠΡΠ»ΠΈ Π²Ρ Π·Π°ΠΌΠ΅ΡΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΊΡΡΡΠΎΠΌ ΠΈΠ»ΠΈ Π·Π½Π°Π΅ΡΠ΅ ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΡΠ»ΡΡΡΠΈΡΡ, ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ issue Π²
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com