Chia nhỏ commit có thể hữu ích cho việc quản lý code và dễ đọc hơn, hoặc để tách các thay đổi từ các commit lớn hơn.
Split không phải là một lệnh Git độc lập, mà là một lệnh con có sẵn trong interactive rebase. Hãy đảm bảo bạn đã hiểu về interactive rebase trước khi học bài này.
Bắt đầu bằng việc nói với Git bạn muốn thao tác trên những commit nào bằng cách chỉ định một chuỗi các commit bắt đầu từ con trỏ HEAD trở về trước:
git rebase -i HEAD~3
Lệnh này sẽ cho phép bạn thao tác trên 3 commit gần nhất.
Sau khi thực thi lệnh rebase, Git sẽ mở trình soạn thảo văn bản mặc định trong terminal của bạn (thường là Vim) và hiển thị một bộ hướng dẫn mặc định. Các commit từ chuỗi đã chọn được liệt kê ở đầu file này:
pick Added README
pick Added navbar and fixed bug
pick Updated logo
# Rebase 4095f73..ec48d74 onto 4095f73 (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
...
Đầu tiên, hãy nói với Git commit nào bạn muốn chia nhỏ. Trong ví dụ này, chúng ta sẽ chia nhỏ commit thứ hai bằng cách đổi tiền tố lệnh của nó từ pick thành edit:
pick Added README
edit Added navbar and fixed bug
pick Updated logo
Tiếp theo, lưu và đóng file soạn thảo (với Vim: nhấn ESC, sau đó gõ :wq rồi Enter). Git sẽ bắt đầu thực thi bộ hướng dẫn và tạm dừng khi gặp commit được đánh dấu bằng edit.
Bạn sẽ thấy thông báo:
Stopped at f124bc5... Added navbar and fixed bug
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
Trong thời gian tạm dừng này, Git vào trạng thái detached HEAD, nơi con trỏ HEAD tham chiếu đến commit từ bước 2. Để chia nhỏ, hãy hủy commit và di chuyển nội dung của nó trở lại working directory bằng cách sử dụng reset:
git reset HEAD^
Sau khi chạy git status sau khi reset, bạn sẽ thấy các file hiện đang unstaged và sẵn sàng để được stage lại:
Untracked files:
(use "git add <file>..." to include in what will be committed)
analytics.js
navbar.css
navbar.html
Commit lại các file bằng cách sử dụng các lệnh add và commit tiêu chuẩn như bên dưới:
git add navbar.css navbar.html
git commit -m 'Added navbar'
git add analytics.js
git commit -m 'Fixed bug'
Bây giờ bạn đã chia một commit lớn thành hai commit nhỏ hơn, mỗi commit có mục đích rõ ràng hơn.
Sau khi bạn đã tạo lại hai commit mới từ các thay đổi cũ, hãy yêu cầu Git tiếp tục quá trình interactive rebase:
git rebase --continue
Git sẽ tiếp tục xử lý các commit còn lại trong bộ hướng dẫn.
Khi sử dụng Vim, nhớ rằng bạn cần vào chế độ insert (i) để chỉnh sửa, và thoát chế độ insert (ESC) trước khi lưu (:wq).
Khi Git tạm dừng ở commit được đánh dấu edit, bạn đang ở trạng thái detached HEAD. Đây là bình thường và bạn có thể thao tác an toàn.
Bạn có thể chia một commit thành nhiều commit nhỏ hơn bằng cách thêm và commit các file theo từng nhóm logic.
Hãy đảm bảo bạn commit tất cả các file từ commit gốc. Nếu bạn quên một số file, chúng sẽ bị mất khi tiếp tục rebase.
Split hữu ích khi bạn có một commit lớn chứa nhiều thay đổi không liên quan, và muốn tách chúng thành các commit nhỏ hơn, có ý nghĩa hơn.
Split cho phép bạn chia một commit lớn thành nhiều commit nhỏ hơn. Quy trình bao gồm sáu bước: chọn các commit cần thao tác, tạo bộ hướng dẫn bằng cách đổi pick thành edit cho commit muốn chia nhỏ, thực thi bộ hướng dẫn để Git tạm dừng, hủy commit bằng git reset HEAD^, đóng gói lại nội dung commit thành nhiều commit mới, và tiếp tục rebase bằng git rebase --continue.
Hãy nhớ rằng split chỉ nên được sử dụng trên các commit local chưa được chia sẻ để tránh gây xung đột cho các thành viên khác trong team. Việc chia nhỏ commit giúp tạo ra một lịch sử commit rõ ràng và dễ theo dõi hơn.