Advanced Git (edit)
Git Common Line Interface - @manhng
Bỏ thay đổi đang có
git checkout -f
git clean -d -f -f
git reset --hard
git reset --hard HEAD
Sử dụng Git cho làm việc lập trình nhóm (giaidieu.com)
Bài 4: Hướng dẫn sử dụng Git - Các lệnh cơ bản cần phải biết (aptechbmt.edu.vn)
Cách phân nhánh và chia việc trong nhóm với Git – Ehkoo (HAY HAY HAY)
Nhánh master sẽ là nơi chứa phần code ổn định nhất, sẵn sàng để triển khai bất cứ lúc nào.
Nhánh dev ban đầu được tách ra từ master, và sẽ chứa phần code mới nhất được phát triển.
Nhánh login ban đầu được tách ra từ dev, và sẽ chứa phần code được phát triển cho chức năng login.
git init
git config --global user.name “Tên của bạn”
git config --global user.email “Địa chỉ email của bạn”
git status
git add .
git remote -v (để kiểm tra xem mình đã cấu hình tới máy chủ từ xa nào chưa, địa chỉ là gì)
git remote add origin "https://github.com/manhng83/demo" (thiết lập kết nối với kho lưu trữ từ xa bằng lệnh git remote add)
git commit -m "commit message"
git pull (lấy các nội dung từ kho lưu trữ từ xa về kho lưu trữ cục bộ)
git pull origin master
git pull origin master --allow-unrellated-histories (hợp nhất tất cả các commit trên kho lưu trữ từ xa về kho lưu trữ cục bộ một cách bắt buộc)
git log --oneline (để xem nhanh lịch sử commit trên máy tính cục bộ đã thay đổi thế nào)
git push (đẩy các nội dung từ kho lưu trữ cục bộ lên kho lưu trữ từ xa, có thể cần phải vào Control Panel > Credential Manager để xóa các tài khoản đã lưu trước đây)
git push origin master
git branch (xem nhánh hiện tại)
git branch dev (tạo nhánh mới)
git checkout -b dev (tạo nhánh mới và chuyển sang nhánh đó)
git checkout -b dev master (tạo nhánh mới từ nhánh gốc master và chuyển sang nhánh vừa tạo đó)
git add . commit -m "Update Login API" (gộp 2 lệnh trên 1 dòng lệnh)
git log --all --oneline (kiểm tra lịch sử commit)
git push origin dev
git merge (hợp nhất các nhánh)
Lưu ý: Trước tiên, bạn phải checkout nhánh đích, tức là nhánh mà bạn muốn hợp nhất vào.
git checkout master
git pull origin master (thông thường developer sẽ quên lệnh này)
git merge dev (bạn phải đang ở nhánh master)
git checkout master
git merge dev
git log --oneline --all
git rebase (hợp nhất các nhánh)
git checkout dev
....
git rebase master (lệnh này sẽ chuyển tất cả commit từ nhánh hiện tại sang nhánh master)
git archive master | gzip > master.tgz (lưu trữ tất cả các file và dữ liệu trong một file gzip)
git bundle create master.bundle master (biến một kho lưu trữ thành một tập tin duy nhất)
git stash
git stash apply
Xử lý để tránh conflict
Chúng ta sẽ cần sửa lại history của nhánh login bằng cách dùng git rebase
git checkout login
git rebase dev
git rebase --continue
git rebase --abort
git checkout -b test login
Nếu xảy ra xung đột code, bạn có thể phát hiện và giải quyết chúng sớm. Nguyên tắc chung là không sửa code của người khác, và chỉ kết hợp thêm những gì bạn làm. Việc thực hiện rebase tại nhánh chức năng do bạn phụ trách giúp giảm thiểu khả năng mất code, vì bạn là người hiểu rõ nhất phần code bạn viết.
Sau khi giải quyết hết các xung đột trong code, bạn chạy git rebase --continue để tiếp tục tiến trình rebase. Bạn cũng có thể chạy git rebase --abort để hủy bỏ rebase và đưa nhánh login về lại trạng thái ban đầu.
Nếu chưa quen rebase, bạn có thể tạo một branch mới từ login, ví dụ: git checkout -b test login, và tiến hành rebase trên branch này. Sau khi chắc chắn là mọi thứ ổn thỏa, bạn có thể quay lại và tiến hành rebase cho login.
Ở phần trên, chúng ta có băn khoăn là commit thường xuyên dễ tạo ra nhiều commit nhỏ đôi khi không cần thiết. Bạn có thể dùng git rebase để dọn dẹp chúng bằng cách thêm tham số -i (interactively) như sau:
git checkout login
git rebase dev -i (interactively) (làm cho history sạch đẹp hơn)
git checkout dev
git merge login (merge fast-forward)
git checkout dev
git merge login --no-ff (merge non fast-forward)
Hotfix
1) Tạo nhánh mới từ nhánh gốc master
git checkout -b fix-xxx master
2) Bạn merge nhánh hotfix vào cả hai branches master và dev, phần sửa lỗi sẽ xuất hiện ở cả hai branches, giúp history không bị rẽ nhánh bất ngờ.
git checkout master
git merge fix-xxx --no-ff
git checkout dev
git merge fix-xxx --no-ff
Cách phân nhánh và chia việc trong nhóm với Git – Ehkoo
Kết luận
Chúng ta có thể tóm tắt bài này lại như sau:
- Dự án được chia thành nhiều nhánh, bao gồm master, dev và có thể có staging
- Các nhánh tính năng được chia ra từ dev, phát triển độc lập, được rebase trước khi merge lại vào dev
- Rebase có thể thay đổi một chút history, hoặc squash lại thành một commit duy nhất
- Merge có thể là fast-forward hoặc non-fast-forward
- dev sẽ được merge vào master mỗi khi triển khai. Trường hợp có staging, dev sẽ được merge vào staging, và staging sẽ được merge vào master.
- Các nhánh hotfix sẽ được chia ra từ master, sau đó merge --no-ff vào master và dev
Dĩ nhiên bài viết này chỉ mang tính tham khảo, vì mỗi team mỗi công ty sẽ có những cách làm riêng.