Git c\u00f3 vai tr\u00f2 nh\u01b0 th\u1ebf n\u00e0o?<\/em><\/figcaption><\/figure>\nGit \u0111\u00f3ng vai tr\u00f2 quan tr\u1ecdng trong vi\u1ec7c ph\u00e1t tri\u1ec3n ph\u1ea7n m\u1ec1m hi\u1ec7n \u0111\u1ea1i, mang l\u1ea1i nhi\u1ec1u l\u1ee3i \u00edch cho c\u00e1c l\u1eadp tr\u00ecnh vi\u00ean, nh\u00f3m ph\u00e1t tri\u1ec3n v\u00e0 t\u1ed5 ch\u1ee9c:<\/span><\/p>\n\n- Theo d\u00f5i thay \u0111\u1ed5i:<\/b> Git l\u01b0u tr\u1eef l\u1ecbch s\u1eed \u0111\u1ea7y \u0111\u1ee7 c\u1ee7a t\u1ea5t c\u1ea3 c\u00e1c thay \u0111\u1ed5i, cho ph\u00e9p ng\u01b0\u1eddi d\u00f9ng theo d\u00f5i ai \u0111\u00e3 thay \u0111\u1ed5i g\u00ec v\u00e0 khi n\u00e0o. V\u1edbi kh\u1ea3 n\u0103ng n\u00e0y, c\u00e1c nh\u00e0 ph\u00e1t tri\u1ec3n c\u00f3 th\u1ec3 xem l\u1ea1i l\u1ecbch s\u1eed c\u1ee7a d\u1ef1 \u00e1n, so s\u00e1nh c\u00e1c phi\u00ean b\u1ea3n kh\u00e1c nhau v\u00e0 hi\u1ec3u r\u00f5 h\u01a1n v\u1ec1 qu\u00e1 tr\u00ecnh ph\u00e1t tri\u1ec3n.\u00a0<\/span><\/li>\n
- H\u1ee3p t\u00e1c hi\u1ec7u qu\u1ea3:<\/b> Git h\u1ed7 tr\u1ee3 nhi\u1ec1u ng\u01b0\u1eddi l\u00e0m vi\u1ec7c c\u00f9ng nhau tr\u00ean c\u00f9ng m\u1ed9t d\u1ef1 \u00e1n, cho ph\u00e9p h\u1ecd d\u1ec5 d\u00e0ng h\u1ee3p nh\u1ea5t thay \u0111\u1ed5i v\u00e0 gi\u1ea3i quy\u1ebft xung \u0111\u1ed9t.C\u00e1c t\u00ednh n\u0103ng nh\u01b0 h\u1ee3p nh\u1ea5t (merge) v\u00e0 g\u1ed9p (rebase) gi\u00fap \u0111\u1ea3m b\u1ea3o r\u1eb1ng m\u00e3 ngu\u1ed3n lu\u00f4n \u0111\u01b0\u1ee3c duy tr\u00ec trong tr\u1ea1ng th\u00e1i nh\u1ea5t qu\u00e1n, ngay c\u1ea3 khi c\u00f3 nhi\u1ec1u ng\u01b0\u1eddi \u0111\u00f3ng g\u00f3p \u0111\u1ed3ng th\u1eddi.<\/span><\/li>\n
- Ph\u1ee5c h\u1ed3i phi\u00ean b\u1ea3n:<\/b> Git cho ph\u00e9p quay l\u1ea1i phi\u00ean b\u1ea3n tr\u01b0\u1edbc \u0111\u00f3 c\u1ee7a m\u00e3 ngu\u1ed3n trong tr\u01b0\u1eddng h\u1ee3p x\u1ea3y ra l\u1ed7i ho\u1eb7c thay \u0111\u1ed5i kh\u00f4ng mong mu\u1ed1n. \u0110i\u1ec1u n\u00e0y gi\u00fap gi\u1ea3m thi\u1ec3u r\u1ee7i ro v\u00e0 \u0111\u1ea3m b\u1ea3o an to\u00e0n cho d\u1ef1 \u00e1n, v\u00ec b\u1ea5t k\u1ef3 thay \u0111\u1ed5i n\u00e0o c\u0169ng c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c ho\u00e0n t\u00e1c n\u1ebfu c\u1ea7n thi\u1ebft.<\/span><\/li>\n
- Qu\u1ea3n l\u00fd nh\u00e1nh:<\/b> Git h\u1ed7 tr\u1ee3 t\u1ea1o v\u00e0 qu\u1ea3n l\u00fd nhi\u1ec1u nh\u00e1nh ph\u00e1t tri\u1ec3n song song, gi\u00fap th\u1eed nghi\u1ec7m t\u00ednh n\u0103ng m\u1edbi v\u00e0 tri\u1ec3n khai thay \u0111\u1ed5i m\u1ed9t c\u00e1ch an to\u00e0n.<\/span><\/li>\n
- L\u01b0u tr\u1eef an to\u00e0n:<\/b> Git l\u01b0u tr\u1eef d\u1eef li\u1ec7u d\u1ef1 \u00e1n m\u1ed9t c\u00e1ch an to\u00e0n, b\u1ea3o v\u1ec7 ch\u1ed1ng m\u1ea5t m\u00e1t d\u1eef li\u1ec7u v\u00e0 truy c\u1eadp tr\u00e1i ph\u00e9p. Git s\u1eed d\u1ee5ng m\u00e3 h\u00f3a \u0111\u1ec3 \u0111\u1ea3m b\u1ea3o t\u00ednh to\u00e0n v\u1eb9n c\u1ee7a d\u1eef li\u1ec7u, b\u1ea3o v\u1ec7 ch\u1ed1ng l\u1ea1i m\u1ea5t m\u00e1t d\u1eef li\u1ec7u v\u00e0 truy c\u1eadp tr\u00e1i ph\u00e9p. Git c\u0169ng h\u1ed7 tr\u1ee3 ph\u00e2n quy\u1ec1n, cho ph\u00e9p qu\u1ea3n l\u00fd ai c\u00f3 th\u1ec3 th\u1ef1c hi\u1ec7n c\u00e1c thao t\u00e1c nh\u1ea5t \u0111\u1ecbnh tr\u00ean d\u1ef1 \u00e1n.<\/span><\/li>\n<\/ul>\n
3. Git Ho\u1ea1t \u0110\u1ed9ng Nh\u01b0 Th\u1ebf N\u00e0o?<\/b><\/span><\/h2>\nGit ho\u1ea1t \u0111\u1ed9ng d\u1ef1a tr\u00ean kh\u00e1i ni\u1ec7m <\/span>kho l\u01b0u tr\u1eef<\/b> (repository) v\u00e0 <\/span>b\u1ea3n sao l\u01b0u tr\u1eef<\/b> (local repository). M\u1ed7i d\u1ef1 \u00e1n Git c\u00f3 m\u1ed9t kho l\u01b0u tr\u1eef trung t\u00e2m l\u01b0u tr\u1eef t\u1ea5t c\u1ea3 c\u00e1c thay \u0111\u1ed5i v\u00e0 l\u1ecbch s\u1eed c\u1ee7a d\u1ef1 \u00e1n. M\u1ed7i ng\u01b0\u1eddi d\u00f9ng c\u00f3 m\u1ed9t b\u1ea3n sao l\u01b0u tr\u1eef ri\u00eang c\u1ee7a kho l\u01b0u tr\u1eef trung t\u00e2m tr\u00ean m\u00e1y t\u00ednh c\u1ee7a h\u1ecd.<\/span><\/p>\n
Git ho\u1ea1t \u0111\u1ed9ng nh\u01b0 th\u1ebf n\u00e0o?<\/em><\/figcaption><\/figure>\nQuy tr\u00ecnh c\u01a1 b\u1ea3n c\u1ee7a Git:<\/b><\/p>\n\n- T\u1ea1o kho l\u01b0u tr\u1eef:<\/b> Kh\u1edfi t\u1ea1o kho l\u01b0u tr\u1eef Git cho d\u1ef1 \u00e1n c\u1ee7a b\u1ea1n.<\/span><\/li>\n
- Th\u00eam t\u1ec7p:<\/b> Th\u00eam c\u00e1c t\u1ec7p m\u00e3 ngu\u1ed3n v\u00e0 t\u00e0i li\u1ec7u d\u1ef1 \u00e1n v\u00e0o kho l\u01b0u tr\u1eef Git.<\/span><\/li>\n
- Giai \u0111o\u1ea1n:<\/b> Ch\u1ecdn c\u00e1c t\u1ec7p b\u1ea1n mu\u1ed1n theo d\u00f5i thay \u0111\u1ed5i v\u00e0 l\u01b0u tr\u1eef ch\u00fang trong khu v\u1ef1c d\u00e0n d\u1ef1ng (staging area).<\/span><\/li>\n
- Commit:<\/b> Th\u1ef1c hi\u1ec7n commit \u0111\u1ec3 l\u01b0u tr\u1eef c\u00e1c thay \u0111\u1ed5i \u0111\u00e3 d\u00e0n d\u1ef1ng v\u00e0o kho l\u01b0u tr\u1eef Git, k\u00e8m theo ghi ch\u00fa m\u00f4 t\u1ea3 thay \u0111\u1ed5i.<\/span><\/li>\n
- Push:<\/b> G\u1eedi b\u1ea3n sao l\u01b0u tr\u1eef c\u1ee5c b\u1ed9 c\u1ee7a b\u1ea1n l\u00ean kho l\u01b0u tr\u1eef trung t\u00e2m \u0111\u1ec3 chia s\u1ebb thay \u0111\u1ed5i v\u1edbi nh\u1eefng ng\u01b0\u1eddi d\u00f9ng kh\u00e1c.<\/span><\/li>\n
- Pull:<\/b> T\u1ea3i xu\u1ed1ng thay \u0111\u1ed5i m\u1edbi nh\u1ea5t t\u1eeb kho l\u01b0u tr\u1eef trung t\u00e2m v\u00e0o b\u1ea3n sao l\u01b0u tr\u1eef c\u1ee5c b\u1ed9 c\u1ee7a b\u1ea1n.<\/span><\/li>\n
- Branch:<\/b> T\u1ea1o v\u00e0 chuy\u1ec3n \u0111\u1ed5i gi\u1eefa c\u00e1c nh\u00e1nh ph\u00e1t tri\u1ec3n \u0111\u1ec3 th\u1eed nghi\u1ec7m t\u00ednh n\u0103ng m\u1edbi ho\u1eb7c tri\u1ec3n khai thay \u0111\u1ed5i m\u00e0 kh\u00f4ng \u1ea3nh h\u01b0\u1edfng \u0111\u1ebfn m\u00e3 ngu\u1ed3n ch\u00ednh.<\/span><\/li>\n<\/ul>\n
4. C\u00e1c Thu\u1eadt Ng\u1eef Git Quan Tr\u1ecdng<\/b><\/span><\/h2>\nHi\u1ec3u c\u00e1c thu\u1eadt ng\u1eef then ch\u1ed1t trong Git l\u00e0 \u0111i\u1ec1u c\u1ea7n thi\u1ebft \u0111\u1ec3 s\u1eed d\u1ee5ng h\u1ec7 th\u1ed1ng qu\u1ea3n l\u00fd phi\u00ean b\u1ea3n n\u00e0y hi\u1ec7u qu\u1ea3. H\u00e3y c\u00f9ng \u0111i s\u00e2u v\u00e0o t\u00ecm hi\u1ec3u 17 thu\u1eadt ng\u1eef quan tr\u1ecdng:<\/span><\/p>\n4.1. Branch<\/b><\/span><\/h3>\nBranch<\/b> l\u00e0 m\u1ed9t t\u00ednh n\u0103ng m\u1ea1nh m\u1ebd c\u1ee7a Git, cho ph\u00e9p t\u1ea1o c\u00e1c b\u1ea3n sao l\u01b0u tr\u1eef ri\u00eang bi\u1ec7t t\u1eeb d\u00f2ng ch\u00ednh (main branch) c\u1ee7a d\u1ef1 \u00e1n.\u00a0<\/span><\/p>\n4.2. Commit<\/b><\/span><\/h3>\nCommit <\/b>l\u00e0 m\u1ed9t \u1ea3nh ch\u1ee5p tr\u1ea1ng th\u00e1i c\u1ee7a kho l\u01b0u tr\u1eef Git t\u1ea1i m\u1ed9t th\u1eddi \u0111i\u1ec3m c\u1ee5 th\u1ec3. M\u1ed7i commit bao g\u1ed3m c\u00e1c thay \u0111\u1ed5i \u0111\u01b0\u1ee3c th\u1ef1c hi\u1ec7n \u0111\u1ed1i v\u1edbi c\u00e1c t\u1ec7p, c\u00f9ng v\u1edbi m\u1ed9t ghi ch\u00fa m\u00f4 t\u1ea3 t\u00f3m t\u1eaft nh\u1eefng thay \u0111\u1ed5i \u0111\u00f3. Commit gi\u00fap b\u1ea1n theo d\u00f5i l\u1ecbch s\u1eed ph\u00e1t tri\u1ec3n c\u1ee7a d\u1ef1 \u00e1n v\u00e0 d\u1ec5 d\u00e0ng quay l\u1ea1i c\u00e1c phi\u00ean b\u1ea3n tr\u01b0\u1edbc \u0111\u00f3.<\/span><\/p>\n4.3. Checkout\u00a0<\/b><\/span><\/h3>\nCheckout<\/b> l\u00e0 l\u1ec7nh \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 chuy\u1ec3n \u0111\u1ed5i gi\u1eefa c\u00e1c nh\u00e1nh, commit ho\u1eb7c tag kh\u00e1c nhau trong kho l\u01b0u tr\u1eef Git. Khi b\u1ea1n th\u1ef1c hi\u1ec7n checkout, b\u1ea1n tr\u00edch xu\u1ea5t n\u1ed9i dung c\u1ee7a nh\u00e1nh, commit ho\u1eb7c tag \u0111\u00f3 v\u00e0o th\u01b0 m\u1ee5c l\u00e0m vi\u1ec7c c\u1ee7a m\u00ecnh.<\/span><\/p>\n
M\u1ed9t s\u1ed1 thu\u1eadt ng\u1eef quan tr\u1ecdng c\u1ee7a Git<\/em><\/figcaption><\/figure>\n4.4. Merge\u00a0<\/b><\/span><\/h3>\nMerge<\/b> l\u00e0 qu\u00e1 tr\u00ecnh k\u1ebft h\u1ee3p c\u00e1c thay \u0111\u1ed5i t\u1eeb m\u1ed9t nh\u00e1nh kh\u00e1c v\u00e0o nh\u00e1nh hi\u1ec7n t\u1ea1i. Qu\u00e1 tr\u00ecnh n\u00e0y c\u00f3 th\u1ec3 \u0111\u01a1n gi\u1ea3n ho\u1eb7c ph\u1ee9c t\u1ea1p t\u00f9y thu\u1ed9c v\u00e0o l\u1ecbch s\u1eed thay \u0111\u1ed5i c\u1ee7a hai nh\u00e1nh. Trong tr\u01b0\u1eddng h\u1ee3p c\u00f3 xung \u0111\u1ed9t h\u1ee3p nh\u1ea5t (khi c\u00f9ng m\u1ed9t d\u00f2ng code b\u1ecb thay \u0111\u1ed5i tr\u00ean c\u1ea3 hai nh\u00e1nh), b\u1ea1n c\u1ea7n gi\u1ea3i quy\u1ebft xung \u0111\u1ed9t th\u1ee7 c\u00f4ng tr\u01b0\u1edbc khi ho\u00e0n th\u00e0nh vi\u1ec7c h\u1ee3p nh\u1ea5t.<\/span><\/p>\n4.5. Remote<\/b><\/span><\/h3>\nRemote<\/b> l\u00e0 m\u1ed9t URL ho\u1eb7c t\u00ean tham chi\u1ebfu \u0111\u1ebfn m\u1ed9t kho l\u01b0u tr\u1eef Git kh\u00e1c, th\u01b0\u1eddng \u0111\u01b0\u1ee3c l\u01b0u tr\u1eef tr\u00ean m\u1ed9t m\u00e1y ch\u1ee7 t\u1eeb xa nh\u01b0 GitHub ho\u1eb7c GitLab. B\u1ea1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng c\u00e1c l\u1ec7nh Git \u0111\u1ec3 k\u1ebft n\u1ed1i v\u1edbi remote, push (g\u1eedi) c\u00e1c commit c\u1ee5c b\u1ed9 c\u1ee7a b\u1ea1n l\u00ean remote v\u00e0 pull (l\u1ea5y) c\u00e1c thay \u0111\u1ed5i t\u1eeb remote v\u1ec1 b\u1ea3n sao l\u01b0u tr\u1eef c\u1ee5c b\u1ed9 c\u1ee7a b\u1ea1n.<\/span><\/p>\n4.6. Master<\/b><\/span><\/h3>\nMaster <\/b>theo truy\u1ec1n th\u1ed1ng l\u00e0 nh\u00e1nh ch\u00ednh trong m\u1ed9t kho l\u01b0u tr\u1eef Git, ch\u1ee9a phi\u00ean b\u1ea3n \u1ed5n \u0111\u1ecbnh v\u00e0 \u0111ang ho\u1ea1t \u0111\u1ed9ng c\u1ee7a d\u1ef1 \u00e1n. C\u00e1c thay \u0111\u1ed5i \u0111\u01b0\u1ee3c coi l\u00e0 ho\u00e0n th\u00e0nh v\u00e0 s\u1eb5n s\u00e0ng \u0111\u1ec3 tri\u1ec3n khai th\u01b0\u1eddng \u0111\u01b0\u1ee3c h\u1ee3p nh\u1ea5t v\u00e0o nh\u00e1nh master. Tuy nhi\u00ean, trong c\u00e1c quy tr\u00ecnh l\u00e0m vi\u1ec7c hi\u1ec7n \u0111\u1ea1i, nhi\u1ec1u d\u1ef1 \u00e1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng t\u00ean kh\u00e1c cho nh\u00e1nh ch\u00ednh, ch\u1eb3ng h\u1ea1n nh\u01b0 “main”.<\/span><\/p>\n4.7. Index\u00a0<\/b><\/span><\/h3>\nIndex<\/b> c\u00f2n \u0111\u01b0\u1ee3c g\u1ecdi l\u00e0 khu v\u1ef1c d\u00e0n d\u1ef1ng (staging area), l\u00e0 m\u1ed9t khu v\u1ef1c t\u1ea1m th\u1eddi l\u01b0u tr\u1eef c\u00e1c t\u1ec7p b\u1ea1n \u0111\u00e3 ch\u1ecdn \u0111\u1ec3 commit. C\u00e1c t\u1ec7p trong index s\u1ebd \u0111\u01b0\u1ee3c ch\u1ee5p \u1ea3nh v\u00e0 l\u01b0u tr\u1eef trong commit ti\u1ebfp theo. B\u1ea1n c\u00f3 th\u1ec3 th\u00eam, x\u00f3a ho\u1eb7c s\u1eafp x\u1ebfp l\u1ea1i c\u00e1c t\u1ec7p trong index tr\u01b0\u1edbc khi th\u1ef1c hi\u1ec7n commit.<\/span><\/p>\n4.8. Rebase\u00a0<\/b><\/span><\/h3>\nRebase<\/b> l\u00e0 m\u1ed9t thao t\u00e1c cho ph\u00e9p b\u1ea1n \u00e1p d\u1ee5ng c\u00e1c commit t\u1eeb m\u1ed9t nh\u00e1nh l\u00ean nh\u00e1nh kh\u00e1c theo m\u1ed9t c\u00e1ch tuy\u1ebfn t\u00ednh. Rebase h\u1eefu \u00edch khi b\u1ea1n mu\u1ed1n gi\u1eef cho l\u1ecbch s\u1eed commit c\u1ee7a m\u00ecnh g\u1ecdn g\u00e0ng v\u00e0 d\u1ec5 \u0111\u1ecdc, nh\u01b0ng n\u00f3 c\u00f3 th\u1ec3 ph\u1ee9c t\u1ea1p h\u01a1n so v\u1edbi merge v\u00e0 c\u00f3 th\u1ec3 g\u00e2y ra v\u1ea5n \u0111\u1ec1 n\u1ebfu nh\u1eefng ng\u01b0\u1eddi kh\u00e1c \u0111\u00e3 pull c\u00e1c commit c\u1ee7a b\u1ea1n t\u1eeb nh\u00e1nh ban \u0111\u1ea7u.<\/span><\/p>\n4.9. Fetch<\/b><\/span><\/h3>\nFetch<\/b> l\u00e0 l\u1ec7nh \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 t\u1ea3i xu\u1ed1ng c\u00e1c thay \u0111\u1ed5i m\u1edbi nh\u1ea5t t\u1eeb kho l\u01b0u tr\u1eef Git t\u1eeb xa v\u1ec1 b\u1ea3n sao l\u01b0u tr\u1eef c\u1ee5c b\u1ed9 c\u1ee7a b\u1ea1n. Fetch kh\u00f4ng th\u1ef1c s\u1ef1 h\u1ee3p nh\u1ea5t c\u00e1c thay \u0111\u1ed5i v\u00e0o nh\u00e1nh c\u1ee5c b\u1ed9 c\u1ee7a b\u1ea1n. B\u1ea1n c\u1ea7n s\u1eed d\u1ee5ng l\u1ec7nh pull ho\u1eb7c merge \u0111\u1ec3 th\u1ef1c hi\u1ec7n vi\u1ec7c h\u1ee3p nh\u1ea5t.<\/span><\/p>\n4.10. Fork\u00a0<\/b><\/span><\/h3>\nFork<\/b> l\u00e0 m\u1ed9t t\u00ednh n\u0103ng c\u1ee7a c\u00e1c d\u1ecbch v\u1ee5 l\u01b0u tr\u1eef Git t\u1eeb xa nh\u01b0 GitHub, cho ph\u00e9p b\u1ea1n t\u1ea1o m\u1ed9t b\u1ea3n sao ho\u00e0n ch\u1ec9nh c\u1ee7a kho l\u01b0u tr\u1eef c\u1ee7a ng\u01b0\u1eddi kh\u00e1c. B\u1ea1n c\u00f3 th\u1ec3 th\u1ef1c hi\u1ec7n<\/span><\/p>\n4.11. Head<\/b><\/span><\/h3>\nHead<\/b> l\u00e0 m\u1ed9t con tr\u1ecf lu\u00f4n tr\u1ecf \u0111\u1ebfn commit m\u1edbi nh\u1ea5t trong nh\u00e1nh hi\u1ec7n t\u1ea1i b\u1ea1n \u0111ang l\u00e0m vi\u1ec7c. Khi b\u1ea1n th\u1ef1c hi\u1ec7n checkout m\u1ed9t nh\u00e1nh ho\u1eb7c commit c\u1ee5 th\u1ec3, head s\u1ebd di chuy\u1ec3n \u0111\u1ebfn v\u1ecb tr\u00ed t\u01b0\u01a1ng \u1ee9ng.<\/span><\/p>\n4.12. Tags\u00a0<\/b><\/span><\/h3>\nTags<\/b> l\u00e0 c\u00e1c \u0111\u00e1nh d\u1ea5u c\u1ed1 \u0111\u1ecbnh \u0111\u01b0\u1ee3c g\u1eafn v\u00e0o c\u00e1c commit c\u1ee5 th\u1ec3 trong kho l\u01b0u tr\u1eef Git. Tags h\u1eefu \u00edch \u0111\u1ec3 \u0111\u00e1nh d\u1ea5u c\u00e1c phi\u00ean b\u1ea3n quan tr\u1ecdng c\u1ee7a d\u1ef1 \u00e1n, ch\u1eb3ng h\u1ea1n nh\u01b0 b\u1ea3n ph\u00e1t h\u00e0nh ch\u00ednh th\u1ee9c ho\u1eb7c b\u1ea3n beta. Kh\u00e1c v\u1edbi commit, tags kh\u00f4ng thay \u0111\u1ed5i theo th\u1eddi gian v\u00e0 lu\u00f4n tr\u1ecf \u0111\u1ebfn c\u00f9ng m\u1ed9t commit.<\/span><\/p>\n
C\u00e1ch t\u1ea1o Git Tags<\/em><\/figcaption><\/figure>\n