- Phiên bản port sang git của
hg absorb do Facebook tạo ra
- Có thể nói
hg absorb là một trong những cải tiến quy trình làm việc thú vị nhất trong hệ thống quản lý phiên bản trong vài năm gần đây
- Khi có các thay đổi chưa commit trong thư mục làm việc nằm trên draft changeset, chạy hg absorb sẽ tự động hấp thụ các chỉnh sửa chưa commit vào draft ancestor changeset phù hợp
- Có thể thực hiện thao tác hg histedit + "roll" mà không cần tạo commit hay tự viết quy tắc chỉnh sửa history
- Lệnh sẽ xem các dòng đã sửa, tìm changeset đã sửa các dòng đó, rồi sửa changeset tương ứng để bao gồm các thay đổi chưa commit
- Nếu không thể tạo thay đổi mà không xảy ra xung đột, chúng sẽ được giữ nguyên ở trạng thái chưa commit
- Quy trình này rất hữu ích cho các công việc như áp dụng phản hồi review. Chỉ cần tạo thay đổi cho file rồi chạy hg absorb, việc ánh xạ giữa thay đổi và commit sẽ được tự động sắp xếp lại. Một tính năng gần như phép thuật
Kịch bản sử dụng git absorb
- Có một nhánh feature với vài commit
- Một thành viên trong nhóm review nhánh và chỉ ra một số lỗi
- Bạn đã sửa lỗi, nhưng vì tin vào atomic commit nên không muốn dồn tất cả vào một commit fixes mơ hồ
- Thay vì tự tìm SHA commit cho
git commit --fixup hoặc tự chạy interactive rebase, hãy làm như sau:
- git add $FILES_YOU_FIXED
- git absorb --and-rebase
- git absorb sẽ tự động xác định commit nào có thể được sửa một cách an toàn và các thay đổi đã staged nào thuộc về từng commit
- Sau đó nó sẽ tạo các commit
fixup! cho những thay đổi này
- Nếu dùng cờ
--and-rebase, các commit fixup này sẽ tự động được gộp vào commit tương ứng
- Nếu chưa tin tưởng hoàn toàn, bạn có thể kiểm tra output thủ công rồi dùng tính năng autosquash tích hợp của git để gộp fixup vào nhánh feature
Cài đặt
- Có thể tải artifact từ bản phát hành gắn thẻ mới nhất để cài đặt
- Cung cấp artifact cho Windows, MacOS và Linux
Cách dùng
- Thêm các thay đổi cần hấp thụ bằng
git add
- Chạy
git absorb
- Nếu hài lòng với kết quả, chạy
git rebase -i --autosquash
- Nếu không hài lòng, khôi phục về trạng thái trước đó bằng
git reset --soft
Cách hoạt động (ước lược)
git absorb kiểm tra xem hai patch P1 và P2 có thể hoán đổi được hay không
- Mặc định, nó xem xét 10 commit gần nhất
- Với mỗi hunk trong index, nó kiểm tra xem hunk đó có thể hoán đổi với commit gần nhất hay không
- Khi tìm thấy commit không thể hoán đổi, nó sẽ chuyển hunk đó thành một commit fixup
Cấu hình
Kích thước stack
- Mặc định xem xét 10 commit gần nhất
- Nếu muốn xem xét nhiều commit hơn, hãy đặt giá trị
maxStack trong .gitconfig
Một fixup cho mỗi commit có thể sửa
- Mặc định tạo một commit fixup riêng cho mỗi hunk có thể hấp thụ
- Có thể dùng cờ
-F để chỉ tạo một commit fixup cho tất cả các hunk được hấp thụ vào cùng một commit
Tự động stage mọi thay đổi nếu chưa có gì được stage
- Mặc định chỉ xem xét các file đã staged
- Nếu muốn tự động stage tất cả thay đổi khi chưa có thay đổi nào được staged, hãy cấu hình
autoStageIfNothingStaged
Mục tiêu fixup luôn là SHA
- Mặc định, message của commit fixup sẽ trỏ tới phần tóm tắt của commit đích
- Có thể cấu hình để luôn trỏ tới SHA của commit đích
TODO
- Triển khai cờ ép buộc
- Triển khai kiểm tra nhánh mặc định từ remote
- Thêm một cờ ép buộc nhỏ để vô hiệu hóa từng kiểm tra an toàn riêng lẻ
- Đảm bảo mọi thông báo lỗi đều hữu ích với người dùng
- In thêm log khi thành công
- Thêm nhiều bài test hơn
- Tài liệu hóa chi tiết về stack và khả năng hoán đổi
- Bổ sung thêm nhiều trường hợp hoán đổi
- Triển khai để không phải nạp mọi hunk vào bộ nhớ cùng lúc
- Triển khai khóa index để bảo vệ khỏi các chỉnh sửa đồng thời
Tóm tắt của GN⁺
git absorb là công cụ được port từ hg absorb của Facebook, giúp cải thiện quy trình phát triển bằng cách tự động sửa commit
- Nó đặc biệt hữu ích khi áp dụng phản hồi review, xử lý tự động mà không cần tự tìm hay sửa commit thủ công
- Một công cụ khác cung cấp chức năng tương tự là git-autofixup. Đây là công cụ tự động tạo commit fixup dựa trên message commit
- Ưu điểm là giúp phản ánh phản hồi code review dễ hơn và giữ lịch sử commit gọn gàng hơn. Nhược điểm là nếu phụ thuộc quá nhiều vào tự động hóa, có thể phát sinh kết quả ngoài dự kiến
2 bình luận
Ý kiến Hacker News
Những người dùng
git absorbcho rằng công cụ này rất hữu íchgit absorbsẽ tự động tìm đúng commit cần sửaHài lòng với việc dùng bí danh cho
git commit --fixupĐã thử dùng
git absorb, nhưng nhiều trường hợp nó chọn sai commit chaChưa từng dùng
git --fixupvàgit rebase --autosquash, nhưng có vẻ hữu íchgit-absorbdường như còn tiến thêm một bước nữaHoài nghi về việc chỉnh sửa commit và lịch sử
Có thể dùng
magitđể tạo commit fixup một cách dễ dàngmagitcũng đáng để tiếp tục duy trìBiết đến
git commit --fixupvàgit rebase --autosquashgit rebase -iđáp ứng nhiều nhu cầu khác nhauKhông hiểu nổi sự ám ảnh với lịch sử commit siêu sạch
Không hiểu việc chọn một commit có thể sửa được và không xung đột trong 10 commit gần nhất
fixup^Đọc comment này thấy bị chạm thật. Tôi cũng mới thử fixup / autosquash một chút, rồi tự hỏi có phải chỉ mỗi mình bận tâm chuyện đó không nên cũng hơi tụt mood...