2012-09-25 32 views
33

Trước đó ngày hôm nay tôi phát hiện ra rằng một số mã đã bị thiếu trong kho lưu trữ git của tôi. Tôi biết một số văn bản còn thiếu, và tập tin đó là trong, vì vậy tôi đã sử dụng git log -S'missingtext' /path/to/file. Tuy nhiên, điều duy nhất trở lại là cam kết trong đó tôi đã thêm dòng có chứa văn bản còn thiếu. Văn bản không có trong HEAD, và cam kết thêm vào nó hiện diện trong nhánh của tôi, vì vậy tôi biết rằng một trong những cam kết trong lịch sử chi nhánh của tôi phải loại bỏ nó, nhưng nó không hiển thị.Tìm khi dòng bị xóa

Sau một số tìm kiếm thủ công, hóa ra là dòng đó đã bị vô tình xóa trong khi giải quyết xung đột cho hợp nhất. Vì vậy, tôi tự hỏi:

  1. Đây có phải là lý do tại sao cuốc không thể tìm thấy cam kết đã xóa dòng?
  2. Làm cách nào tôi có thể tìm thấy nơi "thiếu văn bản" đã bị xóa mà không cần tìm hiểu thông qua lịch sử theo cách thủ công?

Bất kỳ thông tin chi tiết nào về số 1 đều tuyệt vời (tôi giả định rằng git log -S sẽ trả lời), nhưng câu hỏi thực sự của tôi là # 2 vì tôi muốn tránh điều này trong tương lai.

+6

'log -p' git và '/ missingtext' trong khi trong' less' là một 'n' cách nhanh chóng bẩn để làm điều này. – nneonneo

+1

Có thể trùng lặp của [Làm thế nào để "đổ lỗi" một dòng đã xóa] (http://stackoverflow.com/questions/4404444/how-do-i-blame-a-deleted-line) – hypehuman

Trả lời

44

git log không hiển thị khác biệt cho các cam kết hợp nhất theo mặc định. Các -c hoặc --cc cờ nên làm các trick:

git log -c -S'missingtext' /path/to/file

Thảo luận nhiều hơn/giải thích here.

+0

Nếu bạn muốn tìm khi nào dòng đã bị xóa khỏi tệp đã xóa, bạn có thể sử dụng 'git log -c -S'missingtext '-/path/to/file'. – Jonathan

+0

nếu bạn không biết tệp nào chứa văn bản còn thiếu, bạn có thể bỏ qua '/ path/to/file' và chỉ chạy' git log -c -S'missingtext'' –

0

Cách nhanh và bẩn # 2 - sử dụng vòng lặp for.

for commit in $(git log --pretty='%H'); do 
    git diff -U0 --ignore-space-change "$commit^" "$commit" | grep '^-.*missingtext' > /dev/null && echo "$commit" 
done 

Điều này sẽ bao gồm tất cả thay đổi hợp nhất vì nó chỉ định rõ ràng cam kết cơ sở cho điểm khác biệt. Tôi nghĩ ra điều này bởi vì git log -c -S... đã cho tôi một loạt các mặt tích cực giả. Ngoài ra, khi tôi chỉ định một filepath trong lệnh git log ban đầu, nó bỏ qua cam kết mà tôi đang tìm kiếm.

Vì điều này có thể chạy một lúc, bạn có thể chỉ định -n trên lệnh git log hoặc đặt && break vào cuối vòng lặp nếu bạn chỉ cần 1 kết quả.

Các vấn đề liên quan