Tích hợp nhánh nâng cao: Git rebase

Git nâng cao

Amanda Crawford-Adamo

Software and Data Engineer

Git rebase

  • Cách tích hợp thay đổi
  • Khác với merge
  • Loại bỏ merge commit để lịch sử gọn hơn
  • Duy trì đồ thị commit tuyến tính, dễ theo dõi

Lệnh Git rebase:

git rebase <branch_name>
Git nâng cao

Ví dụ rebase - trước

Hình ảnh nhánh tính năng data-cleanup và nhánh main. Nhánh tính năng rẽ nhánh sau commit thứ hai trên main. Nhánh main có thêm hai commit sau khi nhánh data-cleanup được tạo.

Git nâng cao

Quy trình rebase

  1. Checkout nhánh tính năng data-cleanup.
git checkout data-cleanup
  1. Rebase nhánh main lên nhánh data-cleanup.
git rebase main
  • Các commit của data-cleanup được tạo lại sau commit mới nhất của main
  • Các commit đã rebase của data-cleanup có hash mới

Lưu ý: Nếu có xung đột, cần tự xử lý thủ công.

Git nâng cao

Ví dụ rebase - sau

Hình ảnh nhánh data-cleanup đã được rebase lên nhánh main. Nhánh data-cleanup giờ có toàn bộ commit của main và các commit của data-cleanup bắt đầu sau tất cả commit của main. Nhánh main không đổi.

Git nâng cao

Rebase tương tác

git rebase -i <commit_hash> 

Chức năng

  • Cho phép chỉnh sửa chi tiết nhiều commit
  • Mở một trình soạn thảo

Cảnh báo!

  • Rebase nhánh public có thể phá vỡ quy trình
    • Không dùng rebase trên nhánh public như main
  • Thiết lập quy tắc nhóm về thời điểm dùng rebase
Git nâng cao

Rebase tương tác - trước

$$

Đây là lịch sử nhánh data-validation trước khi chỉnh sửa lịch sử commit.

$ git log --oneline data-validation
abc1234 Optimize validation performance
def5678 Fix validation bug
ghi9101 Add data validation function
xyz1234 New Main Branch Commit
vwx7890 Main Branch Commit
jkl2345 Initial commit
Git nâng cao

Trình soạn thảo rebase tương tác

Cách chỉnh sửa lịch sử commit bằng lệnh pickfixup trong trình soạn thảo.

$ git rebase -i HEAD~3 
pick ghi9101 Add data validation function
fixup def5678 Fix validation bug
fixup abc1234 Optimize validation performance

# Rebase xyz1234..abc1234 onto HEAD~3(xyz1234) (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# f, fixup <commit> = like "squash", but discard this commit's log message
...
Git nâng cao

Rebase tương tác - sau

Trước

$ git log --oneline data-validation
abc1234 Optimize validation performance
def5678 Fix validation bug
ghi9101 Add data validation function
xyz1234 New Main Branch Commit
vwx7890 Main Branch Commit
jkl2345 Initial commit

Sau

$ git log --oneline data-validatoin
mno6789 Add data validation function
xyz1234 New Main Branch Commit
vwx7890 Main Branch Commit
jkl2345 Initial commit

Các commit sau được gộp thành một

  • abc1234
  • def5678
  • ghi9101
Git nâng cao

Merge và rebase

Hình minh họa ba đồ thị: nhánh bị phân kỳ, đồ thị sau khi merge, và đồ thị sau khi rebase

Merge

  • Giữ nguyên lịch sử và cấu trúc nhánh
  • Bảo toàn ngữ cảnh phát triển song song

Rebase

  • Phát lại các commit lên trên nhánh đích
  • Tạo lịch sử tuyến tính
  • Mất một phần ngữ cảnh
Git nâng cao

Khi nào dùng merge hay rebase

Merge

Dùng để tích hợp tính năng đã hoàn tất, giữ ngữ cảnh phát triển

Rebase

Dùng để cập nhật nhánh tính năng theo main, hoặc dọn lịch sử trước khi merge

Lưu ý

  • Rebase viết lại lịch sử - hãy dùng cẩn trọng
Git nâng cao

Ayo berlatih!

Git nâng cao

Preparing Video For Download...