12 điểm bởi GN⁺ 2025-11-11 | 1 bình luận | Chia sẻ qua WhatsApp
  • lazygit, công cụ Git UI chạy trên terminal kết hợp sự đơn giản của dòng lệnh với tính trực quan của giao diện đồ họa để mang lại môi trường làm việc nhanh và nhất quán
  • Được thiết kế xoay quanh tính nhất quán, khả năng khám phá và tính tương tác, nên ngay cả người mới chỉ cần biết các khái niệm Git cơ bản là có thể dùng ngay
  • Keybinding kiểu vim cùng cấu trúc hiển thị rõ ràng giúp điều hướng nhanh và rút ngắn các tác vụ lặp lại
  • Patch theo dòng, interactive rebase, cherry-pick, v.v. giúp đơn giản hóa các thao tác Git phức tạp và nâng cao năng suất
  • Dựa trên framework TUI mã nguồn mở viết bằng Go, đây cũng là một ví dụ đáng tham khảo cho việc thiết kế UX của các công cụ lập trình khác

Bối cảnh ra đời của LazyGit

  • Tác giả tình cờ chạy lazygit khi đang thử nghiệm với Neovim và phát hiện ra hiệu quả của công cụ này
    • Sau đó đã chuyển toàn bộ quy trình Git sang lazygit
  • Trước đây tác giả dùng kết hợp git gui, gitk và CLI, nhưng vì giao diện cũ kỹ và thiếu ổn định nên đã tìm công cụ thay thế
  • lazygit đơn giản, nhanh và có cấu trúc tương thích với CLI, nhờ đó tạo được sự tin cậy

Các đặc điểm chính của LazyGit

Tính nhất quán (Consistency)

  • Giao diện được cấu thành từ nhiều "khung nhìn" và luôn giữ cùng một cấu trúc trực quan
    • Khi chọn khung bên trái, nội dung bên phải sẽ thay đổi tương ứng
  • Sử dụng nguyên bản thuật ngữ và tầng trừu tượng của Git để giảm độ dốc học tập
    • Ví dụ: có thể làm quen tự nhiên với các khái niệm Git chuẩn như bisect, hunk
  • Áp dụng keybinding kiểu vim (h/j/k/l, q, /, y, c, a, f, p, r, v.v.) để thao tác nhanh
  • Giới hạn số lượng lệnh và tuân theo triết lý Unix: “làm một việc thật tốt”

Khả năng khám phá (Discoverability)

  • Hiển thị ngay các thông tin cần thiết khi khởi chạy
    • Repository hiện tại, nhánh, trạng thái staging, commit gần đây, stash, lệnh cuối cùng, phím tắt, v.v.
  • Cung cấp thông tin mà không gây quá tải thị giác, giúp giảm thiểu chuyển đổi ngữ cảnh
  • Có thể kiểm tra ngay phím tắt qua footer phía dưới hoặc phím ?
  • Người dùng luôn có thể nắm bắt trực quan vị trí và trạng thái hiện tại

Tính tương tác (Interactivity)

  • Hướng dẫn các thao tác Git phức tạp thông qua giao diện tương tác
    • Ví dụ: khi push sẽ cảnh báo chênh lệch với upstream, khi rebase sẽ hỏi có dùng chế độ interactive hay không
  • Tự động xác nhận và gợi ý bước tiếp theo trong quá trình rebase, xử lý xung đột, chuyển nhánh
  • Có thể thao tác bằng tổ hợp phím mà không cần tự nhập các lệnh pick/drop/squash
  • Tăng độ tin cậy và tốc độ cho người dùng với mức độ làm phiền tối thiểu

Quy trình Git được cải thiện

  • lazygit không thêm workflow mới mà cải thiện để sử dụng các tính năng Git hiện có một cách an toàn và nhanh hơn
  • Tính năng chọn patch theo dòng và theo hunk cho phép khôi phục mã nguồn ở mức chi tiết
    • Có thể chỉ hoàn tác hoặc tách riêng một phần của commit
  • Một số ví dụ workflow rút gọn chính
    • Sửa commit hiện có và push: 2 space A P enter
    • Tạo commit mới và push: 2 space c <제목> P
    • Rebase nhánh: 3 r i ... m c
    • Xóa commit: 4 d
    • Chia nhỏ commit: 4 enter enter <c-p> n <제목> enter
    • Cherry-pick: 3 4 C 3 4 V
  • Khi dùng lặp đi lặp lại, các phím tắt dần trở thành phản xạ tự nhiên, từ đó tăng mạnh tốc độ làm việc

Bài học cho UX của công cụ phát triển

  • Sự đơn giản, tính nhất quán, khả năng khám phá, mặc định hợp lý và tính tương tác của lazygit là những nguyên tắc thiết kế xuất sắc cho công cụ lập trình
  • Khả năng tùy biến sâu, khả năng mở rộnghệ sinh thái đóng góp mã nguồn mở được duy trì lành mạnh
  • Dựa trên framework TUI gocui được viết 100% bằng Go, nên cũng có thể được tận dụng trong việc phát triển các công cụ khác
  • Gợi mở khả năng phát triển các công cụ CLI/TUI mới áp dụng những mẫu UX tương tự

Kết luận

  • lazygit được đánh giá không chỉ là một Git UI đơn thuần mà còn là một hình mẫu về năng suất phát triển và thiết kế UX
  • Dù các tính năng hỗ trợ AI tiếp tục phát triển, nó vẫn giữ vai trò cốt lõi trong lĩnh vực quản lý phiên bản đòi hỏi độ chính xác và độ tin cậy cao
  • Công cụ vẫn đang tiếp tục phát triển nhờ sự đóng góp và hợp tác của cộng đồng mã nguồn mở
  • Bất kỳ ai cũng có thể sử dụng và đóng góp, đồng thời nhận được trải nghiệm Git nhanh và trực quan

1 bình luận

 
GN⁺ 2025-11-11
Ý kiến trên Hacker News
  • Trước đây tôi thích các git TUI thiên về bàn phím như magit, neogit, lazygit
    Nhưng giờ tôi dùng jujutsu(jj) thay cho git
    Sau khi quen với jj CLI, tôi bắt đầu dùng jjui
    Tôi thường xuyên cần tách commit, và plugin hunk.nvim rất hữu ích
    Ngoài ra, jj-diffconflicts là tốt nhất để xử lý jj conflict
    Giờ dùng jj, tôi có thể chỉnh sửa đồ thị commit một cách tự nhiên như di chuyển các dòng mã

    • Cảm ơn vì các liên kết công cụ. Tôi cũng muốn hỏi liệu có công cụ nào khác có thể tách hoặc tái tổ hợp diff trong một patch series không
      Khi xóa các hunk không cần thiết khỏi commit cũ, các commit sau đó thường phát sinh xung đột dây chuyền; tôi đang thắc mắc có công cụ nào tự động xử lý chuyện đó không
    • Tôi cũng đã chuyển hẳn từ git sang jj. Tuy vậy, phần xem diff của lazygit gọn gàng hơn nên tôi vẫn còn dùng lazygit chỉ vì điểm đó
      Diff được tách theo từng file nên dễ xem, đó là lý do duy nhất
    • Tôi cũng đang chuyển sang jj. Vẫn chưa áp dụng cho mọi dự án, nhưng chỉ còn là vấn đề thời gian
      Tuy nhiên, tôi muốn có thêm GUI chuyên cho jj. Khi muốn nhìn nhiều thay đổi cùng lúc, tôi dùng gg, nhưng nó không có side-by-side diff
      Xem video về git butler khiến tôi nghĩ sẽ rất tốt nếu UI cho jj cũng phát triển theo hướng đó
      Sẽ tuyệt nếu có GUI cho phép kéo thả để di chuyển thay đổi hoặc split/rebase một cách tương tác
    • Vấn đề của git là nó quá thiếu tính định hướng (unopinionated)
      Mỗi đội lại có git flow khác nhau, và các lập trình viên либо sa đà vào tối ưu vi mô vô ích, либо ngại học
      Thành ra cuối cùng đội nào cũng cần một chuyên gia git
      Tôi thà có một công cụ ép buộc đúng một cách làm còn hơn
  • Nghe có thể buồn cười, nhưng trong số các git UI tôi từng dùng, chưa có cái nào tốt bằng SourceTree
    Khi làm các tác vụ đơn giản, nó dễ chịu hơn CLI rất nhiều, và chế độ xem trạng thái file cùng lịch sử thực sự xuất sắc
    Việc stage/unstage theo hunk hoặc theo dòng cũng rất dễ
    Chỉ tiếc là không có bản Linux. Tôi đã thử mọi công cụ khác nhưng cuối cùng vẫn quay lại
    Gần đây tôi cũng thử lazygit, và trong số TUI thì nó khá ổn

    • Bạn đã thử magit chưa? Nó dựa trên Emacs nên có độ dốc học tập, nhưng hoàn toàn thiên về bàn phím và rất khó tìm ra workflow nào mà nó không hỗ trợ
    • Khi commit thì màn hình Commit của Git Extensions là tốt nhất
      Nó không tự động làm mới nên không xung đột với CLI
      Tài liệu Commit của Git Extensions
    • Tôi thích Sublime Merge nhất. Nhanh, UI gọn gàng, chạy tốt trên mọi nền tảng, và chỉ cần mua giấy phép một lần là xong
    • Tôi nghĩ Fork hoặc Tower tốt hơn SourceTree rất nhiều. Có phải bạn chỉ dùng công cụ miễn phí thôi không?
    • Gần như không có UI nào trên đời mà tôi ghét hơn SourceTree
      Tôi đã lãng phí quá nhiều thời gian vì vô số bug và vấn đề kỳ quặc. Làm ơn hãy bỏ SourceTree đi
  • Càng dùng git trực tiếp, tôi càng cảm nhận rõ sự phi lý của giao diện CLI của git
    Tôi đã dùng jj được 2 năm, và giờ có lẽ không thể quay lại git CLI nữa
    Tôi thấy quá nhiều người tạo ra rắc rối chỉ vì bị git làm rối, nên tôi khuyên họ cứ dùng thứ khác đi

    • Tôi cũng đã thử jj nhiều lần, nhưng vì workflow không vào tay nên tốc độ bị chậm lại
      Tôi thích chia thay đổi để commit ngay trong editor, nhưng jj thiếu tích hợp với editor nên cuối cùng các commit trở nên lộn xộn
  • Dù cái tên khiến nhiều người né tránh, GitHub Desktop thực ra khá tốt
    Nó hoạt động tốt cả với repo ngoài GitHub, và việc sửa commit cũng như cherry-pick theo file/dòng rất dễ
    Mỗi thao tác phức tạp đều có giải thích đi kèm nên đặc biệt tốt cho người mới
    Nó thiếu tính năng merge và đồ thị, nhưng tôi vẫn thấy nó tốt hơn git CLI rất nhiều
    Khi có thành viên mới vào nhóm, tôi luôn cho họ dùng GH Desktop. Ít mắc lỗi hơn và hiểu nhanh hơn

    • Tôi cũng đồng ý với GH Desktop. Tốc độ bổ sung tính năng thì chậm nhưng thận trọng
      Đây là lựa chọn tốt nhất cho những ai không tự tin với git
      Ngược lại, tôi đã thấy quá nhiều lập trình viên junior quá tự tin vào git làm hỏng repo
      Vì vậy tôi rất khuyến nghị GH Desktop cho các thành viên trong nhóm
    • Việc GH Desktop thiếu xử lý merge/xung đột và không có đồ thị có lẽ chính là lý do khiến nhiều người tránh nó
  • Nhiều người dùng git không biết tới git-absorb
    Nó phù hợp với hầu như mọi git flow và giúp giảm bớt nỗi đau khi phân chia các thay đổi đã stage để chỉnh sửa vào nhiều commit
    Phần lớn TUI không có tính năng như vậy

    • Trông có vẻ hữu ích, nhưng tôi dùng magit nên việc commit và rebase vốn đã nhanh rồi
      Tôi cũng không thích các công cụ viết bằng rust vì có quá nhiều phụ thuộc
    • Cái này cũng có trong repo GNU/Debian
    • Tôi đã dùng vài tháng, nhưng có lúc squash nhầm commit khiến repo bị rối một nửa
      Tôi mất lòng tin nên cuối cùng bỏ luôn. Việc nó hoạt động quá kiểu ma thuật lại khiến tôi thấy khó chịu
    • Với tôi, sự rõ ràng của lịch sử quan trọng hơn. Việc viết lại lịch sử chỉ để có tên gọi đẹp không phải ý hay
  • Tôi vẫn thích tig hơn
    Tính năng ít hơn nhưng UI đơn giản và nhanh
    Tôi chủ yếu dùng nó để thêm incremental index

    • Tôi cũng đã dùng tig để stage theo hunk hơn 15 năm nay
  • VS Code miễn phí, đa nền tảng, và vốn đã được nhiều người dùng
    Git GUI của nó cũng rất tốt, và xử lý được mọi workflow phổ biến
    Bình thường tôi dùng CLI, nhưng khi đã mở dự án bằng VS Code thì nhiều lúc làm bằng GUI lại nhanh và trực quan hơn

    • Nhưng tôi nghĩ vấn đề là bản thân bạn phải dùng VS Code
  • Tổ hợp LazyVim + tmux đã thay đổi hoàn toàn cách tôi dùng git
    Tôi cấu hình để khi nhấn ctrl-g thì tmux floating pane sẽ mở lazygit ngay tại thư mục hiện tại
    Không cần chui vào trong neovim hay chuyển UI, có thể làm việc với git ngay lập tức
    Với workflow lấy terminal làm trung tâm, đây là trải nghiệm linh hoạt và mượt mà nhất

    • Gần đây tôi cũng mới biết tới tmux display-popup
      Trong ~/.tmux.conf, thêm
      bind-key C-g display-popup -E -d "#{pane_current_path}" -xC -yC -w 80% -h 75% "lazygit"
      
      thì có thể bật popup lazygit bằng ctrl-b ctrl-g và đóng bằng q
  • Tôi làm việc với git bằng lệnh giọng nói + AI. Nếu không thì tôi thấy ctrl-r cũng đã là UI đủ tốt rồi

  • Dù chưa ai nhắc tới, Gitu cũng là một client khá ổn