git lap-trinh til - It costs 2 mins to read

#TIL - Đây là bài học học được hôm nay: Đồng nghiệp phát hiện một bug nghiêm trọng làm lộ thông tin cá nhân của Users, mình phải sử dụng git blame để xác định ai là người gây ra lỗi, tuy nhiên trong trường hợp này, git blame đã không chính xác vì nghĩ là bạn H là author của dòng code này, nhưng thực sự thì bạn H chỉ xóa bớt khoảng trắng, thêm dấu phẩy mà thôi. Sau khi trace tiếp thì phát hiện original author của dòng code đó là mình (vào khoảng 6 tháng trước).


TL;DR git blame hiếm khi cho bạn kết quả hữu ích. Thay vào đó có thể sử dụng các options trên git log để tìm đúng tác giả, người chịu trách nhiệm cho sự thay đổi không mong đợi.

git blame hoạt động như thế nào

git blame tìm kiếm lịch sử commit để tìm người cuối cùng chỉnh sửa dòng code. Một số Editors có tích hợp chức năng này vào công cụ của họ, cũng như Github, Gitlab hay Bitbucket… cũng đều có git blame ngay trong giao diện (rất dễ để theo dõi và truy vết). Tuy vậy, bạn cũng có thể dùng command line:


git blame path/to/file

Output của git blame trên command-line

e45ad3 (Tim 2016-01-01)      1) import x from y;
8890d2 (Jeremy 2016-01-13)   2) import z from h;
e73ab4 (Michelle 2015-12-26) 3) public static func main(){

Output của git blame trên Bitbucket

Bitbucket Git Blame

(Cá nhân mình thì cảm thấy nhìn trên GUI sẽ trực quan và dễ dàng hơn.)

Ngoài ra, Bạn có thể cải thiện git blame bằng cách truyền options nhắc git blame ignore whitespaces cũng như detect moved code bằng:

git blame -w -M

Vậy có gì không ổn với git blame

Vấn đề là git blame chỉ thể hiện người cuối cùng chỉnh sửa dòng code. Và điều này không chắc là thứ bạn muốn xác định, git blame không hẳn chỉ ra đúng người chủ thực sự của dòng đó bởi vì rơi vào những trường hợp sau, git blame vẫn xem đó là author của dòng code đó:

Giải pháp - sử dụng git log

git log là công cụ rất đa năng, trong trường hợp này, bạn có thể tận dụng git log để chỉ ra original author của dòng code bạn muốn tìm:

git log -p -M --follow --stat -- path/to/your/file
path/to/{oldName.css => newName.css}

Kết quả:

Git Log