2009-02-16 29 views
8

Tại một thời điểm nào đó trong các nhánh phát triển trong git của chúng tôi đã được sáp nhập. Tuy nhiên, quyết định hợp nhất sai đã được thực hiện và do đó một số mã đã không làm cho nó thành chi nhánh chính mà chúng tôi dự kiến ​​sẽ ở đó. (Đã có nhiều lần hợp nhất các nhánh khác nhau trước khi hợp nhất cuối cùng với một nhánh chính. Vì vậy, quá trình phân nhánh và hợp nhất là khá phức tạp.)Cách tìm kiếm lịch sử kho lưu trữ git để tìm lỗi hợp nhất?

Có cách dễ dàng để tìm kiếm kho lưu trữ git để xác định hợp nhất "sai "quyết định đã được thực hiện trên?

(. Tôi đã biết câu trả lời cho trường hợp cụ thể này, nhưng quá trình tìm kiếm đó là một chút tẻ nhạt)

EDIT: Lý do git đổ lỗi chứng minh không đầy đủ là dòng xúc động trong một phạm đôi khi sau lỗi kết hợp.

Trả lời

7

Nếu bạn biết một dòng trong tệp đã được sửa đổi bởi hợp nhất chi nhánh git, bạn có thể thực hiện 'git blame file.txt' và xác định số băm cam kết và cam kết tác giả của dòng trong tệp. Sau đó, bạn có thể đi qua các git đăng nhập và kéo lên cam kết chính xác liên quan đến việc hợp nhất chi nhánh xấu.

EDIT: Để trả lời nhận xét của tác giả, nếu bạn đang tìm kiếm sự biến mất của một dòng nhất định thì 'git diff' kết hợp với grep và tìm kiếm nhị phân có thể là những gì bạn muốn. giả sử bạn có số cam kết 0,1,2,3,4,5,6. Bạn biết rằng dòng tồn tại trong phiên bản 0, nhưng biến mất trong bản sửa đổi 6. Sử dụng 'git diff' cộng với grep để tìm kiếm sự biến mất.

git diff 0 6 | grep '- line I care about' 

Lần lặp đầu tiên, bạn sẽ thấy dòng bạn quan tâm biến mất. Sau đó, bạn cắt giảm số sửa đổi trong một nửa và thử lại

git diff 0 3 | grep '- line I care about' 

Nếu grep vẫn cho thấy dòng biến mất (với dấu '-'), sau đó bạn biết rằng dòng biến mất trong phiên bản từ 0 đến 3. Nếu grep không hiển thị dòng biến mất, sau đó dòng biến mất trong bản sửa đổi 4-6.

Tiếp tục cắt giảm một nửa cho đến khi bạn tìm thấy thủ phạm.

+0

Vấn đề là dòng đã được chạm đôi khi sau "lỗi kết hợp". Tôi biết khi bản vá được giới thiệu nhưng không thể dễ dàng biết khi nào nó bị loại bỏ. – Atlas1j

+1

Thay vì git diff và search, sử dụng các tùy chọn mà git log cung cấp. Cụ thể, hãy thử 'git log .. -S" dòng tôi quan tâm "--diff-filter = M' –

+2

Quá trình bạn mô tả là git bisect làm gì. Tuy nhiên, bạn không cần phải đếm băm. Mặc dù mẫu 0-6, 0-3/4-6, v.v. của bạn rõ ràng và dễ hiểu, bạn không thể sử dụng số cam kết. Bạn phải sử dụng băm cam kết và điều đó không rõ ràng. git bisect là bạn của bạn. –

9

Có thể git-bisect trợ giúp trong trường hợp của bạn không?

10

Không có thêm chi tiết, tôi chỉ có thể gợi ý tại các giải pháp có thể. Nếu bạn biết tệp hoặc dòng bị ảnh hưởng, bạn có thể thử hoặc git-blame (git blame *file* hoặc git blame *revision* *file*) hoặc bạn có thể thử gọi là 'pickaxe tìm kiếm' với git-log, tức là git log -S'*line* cố gắng tìm sửa đổi giới thiệu dòng nhất định hoặc đã xóa hàng. Bạn có thể tìm và kiểm tra tất cả các kết hợp, ví dụ: qua số git log -p -m --grep=Merge và kiểm tra cách chúng liên quan đến bố mẹ của chúng (-m hiển thị khác biệt với tất cả các bậc cha mẹ; cách khác -c hiển thị khác biệt kết hợp nhưng không hiển thị thay đổi hợp lý tầm thường, nghĩa là nếu một bên đã được thực hiện) .

0

Đối với những người khác tìm kiếm giải pháp đơn giản hơn, hãy kích hoạt gitk (hoặc từ Git GUI, hãy chuyển đến Kho lưu trữ> Trực quan X Lịch sử) và sử dụng công cụ tìm kiếm của nó.

9

Nhật ký Git có các tùy chọn tìm kiếm mạnh mẽ.Kể từ khi có những dấu hiệu cho thấy bạn có thể biết một đoạn mã mà biến mất, bạn có thể tìm kiếm chuỗi mã

git log <HERE>..<THERE> -S"line I care about" --diff-filter=M

sẽ tìm kiếm từ đây đến đó cho chuỗi sau -S và duy nhất mà dòng đã được sửa đổi (thêm hoặc xóa)

Bạn có thể đạt được độ chính xác cao hơn trong tìm kiếm nếu bạn sử dụng -G thay vì -S. -G cung cấp tìm kiếm biểu thức chính quy thay vì tìm kiếm chuỗi ký tự bằng -S.

+0

Điều này thật tuyệt vời! Tôi không biết về điều này. Cảm ơn bạn! –

+0

cần nhiều phiếu vượt trội hơn ... –

+1

Điều này có thể rất phù hợp với tùy chọn -p để hiển thị bản vá thay vì cam kết tóm tắt. Vì vậy, bạn thực sự có thể thấy các thay đổi cho các cam kết phù hợp. – studgeek

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