Tự học Git từ cơ bản đến nâng cao (Phần 1)

Bao Truong Quoc
Chim cu chăm code
Published in
7 min readFeb 21, 2020

Giới thiệu

Sau nhiều ngày học và làm việc với git, mình quyết định tổng hợp lại các kiến thức của mình và chia sẻ cho mọi người. Series này của mình giới thiệu đến các bạn các kiến thức git từ cơ bản đến nâng cao. Trong phần 1, mình tổng hợp cách cài đặt git và một số lệnh git cơ bản khi làm việc trên nhánh.

1. Cài đặt Git và tạo một Project mới trên Gitlab

Tải xuống và cài đặt Git để sử dụng https://git-scm.com/downloads

Đăng ký và đăng nhập vào Gitlab trên website chính thức https://gitlab.com/

Cấu hình chung

Bước này dùng để cấu hình các thông tin như user name, email (sẽ hiển thị trên commit).

git config — -global user.name “user_name” // ex: “Bao Truong”

git config — -global user.email “email” // ex: “tqbao3001@gmail.com”

Để cấu hình cho riêng từng dự án thì bỏ — -global đi.

Clone dự án từ remote về

Tạo mới một dự án trên Gitlab và clone về máy sử dụng dụng các lệnh sau:

git clone https://gitlab.com/baotruong/git-tutorial.git

cd git-tutorial

touch README.md

git add README.md

git commit -m “add README”

git push -u origin master

Video hướng dẫn

Đẩy dữ liệu có sẵn lên 1 repo trên git

Đẩy dữ liệu lên Gitlab từ một folder đã tồn tại trong PC của bạn

cd existing_folder

git init

git remote add origin https://gitlab.com/baotruong/git-tutorial.git

git add .

git commit -m “Initial commit”

git push -u origin master

Video hướng dẫn

Note: Khi thực hiện Push an existing folder mà Gitlab của bạn đã có nhánh master thì sẽ phát sinh lỗi, xem Video hướng dẫn phía trên để sửa lỗi nhé!

Như vậy ta đã có một repo ở local để thực hiện các thao tác khác. Dưới đây là những thao tác cơ bản đối với nhánh.

2. Một số lệnh cơ bản

2.1. Tạo mới một nhánh

Để tạo mới một nhánh đơn giản là dùng lệnh git checkout. Khi thực hiện lệnh này trên nhánh nào, thì nhánh mới sẽ giống hoàn toàn nhánh đó. Tham số -b trong lệnh checkout là để chỉ việc tạo mới một nhánh.

Ví dụ:

git checkout master
git checkout -b new_branch

Kết quả là new_branch sẽ có code và lịch sử giống hoàn toàn với master.

2.2. Liệt kê danh sách các nhánh

Để liệt kê danh sách các nhánh ta dùng lệnh git branch. Kết quả trả về là toàn bộ các nhánh có trong repo. Trong đó nhánh có dấu hoa thị * là nhánh hiện tại ta đang đứng.

Ví dụ:

git branch
* develop
master

Như trên là ta đang ở nhánh develop.

Note: Lệnh git branch -a liệt kê tất cả các nhánh có trên remote (gitlab).

2.3. Chuyển đổi qua lại giữa các nhánh

Để chuyển đổi qua lại giữa các nhánh, ta dùng lệnh git checkout TÊN_NHÁNH. Chú ý là không có tham số -b nhé.

Ví dụ:

git checkout develop
Switched to branch 'develop'
git checkout master
Switched to branch 'master'

2.4. Lưu thay đổi ở local

Trong trường hợp bạn chuyển sang nhánh mới khi đang code dang dở, thì sẽ bị yêu cầu commit code, tuy nhiên không phải lúc nào bạn cũng muốn commit code cả. Có một cách là sẽ đẩy toàn bộ working tree hiện tại vào stash bằng lệnh git stash. Sau đó khi muốn lấy lại working tree đang làm thì dùng lệnh git stash pop để lấy ra.

Ví dụ:

git stashgit checkout dev
... Do something ....
... Done, and back to master ....
git checkout master
git stash pop

2.5. So sánh thay đổi giữa các branch

Nếu bạn muốn so sánh các commit hoặc các file khác biệt giữa hai nhánh bất kỳ thì dùng lệnh git diff.

Ví dụ so sánh develop (nhánh hiện tại) với master

git diff master

Nếu chỉ muốn xem tên những file khác nhau ở nhánh develop (nhánh hiện tại) với master thì dùng thêm tham số --name-only .

git diff master --name-only

2.6. Đẩy mã nguồn một local branch lên remote branch

Cái này đơn giản là ta checkout đến nhánh muốn đẩy, commit code xong rồi push lên remote origin thôi.

Ví dụ:

git checkout develop
git add README.md
git commit -m "Update README.md"
git push origin develop

Code trên nhảy đến nhánh develop sẽ đẩy lên nhánh develop ở remote origin.

Note: git add . sẽ đẩy tất cả các file có trong folder.

2.7. Cập nhật local branch với thay đổi ở remote branch

Khi hai người cùng làm việc trên một nhánh, việc người này phải cập nhật code mới của người kia là điều bình thường. Để làm việc này dùng lệnh git pull.

Ví dụ:

git pull origin master

Lệnh trên sẽ kéo code từ nhánh master trên remote repo về nhánh ở local hiện tại.

Note:

  1. Bạn có thể từ nhánh này pull code nhánh khác về, ví dụ pull code nhánh develop về master.
  2. Bạn phải có thiết lập remote repo rồi thì mới pull được, dùng git remote -v để kiểm tra tên và URL của remote repo.
  3. Lệnh git pull bên trong sẽ thực hiện hai lệnh git fetchgit merge
  4. Lệnh git pull sẽ tự động fast-forward nếu có thể, nên nếu muốn luôn luôn tạo ra một merge commit để dễ quản lý và khôi phục thì nên dùng thêm đối số --no-ff. ví dụ
git pull origin master --no-ff

Lúc này bạn luôn phải nhập merge commit message cho lần pull đó.

Ưu điểm : Cái này tiện là sau này đọc log sẽ biết bạn pull code vào lúc nào, tránh trường hợp có quá nhiều commit con được merge vào gây khó quản lý và khôi phục khi có lỗi xảy ra.

Nhược điểm: Sẽ gom các commit con lại thành một, nên khi bị lỗi phải gỡ bỏ, thì phải gỡ luôn cả cục đi. Đôi khi phải gỡ đi cả những tính năng chạy được. Vì vậy nên khi commit và tạo pull request thì nên tạo theo một tính năng cụ thể, tránh hỗn hợp lộn xộn.

2.8. Xóa nhánh

Để xóa một nhánh thì đơn giản là bạn dùng câu lệnh git branch -d TÊN_NHÁNH để xóa một nhánh bất kỳ.

Ví dụ:

git branch -d dev

Câu lệnh trên sẽ xóa nhánh dev nếu thỏa hai điều trên. Trong đó tham số -d (viết thường) là ám chỉ việc chỉ xóa nhánh khi nhánh đó đã đồng bộ với nhánh trên upstream tương ứng hoặc đã merge thành công vào HEAD hiện tại. Nếu bạn muốn xóa dev bằng mọi giá thì hãy dùng chữ -D (D hoa) thì Git sẽ xóa nhánh bất chấp bất cứ điều gì xảy ra.

Lý thuyết sâu hơn :

1) Tại sao khi dùng -d lại phải thỏa điều kiện đồng bộ với nhánh trên upstream tương ứng hoặc merge thành công vào HEAD hiện tại ?

Trả lời câu hỏi thứ nhất, đơn giản là vì Git không muốn bạn bị mất mã nguồn trên nhánh bị xóa, nên nó mới đòi hỏi bạn phải merge nhánh đó vào đâu đó hoặc push code lên nhánh upstream tương ứng trên remote repo đã.

2) Khi nào nên dùng -D ?

Khi bạn biết chắc chắn code trên nhánh bạn muốn xóa không có giá trị gì hết, nên không cần thiết phải đồng bộ lên remote hay merge gì cả. Thường là nhánh tạo ra để thử nghiệm cái gì đó thôi, xong rồi thì xóa đi.

Nhận xét và kết luận

Sau bài học này mình đã giới thiệu đến mọi người các kỹ thuật Git hay dùng trên một nhánh, hiểu các kỹ thuật này sẽ giúp bạn làm việc với Git thuận tiện và chuyên nghiệp hơn.

Ở bài học tiếp theo, chúng ta tìm hiểu tiếp một số lệnh cơ bản của Git và xử lý xung đột trên branch khi merge.

--

--