Back
git-mastery-dan-tech-academy

Kiến thức về các khái niệm cơ bản trong Git

Để bắt đầu sử dụng Git thành thạo, bạn cần phải nắm được cốt lõi các khái niệm cơ bản.

Trong bài viết này mình chia sẻ cho các bạn các khái niệm cơ bản cốt lõi của Git, chúng sẽ đi theo bạn xuyên suốt trong quá trình học lập, phát triển nghề Software Engiener (Kỹ sư lập trình) này.

repository, commit, branch, remote, merge, conflict, push, fetch, pull

Repository

Cách tạo 1 Git Repository từ Local

Repository: Dịch ra Tiếng Việt nghĩa là Kho chứa.

Mỗi một dự án phần mềm thường sẽ được lưu trữ trong 1 Repository. Nơi đây chứa tất cả thông tin về History của dự án.

Để tạo 1 Repository từ máy tính cá nhân (Local) bạn có thể sử dụng dòng lệnh sau

mkdir first-repo // tạo folder chứa repository
cd first-repo // di chuyển con trỏ folder đến thư mục của repo cần tạo
git init // lệnh tạo repository

Hình ảnh mô tả cách tạo Git Repository từ Terminal

Bên trong 1 Git Repository có gì?

Bên trong Git Repository có gì?

Bên trong mỗi Git Repository sẽ có 1 folder .git , trong thư mục này sẽ chứa tất cả thông tin về Git history của Repo đó. Trong suốt quá trình sử dụng, phát triển phần mềm. Lập trình viên tuyệt đối không nên thêm, xóa, hay chỉnh sửa tùy tiện folder này vì sẽ có khả năng làm ảnh hưởng đến trạng thái của Git Local.

Commit

Commit là gì?

Commit là đơn vị nhỏ nhất trong Git Repo. 1 Git Commit chứa đựng các thông tin về thay đổi của các file trong 1 repository.

Git sẽ Snapshot lại các thay đổi này, và add chúng vào history. Toàn bộ Git History sẽ là chuỗi các thông tin của các Git Commit.

Các thông tin cơ bản của 1 Git Commit:

Thông tinCông dụng
UserThông tin của người thực hiện commit – thông tin này dùng để trace back lại trong trường hợp có vấn đề xảy ra ta sẽ biết chính xác ai đã thực hiện thay đổi này
TimeThời điểm thực hiện commit
MessageThông tin này là cần thiết để người review code có thể hiểu được ý đồ của người đã thực hiện commit. Các Commit message cần được viết ngắn gọn, rõ nghĩa.
Hash idThông tin này được git tạo ra dùng để đánh dấu duy nhất 1 git commit tại 1 thời điểm. Git Commit Hash có ích trong nhiều trường hợp nâng cao: checkout commit, rebase, cherry pick, drop, squash commits, …
ChangesThông tin về các thay đổi của các file trong dự án.
Các thay đổi có thể là Add File, Remove File, Modify File, Rename File
Các thông tin trong 1 Git commit

Trạng thái Staging trong Git Commit

Staging (or Staged) là một trạng thái mà ở đó các thay đổi của File được sẵn sàng cho lần Commit tiếp theo.

Trong quá trình sử dụng Git, các File thay đổi muốn được commit phải được add vào trạng thái Staging. Mục đích của trạng thái này là để ta có thể thực hiện việc chia nhỏ nhiều Commit khác nhau cho 1 lần thay đổi file. Nó rất tiện dụng cho các tính năng lớn, cần tách nhỏ các thay đổi dể dễ bề kiểm soát.

Giải thích dễ hiểu về Staging Area trong Git

Cách thực hiện 1 Git Commit

Để thực hiện 1 Git Commit trước hết chúng ta phải có file change. Bạn có thể tạo 1 File bằng dòng lệnh sau

touch newfile.txt
echo "this is content" >> newfile.txt
ls

Tạo 1 file mới cho Git Repository của bạn

Tiếp theo hãy kiểm tra xem trạng thái của newfile.txt đang như thế nào trong Git Repo

git status

File newfile.txt đang hiện đỏ, ở trạng thái Untracked. Lúc này nếu bạn cố gắng commit sẽ không được vì Staging Area không có file nào.

Để add newfile.txt vào Staging Area bạn dùng lệnh sau

git add newfile.txt
git status // to check status of git repo after add new file

Git add sử dụng command line

Bây giờ newfile.txt đã ở trong Staging Area. Giả sử bạn muốn remove newfile.txt khỏi Staging Area thì dùng cách nào?

git reset HEAD -- newfile.txt
git status

Ok, test thử đến đây thôi. Giờ bạn hãy add newfile.txt vào Git Staging Area lại 1 lần nữa để bước sang tiếp thực hiện Commit nhé.

git commit -m"First commit, add newfile.txt"

Sau khi đã commit làm cách nào để xem lại các Git Commit đã thực hiện?

git log

Để thoát khỏi giao diện git log bạn nhấn nút Q nhé

Giao diện Git log

Branch

Branch: Nhánh

Branch là gì?

Trong quá trình phát triển phần mềm sẽ có rất nhiều tính năng (feature) được tổ chức phát triển song song độc lập so với nhau. Branch được tạo ra để giải quyết vấn đề này.

Các Git Branch sẽ tồn tại song song với nhau, không ảnh hưởng đến nhau trong suốt quá trình phát triển phần mềm.

Thông thường các dự án sẽ được tổ chức với 1 Branch chính (thường tên là main, master, develop), và các branch tính năng sẽ được tạo từ branch chính để phát triển các tính năng. Khi các tính năng đã phát triển và sẵn sàng để Release, người ta sẽ merge chúng vào Branch chính lại 1 lần nữa. Và quá trình này tiếp tục tiếp diễn trong suốt hành trình phát triển phần mềm.

Cách tạo 1 Branch

Để tạo được 1 branch bạn có thể sử dụng 1 trong các dòng lệnh sau

git branch <branch-name> // tạo 1 branch
git checkout -b <branch-name> // tạo 1 branch và switch sang branch đó
git checkout <branch-name> // switch sang 1 branch đã có sẵn

Tạo Git branch thông qua CLI

Từ sau khi bạn checkout sang branch mới. Tất cả các thay đổi của bạn sẽ nằm trên branch mới mà không còn dính dáng gì đến branch trước đó nữa.

Merge

Merge: gộp chung

Khái niệm về Git Merge

Sau quá trình phát triển tính năng, hoặc các chỉnh sửa trên các branch riêng. Chúng ta cần đồng bộ những thay đổi đã có trên các branch mới lên branch chính (main, develop, master). Merge là tính năng mà Git cung cấp để giải quyết vấn đề này. Mỗi lần Merge sẽ cần có 2 Git Branch tham gia: Merge branch -> Base branch;

Giả sử bạn muốn Merge branch feature/001 vào branch main thì: main là Base branch, còn feature/001 là Merge branch.

Các khái niệm này sẽ dần dần bị loại bỏ khỏi tâm trí khi bạn trở nên Master với Git.

Thực hành Git Merge

Khi bạn muốn merge branch feature/my-first-branch vào nhánh main hãy thực hiện các bước sau

git checkout main // chuyển sang main 
git merge feature/my-first-branch // thực hiện việc merge
git log // xem log commit để thấy commit merge

Mô phỏng merge 2 Git branch bằng CLI

Conflict

Conflict: Xung đột

Conflict xảy ra khi giữa 2 branch không thể merge với nhau 1 cách tự động. Conflict có thể diễn ra trên 1 hoặc nhiều file trong 1 lần merge.

Mỗi khi merge, nếu có conflict xảy ra bạn phải tự solve nó. Có thể dùng các Tool hỗ trợ (mình sẽ hướn dẫn nhiều hơn trong khóa học), hoặc là tự solve bằng tay theo blog này.

Cách giả lập Conflict trong Git

Ở branch main bạn tạo file main.txt, và commit sự thay đổi này.

git checkout main
touch main.txt
git add main.txt
git commit -m"add main txt from main"
Giả lập Git Conflict

Tạo và switch sang branch mới tên là feature/simulate-conflict. Sau đó viết nội dung lên file main.txt và commit

git checkout -b feature/simulate-conflict
echo "write content to main txt from simulate conflict" >> main.txt
git add main.txt
git commit -m"commit change main txt from simulate conflict"

Giả lập Git Conflict

Chuyển sang branch main, thay đổi nội dung trong file main.txt và commit

git checkout main
echo "write content to main txt from main" >> main.txt
git add .
git commit -m"write content from main"

Giả lập Git Conflict

Merge branch feature/simulate-conflict vào main và chứng kiến conflict

git merge feature/simulate-conflict

Giả lập Git Conflict

Cách xử lý Merge Conflict trong Git

Để xem được Conflict bạn có thể sử dụng lệnh git status

Khi mở file main.txt bằng VS Code (hoặc bất kỳ Editor) bạn sẽ thấy Conflict xảy ra.

Giờ thì sửa conflict theo ý bạn rồi commit lên thôi :D. Mình chọn cách giữ lại content của cả 2 Branch

Sau đó commit các thay đổi

git add .
git commit -m"solve conflict"
git log

Remote, Push

Remote trong Git chứa thông tin nơi mà bạn sẽ lưu Git Repository Online. Mỗi Git Repo sẽ có thể có nhiều Remote. Nhưng phần lớn chúng ta sẽ chỉ làm việc với Remote mặc định (remote origin)

Push là hành động đẩy các thay đổi của 1 Git Branch lên Remote. Hãy hình dung Git branch của bạn trên Remote chỉ có 3 commit, Git branch ở Local có 10 commit. Và bạn muốn người đồng nghiệp ở cách mình 1200km có được đầy đủ 10 commit đó. Push giải quyết được vấn đề này.

git push

Ngoại lệ xảy ra khi Remote có những commit mới hơn ở Local. Khi này ta buộc phải Fetch, hoặc Pull trước để đảm bảo Local phải được đồng bộ với Remote trước khi Push

Chi tiết về kỹ thuật anh em mua khóa học Git Mastery để nghe sâu hơn nha.

Fetch, Pull

Fetch là hành động lấy các thông tin của Git Repository từ Remote về, nhưng chưa apply vào Local. Chỉ lấy về để kiểm tra xem có gì mới hay không?

git fetch

Pull là hành động lấy các thông tin của Git Repository từ Remote về, và apply thẳng vào Local. Trường hợp này sẽ có khả năng xảy ra Pull Conflict. Chi tiết anh em tham khảo khóa học nhé!

git pull

Ăn đủ chất, Ngủ đủ giấc!