Squashing gộp nhiều commit thành một commit duy nhất. Điều này hữu ích khi nhiều commit nhỏ không có ý nghĩa riêng lẻ, và có thể được gộp lại để quản lý code và dễ đọc hơn.
Squash không phải là một lệnh Git độc lập, mà là một trong những lệnh có sẵn trong mode interactive rebase khi chạy lệnh git rebase -i. Hãy đảm bảo bạn đã hiểu về interactive rebase trước khi học bài này.
Interactive rebase cung cấp hai lệnh để gộp commit: squash và fixup. Cả hai đều đạt được mục tiêu gộp commit; tuy nhiên, lệnh squash cho phép chỉnh sửa commit message, trong khi fixup chỉ đơn giản giữ lại commit message của commit đầu tiên. Thông thường, việc chỉ định một commit message mới khi gộp commit là có lợi, vì vậy chúng ta sẽ sử dụng squash trong ví dụ 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 7f9d4bf Accessibility fix for frontpage bug
pick 3f8e810 Updated screenreader attributes
pick ec48d74 Added comments & updated README
# Rebase 4095f73..ec48d74 onto 4095f73 (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
...
Để gộp các commit với commit trước đó, hãy đánh dấu các commit bằng cách đổi pick thành squash (nếu bạn đang sử dụng Vim, nhấn i để vào chế độ insert):
pick 7f9d4bf Accessibility fix for frontpage bug
squash 3f8e810 Updated screenreader attributes
squash ec48d74 Added comments & updated README
Lưu ý: Commit đầu tiên phải giữ nguyên pick, các commit sau đó sẽ được gộp vào commit trước nó. Trong ví dụ trên, commit "Updated screenreader attributes" và "Added comments & updated README" sẽ được gộp vào commit "Accessibility fix for frontpage bug".
Sau khi chỉnh sửa xong file hướng dẫn (đã đổi pick thành squash ở những commit muốn gộp), bạn cần 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à một file sẽ xuất hiện cho phép bạn chỉ định commit message cho commit mới đã được gộp:
# This is a combination of 3 commits
# This is the 1st commit message:
Accessibility fix for frontpage bug
# This is the commit message for #1:
Updated screenreader attributes
# This is the commit message for #2:
Added comments & updated README
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit
...
Lưu file này mà không thay đổi gì sẽ dẫn đến một commit message là sự kết hợp của tất cả 3 message. Bạn có thể chỉnh sửa hoặc để mặc định. Sau khi hoàn tất, lưu và thoát.
Ví dụ commit message sau khi chỉnh sửa:
Accessibility improvements: fix frontpage bug and update screenreader attributes
- Fixed frontpage accessibility bug
- Updated screenreader attributes
- Added comments and updated README
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).
Commit đầu tiên trong danh sách phải giữ nguyên pick, các commit sau đó mới được đổi thành squash để gộp vào commit trước.
Bạn có thể gộp nhiều commit trong cùng một lần interactive rebase bằng cách đổi pick thành squash cho tất cả các commit bạn muốn gộp (trừ commit đầu tiên).
Nếu bạn không muốn chỉnh sửa commit message, hãy sử dụng fixup thay vì squash. Lệnh fixup sẽ tự động giữ lại commit message của commit đầu tiên.
Squash hữu ích khi bạn có nhiều commit nhỏ liên quan đến cùng một tính năng hoặc sửa lỗi, và muốn gộp chúng lại thành một commit lớn hơn, có ý nghĩa hơn.
Squash cho phép bạn gộp nhiều commit thành một commit duy nhất. Quy trình bao gồm ba 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 squash cho các commit muốn gộp (trừ commit đầu tiên), và thực thi bộ hướng dẫn để chỉnh sửa commit message cho commit đã được gộp.
Hãy nhớ rằng squash 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 gộp commit giúp tạo ra một lịch sử commit rõ ràng và dễ quản lý hơn.
Tiếp theo: Chia nhỏ commit