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 commitEnter— Mở xem diff chi tiết của commitq— 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ượcR— Refresh danh sáchh— 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)
- Di chuyển đến file muốn stage trong phần “Changed but not staged”
- Nhấn
Enterđể xem diff của file đó - Di chuyển đến hunk muốn stage
- Nhấn
uđể stage hunk đó, hoặc!để discard
Stage từng dòng đơn lẻ
- Trong diff view, di chuyển đến dòng cụ thể cần stage
- 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:
- Sửa code xong, gõ
tsđể xem toàn bộ thay đổi - Stage từng hunk quan trọng, bỏ qua code thử nghiệm chưa sẵn sàng
- Commit phần đã stage với message rõ ràng
- Sau merge/rebase có conflict,
tslại để navigate và fix từng file - Cần tìm commit cũ,
tlrồ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.

