16 điểm bởi GN⁺ 2024-09-27 | 2 bình luận | Chia sẻ qua WhatsApp
  • 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:
    1. git add $FILES_YOU_FIXED
    2. 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

  1. Thêm các thay đổi cần hấp thụ bằng git add
  2. Chạy git absorb
  3. Nếu hài lòng với kết quả, chạy git rebase -i --autosquash
  4. 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

 
GN⁺ 2024-09-27
Ý kiến Hacker News
  • Những người dùng git absorb cho rằng công cụ này rất hữu ích

    • Khi một PR có nhiều commit bị CI báo lỗi, git absorb sẽ tự động tìm đúng commit cần sửa
    • Giảm bớt sự phiền toái khi phải tự tìm commit
    • Hầu như không có false positive, và nếu có false negative thì có thể xử lý thủ công
    • Cũng có ý kiến cho rằng PR nên chỉ có một commit, nhưng không phải lúc nào cũng vậy
    • Trên GitHub, họ thích các commit nhỏ gọn về mặt logic
  • Hài lòng với việc dùng bí danh cho git commit --fixup

    • Có thể hiển thị các commit trong nhánh hiện tại và chọn qua fzf
    • Tạo commit fixup dựa trên commit đã chọn
  • Đã thử dùng git absorb, nhưng nhiều trường hợp nó chọn sai commit cha

    • Tự tìm commit vẫn tốt hơn
    • Thích kiểm soát hoàn toàn lịch sử commit
    • Công cụ này có cảm giác như có quá nhiều phép thuật
  • Chưa từng dùng git --fixupgit rebase --autosquash, nhưng có vẻ hữu ích

    • git-absorb dường như còn tiến thêm một bước nữa
    • README không nói thật rõ trong một số tình huống cụ thể thì nó sẽ làm chính xác điều gì
  • Hoài nghi về việc chỉnh sửa commit và lịch sử

    • Tốt hơn là sửa lỗi, tạo commit mới rồi tiếp tục
  • Có thể dùng magit để tạo commit fixup một cách dễ dàng

    • Ngay cả khi không dùng Emacs, chỉ riêng magit cũng đáng để tiếp tục duy trì
    • Với người dùng vscode thì Edamagit là lựa chọn tốt
  • Biết đến git commit --fixupgit rebase --autosquash

    • Interactive git rebase là công cụ Git yêu thích của họ
    • Nó giúp tạo ra các commit nguyên tử logic hoàn hảo
    • Tuy vậy, việc biên tập lịch sử như thế này đôi khi cũng có thể phản tác dụng
  • git rebase -i đáp ứng nhiều nhu cầu khác nhau

    • Có thể squash, fixup, reword, delete commit một cách tương tác
    • Bất kỳ ai dùng git cũng nên học nó
  • Không hiểu nổi sự ám ảnh với lịch sử commit siêu sạch

    • Tự hỏi liệu mọi người có thực sự thường xuyên xem kỹ lịch sử commit đến vậy không
  • 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

    • Họ thường giải quyết xung đột và hay dùng fixup^
    • Không tin tưởng việc tự động chọn commit đích
 
roxie 2025-05-18
  • Tôi không hiểu việc ám ảnh với lịch sử commit siêu sạch sẽ
    • Tôi cũng nghi ngờ liệu có thường xuyên xem kỹ lịch sử commit đến vậy không

Đọ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...