Một pull request đã được squash, nhưng nhánh chủ đề vẫn nằm trong danh sách git branch –no-merged. Điều đó không tự chứng minh tính năng bị bỏ sót. Lệnh đang hỏi về quan hệ giữa commit, còn squash có thể đưa nội dung vào dưới một commit mới.
Đọc danh sách với một mốc rõ ràng
Theo tài liệu Git, –merged liệt kê nhánh có tip đi tới được khi lần ngược từ commit đích. Nếu bỏ tên mốc, Git dùng HEAD. Khi đang đứng trên nhánh làm việc, bạn có thể nhận danh sách khác với khi đứng trên main. Vì vậy, nêu đích ngay trong câu lệnh nếu đang kiểm tra trạng thái tích hợp.
git branch --merged main
git branch --no-merged main
Hai lệnh chỉ liệt kê nhánh local, không xóa và không đồng bộ remote. Nếu muốn dùng trạng thái của remote, cần biết ref theo dõi remote đang mới đến đâu. Chọn ref đúng mục tiêu trước khi đọc danh sách, nhất là khi nhánh local chưa theo kịp thay đổi của nhóm.
Tạo tình huống squash trong repository tạm
set -eu
demo=$(mktemp -d)
git -C "$demo" init -q -b main
git -C "$demo" config user.name Demo
git -C "$demo" config user.email [email protected]
git -C "$demo" commit -qm Base --allow-empty
git -C "$demo" switch -qc topic
printf '%s\n' demo > "$demo/note.txt"
git -C "$demo" add note.txt
git -C "$demo" commit -qm Topic
git -C "$demo" switch -q main
git -C "$demo" merge --squash topic
git -C "$demo" commit -qm Squashed
git -C "$demo" branch --no-merged main
git -C "$demo" diff --exit-code main topic -- note.txt
Fixture chạy bằng Git 2.54.0. Dòng topic xuất hiện trong danh sách chưa merged, nhưng diff của note.txt rỗng. Cả hai quan sát đều hợp lý: file ở hai tip giống nhau, còn commit Topic không thuộc lịch sử main. Thư mục demo được tạo riêng; sau khi xem kết quả có thể xóa riêng thư mục đó bằng trình quản lý file.
Kiểm tra trước khi quyết định dọn nhánh
Đọc hai loại bằng chứng: quan hệ commit và thay đổi mà nhóm mong muốn có mặt. Với squash, kiểm tra pull request hoặc commit tích hợp, rồi xem phần nội dung liên quan. Một diff rỗng cho một file không đủ kết luận mọi file của một nhánh thật đã tích hợp.
Không dùng danh sách –no-merged làm lý do tự động xóa nhánh. Nếu nhánh còn công việc chưa đưa lên hoặc dùng bởi người khác, cần quy trình dọn riêng. Bài chỉ dùng một file, không kiểm tra rebase, xung đột, remote hay thay đổi đồng thời trong nhóm.
Kết luận
Ghi rõ nhánh đích khi đọc –merged. Sau squash, kiểm tra bằng chứng tích hợp nội dung riêng với bằng chứng quan hệ commit.


