Sử dụng git

0
1893

Git ( /ɡɪt/) là phần mềm quản lý mã nguồn phân tán được phát triển bởi Linus Torvalds vào năm 2005, ban đầu dành cho việc phát triển nhân Linux. Hiện nay, Git trở thành một trong các phần mềm quản lý mã nguồn phổ biến nhất. Git là phần mềm mã nguồn mở được phân phối theo giấy phép công cộng GPL2.

Sử dụng git

Sử dụng cơ bản

Khởi tạo repo

git init

Kiểm tra trạng thái repo

git status
  • Code mới nhất đã được ghi nhận ⇒ không có gì thay đổi
  • Nếu đã có thay đổi chưa được ghi nhận ⇒ cảnh báo “untracked files”

Khai báo nội dung thay đổi cần được ghi nhận

git add <filename>

Ghi nhận thay đổi (của những file đang track)

git commit -m "Comment"

Xem lịch sử thay đổi

git log

Khai báo remote repo

git remote add <reponame> <URL>

Liệt kê các remote repo

git remote

Ghi thay đổi lên remote repo (đẩy cả nhánh)

git push -u <reponame> <remote_branchname>

Sau khi dùng tham số -u rồi thì đã đăng ký mặc định làm việc với remote_branch đó, từ lần sau chỉ cần “git push” là đẩy lên

Lấy thay đổi từ remote repo về local

git pull <reponame> <remote_branchname>

Check nội dung thay đổi lần cập nhật gần nhất (sau khi pull)

git diff HEAD

Check nội dung thay đổi đã add trước khi commit (chưa được ghi nhận)

git diff --staged

Đổi ý sau khi add (Cancel)

git reset <filename>
  • git status sẽ cảnh báo có file thay đổi chưa được track

Revert thay đổi nội dung file (lấy lại bản gốc)

git checkout -- <filename>

Tạo nhánh mới

git branch <branchname>

Liệt kê các nhánh

git branch

Chuyển nhánh làm việc

git checkout <branchname>

Bỏ file khỏi branch

git rm <filename>

Gộp thay đổi từ nhánh (cần thận trọng)

Đứng từ nhánh muốn gộp về, gõ lệnh sau:

git merge <branchname>

Xóa nhánh

git branch -d <branchname>

Xóa nhánh ở remote repo

git push <reponame> :<branchname>

Ứng dụng git

Centralized workflow

  • Mô hình sử dụng 1 repo chung duy nhất với một nhánh master
  • Người dùng có môi trường phát triển local
  • Mọi thay đổi được cập nhật lên nhánh master trên server
  • Mô hình này thích hợp với team nhỏ hoặc mới chuyển từ SVN sang chưa quen với các tính năng của git
  • Do làm việc trên cùng 1 nhánh master của server, rất dễ xảy ra conflict khi 2 người dùng thay đổi nội dung 1 file. Hướng xử lý: khi người cập nhật sau bị báo lỗi conflict, cần update code mới từ master để phát hiện vị trí conflict và fix trên môi trường local (trước khi cập nhật code mới lên server phải luôn cập nhật code mới từ server về)

    git pull --rebase origin master
    CONFLICT (content): Merge conflict in <some-file>
    git status
    # Unmerged paths:
    # (use "git reset HEAD <some-file>..." to unstage)
    # (use "git add/rm <some-file>..." as appropriate to mark resolution)
    #
    # both modified: <some-file>
    git add <filename>
    git rebase --continue

Tham khảo: Centralized workflow

Feature Branch workflow

  • Đây là mô hình cơ bản ứng dụng của git
  • Ý tưởng cơ bản là checkout từ master ra một nhánh riêng để phát triển, sau đó push nhánh này lên server và tạo pull request để merge vào master, có người review phê duyệt để chấp nhận.

Gitflow workflow

  • Master: là phiên bản code mới nhất hoạt động ổn định (stable), có thể coi là latest release version, có thể giao product manager quản lý
  • Develop: là nhánh thường trực dùng cho phát triển phần mềm, có thể giao product development manager quản lý, khi hoàn thiện đủ để release 1 version mới sẽ merge sang Master (có thể thông qua 1 nhánh release hoặc staging)

    git branch develop
    git push -u origin develop
  • Feature: là các nhánh chức năng checkout từ Develop, dùng cho phát triển 1 tính năng (feature) cụ thể, sau khi hoàn thành sẽ merge lại vào Develop

    git checkout develop
    git checkout -b feature_branch
    ......
    git checkout develop
    git merge feature_branch
    git branch -d feature_branch
  • Release/Staging: là nhánh để chuẩn bị cho việc release version mới, khi Develop hoàn thiện đủ để release 1 version mới, ta không merge trực tiếp vào Master mà đẩy ra 1 nhánh Release để test hoàn thiện trước khi confirm chắc chắn kéo về Master, ngoài ra nhánh này có thể lưu giữ lại theo từng version phát triển

    git checkout develop
    git checkout -b release/0.1.0
    ......
    git checkout develop
    git merge release/0.1.0
    ......
    git checkout master
    git merge release/0.1.0
  • Hotfix: là nhánh checkout trực tiếp từ Master dùng cho mục đích fix nhanh 1 lỗi cụ thể trên môi trường production, sau khi hoàn thành sẽ được merge vào cả Master và Develop

    git checkout master
    git checkout -b hotfix_branch
    ......
    git checkout master
    git merge hotfix_branch
    git checkout develop
    git merge hotfix_branch
    git branch -D hotfix_branch

Forking workflow

  1. Developer fork từ repo gốc về 1 repo cá nhân trên server
  2. Dùng git clone từ repo cá nhân trên server về local
  3. Khai báo thêm upstream remote repo trỏ tới repo gốc trên server
  4. Tạo nhánh phát triển trên repo local
  5. Phát triển code trên nhánh mới này
  6. Dùng git commit để ghi nhận thay đổi
  7. Push nhánh đang phát triển lên repo cá nhân trên server
  8. Từ repo cá nhân trên server, tạo merge/pull request update code sang repo gốc
  9. Code được review và merge vào repo gốc

Lựa chọn workflow

Khi lựa chọn một flow để triển khai áp dụng cần cân nhắc những yếu tố sau:

  • Vấn đề scale khi team có thêm nhân sự
  • Có dễ dàng xử lý conflict và reverse khi xảy ra lỗi?
  • Workflow có gây khó khăn hơn nhiều cho team không?

Leave a Reply

avatar
  Subscribe  
Notify of