
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

Bên trong 1 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 tin | Công dụng |
User | Thô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 |
Time | Thời điểm thực hiện commit |
Message | Thô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 id | Thô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, … |
Changes | Thô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 |
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.

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

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

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é

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ừ 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

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"

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"

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"

Merge branch feature/simulate-conflict vào main và chứng kiến conflict
git merge feature/simulate-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