Git bisect: Làm thế nào để xác định một lỗi trong mã của bạn?



Bài viết này về git bisect, hãy tìm hiểu cách lệnh ‘git bisect‘ giúp phát hiện lỗi sai đầu tiên giới thiệu một lỗi sử dụng thuật toán tìm kiếm nhị phân.

Mã của tôi đã hoạt động tốt cho đến ngày hôm qua, nhưng phải đến khi một lần kéo gần đây từ kho lưu trữ từ xa mới phá vỡ mã !!!

Nếu bạn đang ở trong trường hợp tương tự và không biết có gì thay đổi phá mã hoặc là WHO trong số nhiều người đóng góp sở hữu điều này lỗi / tính năng , thì git bisect là lối thoát cho bạn. Vì vậy, trong bài viết này trên git bisect, bạn sẽ học cách ký tự ‘git bisect‘Lệnh đến cứu trong việc phát hiện cam kết xấu đầu tiên gây ra lỗi bằng cách sử dụng thuật toán tìm kiếm nhị phân.

Các chủ đề được đề cập trong bài viết này như sau:





Tại sao sử dụng git bisect?

Không có nghi ngờ gì về thực tế là bạn có xu hướng tạo ra một số cam kết cho mọi thay đổi nhỏ trong . Trong trường hợp như vậy, gỡ lỗi mã trở thành một nhiệm vụ tẻ nhạt, vì bạn phải quay ngược thời gian theo cách thủ công từng bản sửa đổi ảnh chụp nhanh của dự án để kiểm tra mã làm việc và phát hiện lỗi. Bây giờ, điều này thậm chí còn nhiều hơn phức tạp khi bạn có công việc của người khác để kiểm tra mà không có điểm dẫn đầu, việc yêu cầu mỗi người tự làm sạch lỗi của mình cũng không khả thi lắm.
Đồng thời, bạn cũng có thể tạo và loại bỏ một số nhánh ‘tính năng’ (hoặc hotfix) trong quá trình này và cuối cùng sẽ lãng phí thời gian và công sức khi đi chệch khỏi dòng phát triển chính.



Vì vậy, để tránh những trường hợp như vậy, bạn có thể sử dụnggit bisectlệnh để tìm bản sửa đổi dự án xấu (hoặc ảnh chụp nhanh) và cuối cùng sửa nó bằnggit hoàn nguyênchỉ huy.

Tìm kiếm ‘git bisect’ như thế nào?



Lệnh này chia đôi (phân chia) lịch sử của bạn giữa tốtxấu cam kết phạm vi. Nó chỉ điểm của bạn hiện hành dự án tiểu bang đến một tầm trung cam kết ảnh chụp nhanh. Sau đó, lệnh git bisect di chuyển qua mọi id cam kết giữa phạm vi này trong khi tạm dừng ở mỗi ảnh chụp nhanh để cho phép bạn kiểm tra mã . Nếu lỗi tồn tại, bạn khai báo cam kết là xấu, nếu không như tốt trừ khi kết thúc tìm kiếm.

Cú pháp

git bisect

Để hiểu rõ hơn về git bisect, chúng ta hãy tạo một dự án phát triển mã cho một ứng dụng điều hướng đơn giản được sử dụng trên xe hơi.

Thiết lập dự án ban đầu

Để tạo một dự án phát triển mã cho một ứng dụng điều hướng đơn giản được sử dụng trên ô tô, bạn có thể làm theo các bước sau:

Bước 1: Tạo một thư mục mới trong thư mục $ HOME của bạn:

cd $ HOME mkdir my_nav_app

Bước 2: Điều hướng đến thư mục mới:

cd $ my_nav_app

Bước 3: Sao chép để tải xuống dự án từ trang GitHub của tôi:

giới thiệu đơn giản về khoa học dữ liệu
git clone https://github.com/divyabhushan/my_nav_app.git

Bây giờ, chúng ta hãy hiểu bố cục tệp và thư mục dự án, như được in ra bằng lệnh:ls -lTR

Bố cục mã nguồn - Git Bisect - Edureka

Tiếp theo, chúng ta hãy xem nhật ký lịch sử dự án để xem các cam kết mà tôi đã thực hiện để tạo mã này-

Ví dụ, một lệnh git log đơn giản in lịch sử chi tiết, tuy nhiên, tôi thích định dạng và tùy chỉnh lịch sử. Qua đó, chúng ta hãy đặt tên bí danh - 'hist' sử dụng bí danh git lệnh như hình dưới đây:

git alias.hist 'log --pretty = format:'% C (yellow)% h% Creset% ad | % C (xanh lục)% s% Đặt lại% C (đỏ)% d% Đặt lại% C (xanh lam) [% an] '--graph --dec decor --date = short'

Bây giờ, tôi sẽ thực hiện tính năng sửa lỗi này trong một nhánh riêng biệt để không ảnh hưởng đến sự phát triển chính trên nhánh 'chính'. Để làm điều đó, hãy làm theo bộ lệnh dưới đây:

  • Tạo nhánh ‘dev’: [chính] $git chi nhánh dev
  • Chuyển sang nhánh ‘dev’: $git checkout dev
  • Liệt kê nhật ký lịch sử: [dev] $đi lịch sử[Lưu ý: Lệnh ‘bí danh’ được sử dụng ở đây]

Hơn nữa, tôi đã đánh dấu cam kết tốt được biết đến cuối cùng mà tôi biết trong đó tập lệnh của tôi hoạt động tốt với kết quả trường hợp thử nghiệm dự kiến, ảnh chụp nhanh cam kết này là được gắn thẻ như v1.0.

Vì vậy, bây giờ chúng ta đã biết cam kết tốt cuối cùng của mình, chúng ta hãy tiếp tục trong bài viết này về ‘git bisect’ và kiểm tra ứng dụng.

Kiểm tra ứng dụng

Chạy tập lệnh dưới dạng - $./scripts/myApplication.sh[thử nghiệm lần đầu tiên]



Rõ ràng, trạng thái dự án hiện tại của tôi là lỗi và tôi không chắc mình đã thực hiện thay đổi nào trong đó cam kết giới thiệu thay đổi này. Vì vậy, tiếp theo trong bài viết này về git bisect, chúng ta hãy xem làm thế nào để xác định cam kết xấu.

Xác định cam kết xấu

Để bắt đầu kiểm tra lỗi sai, bạn sẽ làm theo các bước sau:

  • Bắt đầu lệnh bisect :git bisect start
  • Đề cập đến id cam kết xấu: git bisect bad HEADhoặc làgit bisect c5b3ca8
  • Đề cập đến id cam kết tốt cuối cùng được biết đến: git bisect tốt v1.0hoặc làgit bisect 93859d8

Điều này chia đôi phạm vi lịch sử cam kết khoảng giữa các cam kết tốt và xấu đưa chúng ta đến id cam kết: f61a7e8

Do đó, lệnh đã kiểm tra phiên bản dự án như trong id cam kết này. Bây giờ, chúng ta hãy tiếp tục và kiểm tra lại ứng dụng của mình.

Lệnh chạy ứng dụng : $./scripts/myApplication.sh[thử nghiệm lần thứ hai]


Kể từ khi ứng dụng thông qua trong cam kết này, cam kết này chắc chắn không phải là cam kết xấu. Vì vậy, tiếp theo, bạn phải thông báo tương tự với lệnh bisect là - $git bisect tốt


Bây giờ, điều này sẽ tiếp tục thu hẹp kết quả tìm kiếm vào nửa đầu của phạm vi như được hiển thị -


Kiểm tra lại ứng dụng của bạn - Lệnh: $./scripts/myApplication.sh[thử nghiệm lần thứ ba]


Vì vậy, vì chúng tôi thấy một lỗi như trên, đây là một cam kết xấu.

Cho lệnh bisect biết, chạy $git bisect xấu


Điều đó thu hẹp thêm tìm kiếm và đưa bạn đến bản sửa đổi cuối cùng được bao quanh màu xanh lam ở giữa: a6ac769

Vì vậy, tôi kiểm tra ứng dụng của mình lần cuối bằng cách sử dụng cùng một lệnh: $./scripts/myApplication.sh[thử nghiệm lần thứ tư]

Bây giờ, vì ứng dụng bị lỗi một lần nữa, nó vẫn là một cam kết xấu. Vì vậy, hãy chạy lệnh sau:

Chạy lệnh: git bisect xấu

Toán tử <> trong sql

Đã tìm thấy cam kết không hợp lệ

Điều này kết thúc cam kết cuối cùng duy nhất còn lại là xấu-


Vì vậy, bạn biết đây là nơi mã đã bị phá vỡ. Tiếp theo là gì?

Hiểu tệp có lỗi

Trong trường hợp này, kết quả cung cấp cho bạn thông tin tối thiểu về id cam kết , tên tác giả , và ngày tác giả cùng với cam kết tin nhắncon đường đã được sửa đổi.

Nếu bạn muốn gỡ lỗi thêm, bạn cần phải đọc các đối tượng id cam kết .

Chỉ huy: git show a6ac76994b3f6c7519204f910fc787b7928cf8ef

Điều này sẽ đọc đối tượng cam kết và in thông báo nhật ký và khác biệt văn bản.

Bạn cũng có thể sử dụng lệnh 'git blu' để phân tích cách thức và cách thực hiện cam kết từng dòng đã được thay đổi bởi tác giả nào, hãy chạy lệnh như sau:mã trách git / Develop_nav.sh

Dừng tìm kiếm

Để dừng tìm kiếm, hãy sử dụng lệnh sau:

Chỉ huy: đặt lại git bisect


Do đó, quá trình phân chia bị dừng lại và bạn quay lại nhánh mà bạn đã bắt đầu tìm kiếm. Bây giờ, bước tiếp theo là sửa hoặc gỡ lỗi mã.

Làm thế nào để sửa / gỡ lỗi mã?

Chà, có một số cách giải quyết mà bạn có thể thực hiện để khắc phục trạng thái hiện tại của dự án khi bạn đã xác định được cam kết đã gây ra lỗi ngay từ đầu.
Tuy nhiên, nếu bạn đang thay đổi cam kết trên kho lưu trữ được chia sẻ nó là tốt nhất để hoàn nguyên sự thay đổi bằng cách sử dụng dấu ‘ git hoàn nguyên ' chỉ huy.

Bài tập: Hoàn nguyên các thay đổi được thực hiện bởi cam kết xấu đã đề cập

Chỉ huy: git hoàn nguyên a6ac769

Do đó, việc hoàn nguyên các thay đổi được thực hiện bởi cam kết này đã thực hiện được 2 điều:

  • Nó đã xóa 3 dòng được thêm cuối cùng (biểu thị bằng màu xanh lá cây) và thêm dòng đã xóa (biểu thị bằng màu đỏ) trở lại. (đảo ngược của a6ac769)
  • Đã tạo thêm một cam kết với thông tin tin nhắn hoàn nguyên

“Lệnh hoàn nguyên cũng giúp bạn dễ dàng theo dõi thay đổi mà bạn đã hoàn nguyên so với cam kết ban đầu”

Sử dụng 'chỉ' lại lệnh để đọc id đối tượng, như vậy-

Chỉ huy: git show 801f029

Bây giờ, hãy tiếp tục và kiểm tra ứng dụng. Nó sẽ thực thi đúng cách.

Chỉ huy: $./scripts/myApplication.sh

Ngược lại, nếu bạn muốn xóa cam kết xấu khỏi lịch sử:

  • Bạn có thể sử dụng dấu ‘ git đặt lại Lệnh ‘với“--cứng”(Mặc dù không được khuyến khích trong kho lưu trữ được chia sẻ).

  • Kiểm tra phiên bản cũ hơn của một tệp duy nhất bằng cách sử dụng 'thanh toán gitLệnh ‘với dấu‘-' Lựa chọn.

Cần lưu ý, điều này sẽ chỉ thực hiện các thay đổi trong kho lưu trữ cục bộ của bạn cho đến khi bạn đẩy các thay đổi sang kho lưu trữ từ xa. Vì một số thay đổi tạo ra id đối tượng cam kết mới như trong trường hợp của chúng tôi ở trên, trong những trường hợp như vậy, một lần đẩy thông thường đến kho lưu trữ từ xa bị từ chối vì lịch sử sẽ bị phân kỳ. Bạn phải sử dụng dấu ‘ git push Lệnh ‘với dấu‘--lực lượng' Lựa chọn.

Cập nhật nhánh 'chính'

Trong khi tôi đã sửa lỗi trên nhánh 'dev' của mình, giờ tôi cũng có thể hợp nhất thay đổi này với nhánh 'master'-

  • chuyển sang 'master', lệnh:git tổng thể thanh toán
  • kéo các bản cập nhật gần đây từ 'origin / master' thành 'master', lệnh:git pull origin
  • hợp nhất các thay đổi của ‘dev’, lệnh:git merge khổng lồ

Tuy nhiên, việc hợp nhất của bạn có thể tạo ra xung đột nếu có nhiều cam kết hơn từ kho lưu trữ từ xa. Giải quyết xung đột và tiếp tục hợp nhất.
Cuối cùng, chỉ đẩy nhánh ‘chủ’ ổn định cam kết đến kho lưu trữ từ xa trong khi bạn hoàn thành công việc bẩn thỉu của mình (lỗi, tính năng, cải tiến) chỉ trên các nhánh tính năng chẳng hạn như ‘dev’ trong ví dụ này.
Hơn nữa, tốt nhất là áp dụng một lôgic chiến lược phân nhánh để hợp lý hóa và bảo mật quy trình dòng công việc git của bạn.

Tóm lại, ‘git bisect’ là một lệnh tiện dụng và hữu ích, nhanh chóng nhận định các id cam kết cái đó giới thiệu đến lỗi trong mã đang chạy của bạn với sự trợ giúp của Tìm kiếm nhị phân theo logic chia rẽ các bản ghi cam kết giữa tốtxấu cam kết phạm vi . Để kết luận, bạn đã học cách phát hiện cam kết bị lỗi và hoàn nguyên sự thay đổi do nó thực hiện.

Ngoài ra, đối với các lệnh con ‘good’ và ‘bad’, bạn cũng có thể sử dụng các thuật ngữ như mới và cũ để mô tả trạng thái sửa đổi. Bạn có thể chạy lệnh nhiều lần khi chuyển các lệnh con và id sửa đổi / cam kết khác nhau để xác định các id cam kết (she-1) khác nhau. Ngoài ra, một tập lệnh kiểm tra tự động cũng có thể được chạy để tạo mã bị hỏng bằng lệnh này. Ngoài ra, hãy tìm mô tả chi tiết về lệnh này bằng cách chạygit bisect --helptrên thiết bị đầu cuối. Vì vậy, mọi người với điều này, chúng tôi kết thúc bài viết này trên Git Bisect.

học thông tin từng bước

Mục đích của DevOps là tạo ra phần mềm chất lượng tốt hơn, nhanh hơn và có độ tin cậy cao hơn đồng thời mời gọi sự giao tiếp và cộng tác giữa các nhóm. Nếu bạn bị hấp dẫn bởi bài viết này, c heck out của Edureka, một công ty học trực tuyến đáng tin cậy với mạng lưới hơn 250.000 người học hài lòng trải dài trên toàn cầu. Khóa đào tạo Chứng chỉ Edureka DevOps giúp người học hiểu DevOps là gì và có được kiến ​​thức chuyên môn về các quy trình và công cụ DevOps khác nhau như Puppet, Jenkins, Nagios, Ansible, Chef, Saltstack và GIT để tự động hóa nhiều bước trong SDLC.

Có một câu hỏi cho chúng tôi? Vui lòng đề cập đến nó trong phần nhận xét của bài viết 'Git Bisect' và chúng tôi sẽ liên hệ lại với bạn càng sớm càng tốt.