HocTotGit.io

Git nâng cao (Advanced)
  • Lý thuyết về rebase
  • Thực hiện Rebase
  • Giải quyết conflict khi rebase
  • Rebase vs Merge
  • Quiz
  • Rebase interactive
  • Thay đổi commit message
  • Xóa commit
  • Sắp xếp lại commit
  • Squash commit
  • Chia nhỏ commit
  • Quiz
Liên kết
Blog
Hỗ trợ

Email: work.lamsun@gmail.com

Yêu thích nền tảng

Hãy chia sẻ ý kiến của bạn

HocTotGit.io

© 2026 HocTotGit.

Squash commit

1. Tổng quan

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.

Lưu ý:

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.


2. Squash vs Fixup

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.


3. Quy trình

3.1. Chọn các commit cần thao tác

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.

3.2. Tạo bộ hướng dẫn

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".

3.3. Thực thi bộ hướng dẫn

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

4. Lưu ý

  • 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.


Tổng kết

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