#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
(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 đó:
- Thay đổi identing và formatting của dòng code.
- Di chuyển code bên trong file.
- Đổi tên file.
- Nhưng thay đổi không đáng kể như thêm/bớt khoảng trắng…
- Di chuyển file.
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
git log
: General command to show multiple commits-p
: Show patches, as in show what actually changed for each commit.-M
: Show file renames in a readable way. Ví dụ:
path/to/{oldName.css => newName.css}
-
--follow
: If file is renamed, this will keep following changes through the old file. -
--stat
: -
-- path/to/file
: specify a single file
Kết quả: