2009-10-06 28 views
43

Điều này khiến tôi trở nên điên cuồng.Git: Tìm mã đã bị xóa

Làm cách nào để tìm mã đã bị xóa?

tôi đã kết thúc việc tìm kiếm nơi nó được tạo ra với điều này:

$ git log --pretty=oneline -S'some code' 

Và đó là đủ tốt, nhưng tôi cũng rất tò mò muốn tìm nơi nó đã bị xóa, và cho đến nay, không có con xúc xắc.

Trước tiên, tôi đã thử git diff HEAD..HEAD^|grep 'some code', mở rộng phạm vi mỗi lần, cho đến khi tôi tìm thấy các dòng mà nó đã bị xóa. Tốt, vì vậy giả sử tôi tìm thấy nó trên phạm vi HEAD^^..HEAD^^^, sau đó tôi làm git show HEAD^^^git show HEAD^^ với grep, nhưng mã này không có nơi nào được tìm thấy!

Sau đó, tôi đọc lên một chút về git bisect, và chắc chắn đủ, nó mang lại cho tôi một phiên bản duy nhất mà thủ phạm được cho là ... Một lần nữa, git show rev|grep 'some code' đi lên trống rỗng ...

gì? Tôi đang làm gì sai?

Cảm ơn!

+2

Bạn có nói rằng khi bạn làm điều cơ bản sau đây bạn không nhận được hit ?:

 SHAHIT=\'git log --pretty=oneline -S'some code' | head -1 | awk '{ print $1 }'\' git show $SHAHIT | grep 'some code' 
Nếu vậy, dường như không sensical .... nếu nó trong 'log', nó nên được hiển thị trong' show' ... đúng không? Hoặc có lẽ tôi hiểu nhầm câu hỏi. – metasim

+0

Đã một thời gian kể từ khi tôi ở trong tình huống này và nó đã không tự thể hiện lại, vì vậy tôi không thể kiểm tra lệnh của bạn. Cảm ơn anyway, nó có thể có ích cho ai đó. – Ivan

+1

Bài đăng/nhận xét cũ ở đây, nhưng chính xác là những gì tôi cần. @SimeonFitch cú pháp của bạn hoạt động hoàn hảo cho tôi, để tìm và liệt kê các dòng mã thực tế đang được đề cập đến. Một bổ sung mà tôi thấy hữu ích là sử dụng tùy chọn '--context = n' grep để hiển thị đủ các dòng trước/sau để biết tên tệp là gì (cũng có các tùy chọn grep khác có thể trợ giúp điều này). Vì vậy, trong trường hợp của tôi lệnh thứ hai là: git hiển thị $ SHAHIT | grep --context = 30 'một số mã' –

Trả lời

32

Hừm, làm việc cho tôi:

 
$ git init 
Initialized empty Git repository in /Users/pknotz/foo/.git/ 

$ echo "Hello" > a 

$ git add a 

$ git commit -am "initial commit" 
[master (root-commit) 7e52a51] initial commit 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 a 

$ echo " World" >> a 

$ git commit -am "Be more specific" 
[master 080e9fe] Be more specific 
1 files changed, 1 insertions(+), 0 deletions(-) 

$ echo "Hello" > a 

$ git commit -am "Be less specific" 
[master 00f3fd0] Be less specific 
1 files changed, 0 insertions(+), 1 deletions(-) 

$ cat a 
Hello 

$ git log -SWorld 
commit 00f3fd0134d0d54aafbb9d959666efc5fd492b4f 
Author: Pat Notz <[email protected]> 
Date: Tue Oct 6 17:20:48 2009 -0600 

    Be less specific 

commit 080e9fe84ff89aab9d9d51fb5d8d59e8f663ee7f 
Author: Pat Notz <[email protected]> 
Date: Tue Oct 6 17:20:33 2009 -0600 

    Be more specific 

Hoặc là đây không phải những gì bạn nghĩa là gì?

+0

Đó là ý của tôi ... Vì vậy, nếu nó không hoạt động đối với tôi, nó có thể là chỉ mục bị hỏng hoặc lịch sử được viết lại không? – Ivan

+4

Trong ví dụ này, Pat đang sử dụng 'git log -SWorld', không * không * hiển thị các khác biệt.Tôi đoán (chưa thử nó) rằng nếu lệnh cuối cùng là 'git show 00f3fd0134d0d54aafbb9d959666efc5fd492b4f | grep World' sau đó bạn sẽ nhận được hành vi mà bạn đang tìm kiếm. – metasim

0

Nếu kho lưu trữ của bạn ở trên github.com, nó có chức năng tích hợp để tìm kiếm. Phản hồi bằng ms và tìm kiếm trong mã đã xóa quá

+6

Tôi không thể tìm thấy một cách trên github.com để tìm kiếm thông qua mã đã bị xóa, chỉ có mã hiện tại ... bạn có thể giúp tôi bằng cách xây dựng hoặc trình diễn cách thực hiện không? – pulkitsinghal

17

git log -S<string> thực hiện công việc, nhưng nếu bạn cần thực hiện các tìm kiếm phức tạp hơn, bạn có thể sử dụng git log -G<regex>.

Từ man:

-G<regex>

Hãy tìm sự khác biệt mà vá văn bản chứa thêm/gỡ bỏ dòng phù hợp <regex>.

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