Blog của Đào Anh Thành

Một cách khác để sử dụng git log

3 phút đọc

Tôi rất thích sử dụng git cli cho công việc. Thứ nhất, GUI chỉ dành cho mấy tay gà mờ 🐧 đùa hoy =)), và thứ 2 việc sử dụng command line sẽ nhanh và "thuận tự nhiên" hơn cho các lập trình viên trong quá trình code.

Chia sẻ một chút: tôi đã từng sử dụng rất nhiều Git GUI client như SourceTree, Git GUI, GitKraken, GitHub Desktop, Sublime Merge, cũng như các giao diện git tích hợp trong IDE. Tuy nhiên, thực tế là tôi chỉ dùng những tính năng hết sức cơ bản như pull, push, commit, cùng lắm thì là diff file, còn những thao tác nâng cao thì vẫn phải thực hiện thủ công. Không phải vì các ứng dụng trên không hỗ trợ, mà vì các thao tác nâng cao đòi hỏi nhiều thao tác chuột dài dòng trên màn hình.

Sau khi trải nghiệm hầu hết các giao diện Git UI tiêu biểu trên thị trường, cả miễn phí lẫn trả phí, tôi nhận ra rằng: git CLI vẫn là lựa chọn tối ưu vì:

  • Ít thao tác: tôi đã cài đặt các "phím tắt" (alias) để chỉ cần một câu lệnh là có ngay kết quả mong muốn.
  • Phản hồi nhanh: không cần rời tay khỏi bàn phím, thao tác dòng lệnh luôn nhanh hơn so với việc mở ứng dụng và sử dụng chuột.

Một nỗi lo thường trực khi làm việc với Git là phải nắm được "bức tranh toàn cảnh" của repo — có những thay đổi nào từ upstream trong lúc tôi đang làm việc trên nhánh của mình? Xung đột nào có thể xảy ra? Khi tôi push thì liệu có "đạp chân" ai không?

Trước đây tôi thường dùng git client để nắm được điều này, vì tính năng đó của git - git log - trông khá là củ chuối

alt text

Fig 1: Nội dung này không có gì hữu ích lắm

Git log mặc định là liệt kê các commit gần nhất, nhưng thứ tôi cần lại là:

  • Liệu nhánh mình có thể có conflig với nhánh dev
  • khoảng 9 lịch sử commit gần nhất ở tất cả các nhánh. Tôi sẽ dựa vào đây để phán đoán liệu có conflict tiềm tàng nào với mọi người hay không. Bạn có thể cần nhiều hơn 9 nếu team bạn có nhiều người

Sau khi tìm tòi google các kiểu, đây là câu lệnh mà tôi dùng hàng ngày:

git log -9 --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n''          %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all

đây là kết quả:

alt text

Fig 2: Mọi thứ đã dễ nhìn hơn

Mọi thứ đã được format gọn gàng và rất đầy đủ thông tin cho bạn.

Nếu như bạn chỉ cần quan tâm đến một nhánh nhất định, ví dụ chỉ muốn xem nhánh hiện tại và develop thôi, bạn có thể chỉnh sửa một chút như sau:

git log -6 --graph --abbrev-commit --decorate \
--format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' \
develop HEAD # <== khác biệt chính nằm ở đây

cùng xem kết quả

alt text

Fig 3: Khi bạn chỉ cần quan tâm một nhánh nhất định

Giờ đây tôi đã biết được rằng nhánh của tôi (commit đầu tiên trong ảnh) đang ở sau một vài commit trong nhánh develop. Vì vậy tôi cần thực hiện rebase lại để cập nhật nhánh hiện tại trước khi tạo Merge Request.

Chà, bạn thông minh đã nhận ra, tôi đã sử dụng lg -9lg develop -6 thay vì gõ cả 2 câu dài ngoằng kể trên vào terminal như đã đề cập. Tôi đã viết một bài giải thích về điều này, bạn đọc có thể tham khảo ở đây Khai mở tiềm năng Command Alias.

Thường trước khi rebase hay merge nhánh, tôi sẽ kiểm tra trước xem liệu hai nhánh đó có conflict gì hay không. Một lần nữa, bạn không cần phải thao tác gì nhiều vì git log hoàn toàn có thể đáp ứng được.

git log develop..HEAD --oneline --left-right --cherry-pick --color \
--pretty=format:'%C(yellow)%m%C(reset) %C(blue)%h%C(reset) %C(cyan)%an%C(reset) %C(green)%ar%C(reset) %s%n' \
| head -9

Lệnh trên tiến hành lấy 9 conflict mới nhất của nhánh hiện tại và nhánh develop. Cùng xem kết của nó:

alt text

Fig 4: Ố ồ, vậy là có một conflict

Hi vọng những chia sẻ trên sẽ khiến công việc của bạn được thuận tiện, và bạn sẽ trở nên năng suất hơn.

Loading Comments...