Hướng dẫn dùng tig: Terminal UI trực quan cho Git để duyệt commit, stage từng dòng và fix Merge Conflict

Git tutorial - IT technology blog
Git tutorial - IT technology blog

Vấn đề thực tế khi làm việc với Git trong Terminal

Bạn có bao giờ gõ git log rồi ngồi nhìn đống text cuộn qua màn hình mà không biết tìm gì không? Hoặc đang giữa chừng fix bug, muốn chỉ stage một vài dòng cụ thể trong file — không phải cả file — nhưng git add -p lại hiện ra đống diff khó nhìn, hỏi từng hunk một theo kiểu hoàn toàn không có context?

Mình từng mất gần 20 phút chỉ để tìm xem commit nào đã xóa cái function mình cần. Gõ git log --oneline, thấy 200 commit, không biết bắt đầu từ đâu. Rồi git show abc1234, lại git show def5678… cứ thế nhảy qua nhảy lại.

Chưa kể cái lần bị merge conflict trên 5 file cùng lúc — mở từng file, tìm từng dấu <<<<<<<, sửa thủ công, xong mới commit. Mất cả buổi sáng chỉ cho việc đó.

Tại sao git log và git diff lại khó dùng trong thực tế?

Git được thiết kế theo triết lý Unix — output của lệnh này pipe vào lệnh khác. Hiệu quả cho scripting, nhưng khi làm việc thực tế, bạn cần tương tác: scroll lên xuống, nhảy sang commit khác, xem diff ngay tại chỗ mà không cần gõ thêm lệnh.

Các tool GUI như GitKraken hay SourceTree giải quyết được cái này. Nhưng chúng yêu cầu rời terminal — và với developer làm việc trên server remote qua SSH, đó không phải lựa chọn khả thi.

Mình dùng tig từ đó đến nay, khoảng 8 tháng, và gần như không còn nhảy vào GitKraken nữa.

tig là gì?

tig (đảo ngược của chữ “git”) là một text-mode interface cho Git — TUI chạy hoàn toàn trong terminal, tương tác được như GUI. Nó cho phép bạn:

  • Duyệt lịch sử commit theo dạng cây có thể scroll và tìm kiếm
  • Xem diff của từng commit ngay trong cùng màn hình
  • Stage hoặc unstage từng dòng cụ thể bằng phím tắt
  • Xem trạng thái working tree, staged files theo dạng trực quan
  • Navigate merge conflict với màu sắc phân biệt rõ ràng

Không cần rời terminal. Không cần cài thêm gì ngoài tig.

Cài đặt tig

tig có trên hầu hết package manager phổ biến:

# Ubuntu / Debian
sudo apt install tig

# macOS (Homebrew)
brew install tig

# Fedora / RHEL / CentOS
sudo dnf install tig

# Arch Linux
sudo pacman -S tig

Kiểm tra cài đặt thành công:

tig --version
# tig version 2.5.8

Duyệt lịch sử commit — tương tác thay vì chỉ đọc

Chạy tig trong thư mục git repo:

tig

Màn hình chia đôi: phần trên là danh sách commit (giống git log --graph nhưng scroll được), phần dưới là diff của commit đang chọn. Dùng phím mũi tên hoặc j/k để di chuyển. Diff cập nhật ngay — không cần gõ thêm lệnh nào.

Các phím tắt cơ bản trong tig

  • j / k — Di chuyển lên/xuống trong danh sách commit
  • Enter — Mở xem diff chi tiết của commit
  • q — Quay lại view trước / thoát
  • / — Tìm kiếm (gõ từ khóa rồi Enter)
  • n / N — Tìm kết quả tiếp / ngược
  • R — Refresh danh sách
  • h — Mở help đầy đủ

Xem log của một file cụ thể:

tig -- src/main.py

So sánh 2 branch:

tig main..feature/my-branch

Stage từng dòng — không cần nhớ git add -p nữa

Đây là tính năng mình dùng nhiều nhất. Khi sửa nhiều thứ trong một file nhưng chỉ muốn commit một phần — ví dụ fix bug ở đầu file nhưng cuối file là code thử nghiệm chưa xong — bạn cần stage theo từng dòng (hunk).

Mở Status View:

tig status

Hoặc nhấn s khi đang trong tig. Màn hình Status View hiện:

  • Changes to be committed — các file/dòng đã staged
  • Changed but not staged — chưa staged
  • Untracked files — file mới chưa track

Stage từng hunk (khối code)

  1. Di chuyển đến file muốn stage trong phần “Changed but not staged”
  2. Nhấn Enter để xem diff của file đó
  3. Di chuyển đến hunk muốn stage
  4. Nhấn u để stage hunk đó, hoặc ! để discard

Stage từng dòng đơn lẻ

  1. Trong diff view, di chuyển đến dòng cụ thể cần stage
  2. Nhấn 1 để stage chỉ dòng đó

Điểm khác biệt so với git add -p: bạn nhìn thấy toàn bộ context của file khi quyết định stage, không bị hỏi từng hunk một cách mù quáng. Sau khi stage xong, commit bình thường:

git commit -m "fix: validate email trước khi gửi form"

Xử lý Merge Conflict ngay trong tig

Merge conflict trên nhiều file cùng lúc là một trong những tình huống dễ mắc sai lầm nhất — đặc biệt khi bạn vừa vội, vừa không chắc phần nào của code là “đúng”. Xóa nhầm code của đồng nghiệp, hoặc giữ nhầm version cũ của mình — hậu quả đều là thêm thời gian debug.

Khi có merge conflict, chạy tig status. Các file conflict sẽ hiện với ký hiệu UU (both modified). Nhấn Enter vào file đó để xem diff với màu sắc phân biệt rõ ràng:

<<<<<<< HEAD
const timeout = 5000;
=======
const timeout = 3000;
>>>>>>> feature/faster-timeout

tig tô màu rõ phần của bạn (HEAD) và phần từ branch khác — nhìn dễ hơn nhiều so với đọc raw text trong vim hay nano. Mở file bằng editor ngoài, sửa xong, quay lại tig status: file chuyển từ UU sang M. Nhấn u để stage ngay trong tig, rồi:

git commit  # Git tự điền merge commit message

Một số chế độ xem khác trong tig

Blame View — Xem ai viết dòng code đó

tig blame src/auth.py

Hiện từng dòng code kèm thông tin commit nào đã thêm/sửa dòng đó. Khi debug theo kiểu “dòng này ai sửa, commit nào, message là gì?” thì đây là view nhanh nhất. Nhấn Enter vào commit bất kỳ để xem full diff ngay.

Tree View — Duyệt file của một commit cụ thể

Trong log view, nhấn t để xem cây thư mục của commit đang chọn. Có thể navigate vào từng file để xem nội dung tại thời điểm đó — rất tiện khi cần tìm lại code đã bị xóa.

Refs View — Xem tất cả branch và tag

tig refs

Liệt kê tất cả local branch, remote branch, và tag. Nhấn Enter vào branch nào là xem log của branch đó ngay — không cần git checkout.

Tích hợp tig vào workflow hàng ngày

Mình đặt alias trong ~/.bashrc để tiện dùng:

# Thêm vào ~/.bashrc hoặc ~/.zshrc
alias tl='tig'
alias ts='tig status'
alias tb='tig blame'

Workflow thực tế sau khi dùng tig:

  1. Sửa code xong, gõ ts để xem toàn bộ thay đổi
  2. Stage từng hunk quan trọng, bỏ qua code thử nghiệm chưa sẵn sàng
  3. Commit phần đã stage với message rõ ràng
  4. Sau merge/rebase có conflict, ts lại để navigate và fix từng file
  5. Cần tìm commit cũ, tl rồi / tìm kiếm theo message hoặc tên file

tig không thay thế hoàn toàn các lệnh git — git commit, git push, git rebase vẫn cần gõ trực tiếp. Nhưng nó thay thế tốt những gì cần tương tác nhiều nhất: git log, git diff, git add -p, và git blame.

Làm việc trên server remote qua SSH, hay đơn giản không muốn nhớ hàng chục flag của git log? Cài tig đi — mất 30 giây để cài, thêm 10 phút để quen phím tắt, và tiết kiệm được kha khá thời gian về sau.

Share: