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.
Contents
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ý
-
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
-
Developer fork từ repo gốc về 1 repo cá nhân trên server
-
Dùng git clone từ repo cá nhân trên server về local
-
Khai báo thêm upstream remote repo trỏ tới repo gốc trên server
-
Tạo nhánh phát triển trên repo local
-
Phát triển code trên nhánh mới này
-
Dùng git commit để ghi nhận thay đổi
-
Push nhánh đang phát triển lên repo cá nhân trên server
-
Từ repo cá nhân trên server, tạo merge/pull request update code sang repo gốc
-
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