You are on page 1of 42

1

GIT CĂN BẢN


P R E S E N TAT I O N B Y N G U Y E N N H U T H U O N G
2

NỘI DUNG CHÍNH


GIT LÀ GÌ?
Tìm hiểu về hệ thống quản lý phiên bản, tại sao phải sử dụng git
và mức độ quan trọng của git trong phát triển phần mềm

GIT HOẠT ĐỘNG NHƯ THẾ NÀO?


Nắm bắt được cách hoạt động của git để hiểu sâu hơn, xử lý các
vấn đề về git trong dự án

CÁCH SỬ DỤNG GIT


Tất cả các câu lệnh trong git đi kèm với vấn đề thực tế và ý nghĩa
sử dụng của nó

MÔ HÌNH GIT TRONG DỰ ÁN


Các mô hình phổ biến được sử dụng git trong các dự án thực tế,
tìm hiểu và áp dụng
3

GIT LÀ GÌ?
4 4

Vấ n đ ề h i ệ n t ạ i

• Nhiều người cùng làm việc trong một dự án

phần mềm và mỗi người sẽ thực hiện thay

đổi một phần code trong dự án.

• Một hệ thống lớn có các tính năng đã phát

hành và có tính năng vẫn còn đang phát

triển. Làm sao để quản lý các feature code

này?

• Một số dòng code bị sửa đổi hoặc bị xoá,

làm thế nào để quay lại phiên bản trước

đó?

• ...

© 2021 Devops – Git căn bản


5 5

Giới thiệu về Git

• Git là một hệ thống quản lý phiên bản

(Distributed Version Control System) được

sử dụng rộng rãi trong thế giới lập trình.

• Nhanh chóng, hiệu quả, dễ học và còn là

công cụ mã nguồn mở nên được sử dụng miễn

phí.

• Bất cứ lập trình viên nào cũng cần phải sử

dụng thành thạo git khi làm việc trong các

dự án ở mọi quy mô, từ nhỏ tới rất lớn.

© 2021 Devops – Git căn bản


6

GIT HOẠT ĐỘNG NHƯ THẾ NÀO?


7 7

Các thành phần trong Git

© 2021 Devops – Git căn bản


8 8

Re m o t e Re p o s i t o r y

© 2021 Devops – Git căn bản


9 9

3 t rạ n g t h á i c ủ a G i t f i l e s

3 trạng thái của một tệp bất kỳ

trong dự án sử dụng Git:

• Modified

• Staged

• Committed

Nắm bắt các trạng thái của git files

để theo dõi những sửa đổi (thêm,

sửa, xoá) code trong dự án.

© 2021 Devops – Git căn bản


10 10

Git HEAD

TERMINAL

$ git log
commit 0d4a808c26908cd5fe4b6294a00150342d1a58be
Author: Nguyễn Như Thưởng <thuongnn6666@gmail.com>
Date: Mon Jul 16 23:19:26 2012 +0900

Thêm mô tả về lệnh pull

commit 9a54fd4dd22dbe22dd966581bc78e83f16cee1d7
Author: Nguyễn Như Thưởng <thuongnn6666@gmail.com>
Date: Mon Jul 16 23:19:01 2012 +0900

Thêm mô tả về lệnh commit

commit 326fc9f70d022afdd31b0072dbbae003783d77ed
Author: Nguyễn Như Thưởng <thuongnn6666@gmail.com>
Date: Mon Jul 16 23:17:56 2012 +0900

Thêm mô tả về lệnh add

© 2021 Devops – Git căn bản


11 11

Git HEAD

TERMINAL

$ git log
commit 326fc9f70d022afdd31b0072dbbae003783d77ed
Author: Nguyễn Như Thưởng <thuongnn6666@gmail.com>
Date: Mon Jul 16 23:17:56 2012 +0900

Thêm mô tả về lệnh add

commit 48eec1ddf73a7fb508ef664efd6b3d873631742f
Author: Nguyễn Như Thưởng <thuongnn6666@gmail.com>
Date: Mon Jul 16 23:16:14 2012 +0900

first commit

© 2021 Devops – Git căn bản


12

CÁCH SỬ DỤNG GIT


13 13

Cài đặt Git

Mở terminal lên và kiểm tra git đã được cài đặt

thành công hay chưa.

$ git –version
git version 2.27.0

Tạo tài khoản trên https://github.com và cấu hình

Git username và email sau khi cài đặt.

$ git config --global user.name “Nguyen Nhu Thuong”


Link download: https://git-scm.com/downloads $ git config --global user.email “thuongnn6666@gmail.com”
$ git config –list
user.name=Nguyen Nhu Thuong
user.email=thuongnn6666@gmail.com

© 2021 Devops – Git căn bản


14 14

G i t Re p o s i t o r y

Khởi tạo một repository mới.

$ cd <path to project> && git init


Initialized empty Git repository in <path to project>

Clone từ một repository có sẵn

$ git clone https://github.com/thuongnn/example.git


Cloning into ‘example'...
remote: Enumerating objects: 20, done.
remote: Counting objects: 100% (20/20), done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 20 (delta 4), reused 14 (delta 2), pack-reused 0
Unpacking objects: 100% (20/20), 5.55 KiB | 473.00 KiB/s, done.

© 2021 Devops – Git căn bản


15 15

G i t Re p o s i t o r y

Tạo, chỉnh sửa các tệp tin trong dự án và thực

hiện lưu lại các thay đổi.

$ git add hello.py


$ git commit –m “added hello.py to the repo”
[master (root-commit) fcd62d0] added hello.py to the repo
1 file changed, 1 insertion(+)
create mode 100644 hello.py

Có thể kiểm tra các thay đổi trước khi add và

commit bằng lệnh sau

$ git status

© 2021 Devops – Git căn bản


16 16

G i t Re p o s i t o r y

Tạo remote repository trên github và thêm mới

remote connection cho project.

$ git remote add origin https://github.com/thuongnn/example.git

Thực hiện đẩy các thay đổi lên remote repository

$ git push origin master


Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 234 bytes | 234.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/thuongnn/example.git
* [new branch] master -> master

© 2021 Devops – Git căn bản


17 17

G i t b ra n c h l à g ì ?

• Nhánh Git cơ bản là một dòng phát triển

độc lập.

• Có thể tận dụng lợi thế của việc phân

nhánh khi làm việc trên các tính năng mới

hoặc sửa lỗi vì nó tách biệt công việc của

các thành viên trong nhóm dự án.

• Các nhánh khác nhau có thể được hợp nhất

thành bất kỳ một nhánh nào miễn là chúng

thuộc cùng một kho lưu trữ.

© 2021 Devops – Git căn bản


18 18

S ử d ụ n g G i t b ra n c h

Thực hiện tạo nhánh để bổ sung thêm tính năng mới

từ nhánh master.
master

$ git checkout -b new-feature


Switched to a new branch 'new-feature'

feature-x

*Với tham số –b cho phép sau khi tạo nhánh sẽ

checkout luôn sang nhánh mới đã được tạo.

© 2021 Devops – Git căn bản


19 19

S ử d ụ n g G i t b ra n c h

2 nhánh lúc này có các thay đổi cũng như lịch sử

commit độc lập với nhau. Các thay đổi trên

feature-x không ảnh hưởng tới master.


master
$ git add . && git commit -m "update feature-x"
[new-feature 10ac70a] update feature-x
1 file changed, 1 insertion(+), 1 deletion(-)
feature-x

Có thể chuyển đổi qua lại giữa các nhánh, đảm bảo

các thay đổi được commit trước khi chuyển đổi.

$ git checkout master


Switched to branch 'master'

© 2021 Devops – Git căn bản


20 20

S ử d ụ n g G i t b ra n c h

Tính năng x sau khi được hoàn thiện sẽ được thực

hiện merge vào nhánh master.

$ git checkout master


$ git merge new-feature
master Updating fcd62d0..10ac70a
Fast-forward
merge
hello.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
feature-x

Tương tự với merge, rebase cũng được dùng để tích

hợp 2 nhánh vào một.

$ git checkout master


$ git rebase new-feature
Successfully rebased and updated refs/heads/demo.

© 2021 Devops – Git căn bản


21 21

S o s á n h G i t m e r g e và r e b a s e

Before

After

© 2021 Devops – Git căn bản


22 22

S o s á n h G i t m e r g e và r e b a s e

Before

After

© 2021 Devops – Git căn bản


23 23

Git conflict là gì?

• Conflict là trạng thái code bị xung đột khi

thực hiện merge 2 nhánh với nhau

• Do sửa 2 commit cùng sửa một dòng code, mỗi

commit lại sửa một cách khác nhau

• Khi tạo Pull Request (PR), Github/Gitlab sẽ

báo lỗi ra phía cuối PR

© 2021 Devops – Git căn bản


24 24

Xử l ý c o n f l i c

Khi PR bị báo conflic, thực hiện checkout sang

nhánh feature (ở đây là alice)

$ git checkout alice

Thực hiện pull code mới nhất từ master về và

merge vào nhánh hiện tại.

$ git pull origin master


From https://github.com/thuongnn/example
* branch master -> FETCH_HEAD
Auto-merging hello.txt
CONFLICT (content): Merge conflict in hello.txt
Automatic merge failed; fix conflicts and then commit the result.

*Pull code mới nhất từ nhánh master vào nhánh

© 2021 Devops – Git căn bản alice sẽ tự động merge code (master -> alice)
25 25

Xử l ý c o n f l i c

Quá trình merge sẽ thông báo những file trong

project bị conflic, tiến hành sửa conflic code.

$ vi hello.txt
<<<<<<< HEAD
Hello Dog!
=======
Hello Cat!
>>>>>>> 43eb14b3eed1d0e0cb9397912104e86964b665e7

Sau khi fix thì commit thay đổi và đẩy lên remote

repo để tạo lại PR. Nếu chưa xử lý được conflic

thì có thể bỏ qua để fix sau.

$ git reset --hard HEAD


HEAD is now at ec5ab7e update hello.txt

© 2021 Devops – Git căn bản


26 26

Git reset

Git reset được dùng để quay về một điểm commit

nào đó, đồng thời xóa lịch sử của các commit

trước nó.

$ git reset --hard HEAD~2


Thêm mô tả HEAD is now at 326fc9f add

CÓ 3 cách reset như sau:

• git reset --soft B

• git reset B

• git reset --hard B

© 2021 Devops – Git căn bản


27 27

Git revert

Git revert là một lệnh trong git có tác dụng hoàn

nguyên lại một số commit nào đó đã tồn tại.

$ git revert HEAD~1


[master d47bb1d] Revert "Thêm giải thích pull"
1 files changed, 1 insertions(+), 2 deletions(-)

© 2021 Devops – Git căn bản


28 28

Lưu trữ code tạm thời với Git stash

Lưu lại các thay đổi hiện tại so với commit gần

nhất vào trong stack.

$ git stash save “Đang code dở mà bị dí cái bug”


Saved working directory and index state On master:
Đang code dở mà bị dí cái bug

Lúc này toàn bộ code sẽ reset về commit gần nhất

và có thể checkout sang nhánh khác để làm việc

bất kỳ (vd fixbug).

Xem thông tin trong stack hiện tại.

$ git stash list


stash@{0}: On master: Đang code dở mà bị dí cái bug

© 2021 Devops – Git căn bản


29 29

Lưu trữ code tạm thời với Git stash

(Sau khi giải quyết xong bug) Quay lại nhánh đang

làm việc lúc nãy và lấy các thay đổi được lưu

trong stash để áp vô thư mục hiện tại.

$ git stash pop


...
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (b3c575cb2e7211e7cd6c405e869845d6231aea4f)

*Chú ý: Các thay đổi của mỗi lần lưu vào stash

theo nguyên lý ngăn xếp, lệnh này sẽ lấy cái được

lưu lại gần nhất (trên cùng ngăn xếp)

© 2021 Devops – Git căn bản


30

Git Cheat Sheet

git clone [url] git fetch [alias]

Clone một repository có sẵn trên repo server về Kéo về toàn bộ các các nhánh từ Git remote về

máy thông qua URL local repository

git reset [file] git pull

Chuyển trạng thái một file về unstage nhưng vẫn Kéo về toàn bộ các thay đổi từ remote branch và

giữa các thay đổi của file đó merge vào local repository

git diff git log

Xem những thay đổi của file nhưng chưa staged Xem toàn bộ lịch sử commit của nhánh hiện tại

git diff --staged


XEM NHIỀU HƠN
Xem những thay đổi của file đã staged nhưng chưa

được commit
31

MÔ HÌNH GIT TRONG DỰ ÁN


32 32

G i t Wo r k f l o w

• Git workflow là một branch model

gọi là A successful Git branching

model do Vincent Driessen đề xuất

ra.

• Có 5 kiểu branch được định nghĩa

ra và những rule được đặt ra yêu

cầu tuân thủ trong quá trình phát

triển phần mềm.

• Đây là mô hình được sử dụng phổ

biến nhất hiện nay.

© 2021 Devops – Git căn bản


33 33

G i t Wo r k f l o w : D e v e l o p và M a s t e r B ra n c h

• Hai branch develop và master

luôn tồn tại trong toàn bộ vòng

đời dự án.

• Nhánh master lưu trữ các source

code release của dự án.

• Nhánh develop lưu trữ các source

code của các tính năng đã phát

triển và sắp release trong chu

kỳ sắp tới.

© 2021 Devops – Git căn bản


34 34

G i t Wo r k f l o w : Fe a t u r e B ra n c h e s

• Khi cần phát triển một tính năng

mới, tạo mới một nhánh feature

từ nhánh develop

• Sau đó phát triển tính năng

xong, merge nó trở lại nhánh

develop và xóa nhánh feature đó

đi.

• Có thể phát triển song song

nhiều nhánh feature đồng thời.

© 2021 Devops – Git căn bản


35 35

G i t Wo r k f l o w : Re l e a s e B ra n c h e s

• Khi đến chu kỳ release sản phẩm,

tạo một nhánh mới từ nhánh

develop.

• Sau khi hoàn thành tiến hành

merge tới nhánh master với một

tag là version number và đồng

thời cũng merge trở lại nhánh

develop.

• Cuối cùng xóa nhánh release này.

© 2021 Devops – Git căn bản


36 36

G i t Wo r k f l o w : H o t f i x B ra n c h e s

• Nhánh hotfix sử dụng để nhanh

chóng fix một lỗi nghiêm trọng

trên production.

• Sau khi fix và test xong hotfix

được merge vào lại nhánh master

và develop.

• Cuối cùng xóa nhánh hotfix này

© 2021 Devops – Git căn bản


37 37

G i t Wo r k f l o w : B u g f i x B ra n c h e s

Các lỗi thông thường được fix

trong nhánh bugfix:

• Lỗi trên nhánh develop do

tester report bug.

• Lỗi trên nhánh master nhưng

không cần fix ngay lập tức mà

sẽ fix trong bản release tương

lai. Nếu cần fix ngay lập tức

sẽ là hotfix.

© 2021 Devops – Git căn bản


38

Tổng kết

• Nhánh develop và master luôn luôn tồn tại. Khởi đầu nhánh develop được tạo từ nhánh master.

• Nhánh release được tạo từ nhánh develop

• Nhánh feature hoặc bugfix được tạo từ nhánh develop

• Nếu một lỗi nghiêm trọng xảy ra trên nhánh master thì tạo nhánh hotfix từ nhánh master

• Sau khi hoàn thành, nhánh release được merge lại vào nhánh master và nhánh develop

• Sau khi hoàn thành, nhánh feature hoặc bugfix được merge lại vào nhánh develop

• Sau khi hoàn thành, nhánh hotfix được merge lại vào nhánh master và nhánh develop

38
39

ƯU ĐIỂM NHƯỢC ĐIỂM

• Đảm bảo trạng thái gọn sạch của các • Git history khó đọc.

nhánh tại bất cứ thời điểm nào trong • Việc phân chia master/develop là cho

vòng đời của dự án. việc tích hợp CI/CD trở nên khó hơn.

• Các nhánh đặt tên theo một mô hình có • Không được khuyến khích dùng khi dự án

hệ thống làm cho nó dễ hiểu hơn. bảo trì một version duy nhất trong

• Có công cụ riêng hỗ trợ trong quá trình production.

sử dụng gitflow.

• Đây là một ý tưởng tốt cho những dự án

cần có nhiều version cho production.

39
40 40

G i t h u b Wo r k f l o w

• Nhánh master là nhánh duy nhất luôn tồn tại trong toàn bộ vòng đời dự án. Mọi thứ trên nhánh

này đều có thể deploy bất cứ lúc nào

• Tạo một tính năng mới phát triển trên nhánh feature được checkout từ nhánh master

• Developer hoàn thiện tính năng - sẵn sàng merge code, Developer sẽ tạo một pull request

• Pull request được code review và được merge vào nhánh master

• Sau khi tính năng mới được thêm vào, dự án có thể deploy ngay lập tức

© 2021 Devops – Git căn bản


41

ƯU ĐIỂM NHƯỢC ĐIỂM

Github Flow là một mô hình đơn giản hơn • Vì chỉ có một nhánh duy nhất,

rất nhiều so với Git Flow, vì vậy nó có "production" code trở nên không ổn định

những ưu điểm đáng chú ý dưới đây mà có (production code gây ra bug bất cứ lúc

thể cân nhắc áp dụng nó vào dự án: nào vì các developer đẩy code vào một

• Đơn giản không phức tạp, giúp cho các nhánh duy nhất).

developers dễ dàng tiếp cận hơn. • Nhánh master luôn được cập nhật những

• Đối với dự án phát triển và bảo trì một feature mới nhất vì thế Github Flow

version duy nhất, deploy thường xuyên không khuyến khích cho những dự án bảo

thì đây là lựa chọn tốt nhất. trì nhiều version trong production.

• Dễ dàng triển khai và áp dụng CI/CD.

41
42

Thanks for watching


Email: thuongnn6666@gmail.com

You might also like