Làm thế nào Git thực hành tốt nhất đã tiết kiệm cho tôi hàng giờ làm lại

Gần đây tôi đang thực hiện nhiệm vụ nâng cấp chứng chỉ cho ứng dụng NodeJS. Điều này đã được chạm vào lần cuối hai năm trước để tăng cường tính năng. Bất kỳ vấn đề trực tiếp nào được nêu ra cho ứng dụng này sẽ cần sự chú ý ngay lập tức, mặc dù ứng dụng chỉ được sử dụng nội bộ.

Ứng dụng này đã cũ. Các mô-đun Core-NodeJS-Infra đã không được cập nhật trong hơn hai năm. Dịch vụ hạ nguồn bị phản đối. Cách chúng tôi gọi các dịch vụ hạ nguồn được thay đổi. Hạn chót chặt chẽ là một quả anh đào trên bánh. Tôi biết đó sẽ là một chuyến đi tàu lượn siêu tốc.

Tôi đã dành ba ngày để ứng dụng chạy.

Infra-module được cập nhật? Kiểm tra.

Dịch vụ hạ nguồn đang hoạt động tốt? Kiểm tra.

Các luồng UI đang hoạt động tốt? Kiểm tra.

Một trong những thành viên trong nhóm của chúng tôi đã chạm vào ứng dụng để nâng cấp hơn một năm trước. Ông chỉ ra rằng repo từ nơi tôi rẽ nhánh chính là một repo ngã ba. Một số nhóm khác đã làm việc với repo đó, và sau đó nhóm của chúng tôi đã làm việc với repo ban đầu từ thời điểm đó trở đi - nhưng thành viên trong nhóm của tôi không biết từ thời điểm nào trở đi. Vì vậy, nó là một chút lộn xộn!

Chúng tôi có một công cụ của chủ sở hữu và cho thấy đó là repo chính xác và nó đã nói dối với tôi. Vì vậy, tình hình là như thế này:

Ngã ba

Vâng, đó là Forkception! WTF và FML là hai ý nghĩ đầu tiên xuất hiện trong miệng tôi. Tôi đáng lẽ phải làm việc trên repo trực tiếp, nhưng, thay vào đó, tôi đã làm việc trên một ngã ba đã cũ. Cách ngu ngốc của tôi!

Suy nghĩ đầu tiên - ba ngày làm việc của tôi đã bị lãng phí, và tôi cần phải bắt đầu mới mẻ.

Suy nghĩ thứ hai? Hãy để tôi hỏi người bạn cũ của tôi Git. Anh ấy đã giúp tôi rất lâu.

Tôi - Hồi Hey Git? Tôi đang gặp rắc rối lớn và tôi cần sự giúp đỡ của bạn để giải quyết vấn đề này.

Git - Nôi Hey! Ok, vì vậy chúng tôi phải bắt đầu từ bất cứ điều gì đang sống đầu tiên. Tạo một nhánh mới - được gọi là nâng cấp và trỏ nhánh đó tới mã trực tiếp. Bạn có thể sử dụng thiết lập lại git cứng cho điều đó.

Tôi - xông Ok, tôi sẽ.

Tại thời điểm này, tình hình trông như thế này.

Sử dụng các tính năng của Git

Chúng tôi cần biết những gì đã thay đổi giữa phát triển và nâng cấp. Bạn có thể liệt kê ra các tệp khác nhau giữa nâng cấp và phát triển không? Kiểm tra từng tệp riêng lẻ và tìm ra loại thay đổi nào.

Tôi - mát mẻ. Tôi thấy ba loại thay đổi. Có một dịch vụ S1 mà tôi cần gọi theo một cách khác. Có một dịch vụ S2 mà tôi cần gọi bằng một điểm cuối khác. Có một dịch vụ S3 mà tôi cần gọi bằng các tham số khác nhau. Tôi cũng thấy tệp pack.json trong nhánh nâng cấp có một số gói đã được nâng cấp. Vì vậy, chỉ cần thay đổi một vài gói.

Git - Tuyệt vời mà bạn tách biệt các thay đổi. Bây giờ hãy cho tôi xem nhật ký Git của chi nhánh phát triển của bạn. Hy vọng bạn đã tuân theo một số thực hành Git cơ bản, ví dụ như luôn có mã có thể xây dựng trong mỗi lần xác nhận. Thông điệp cam kết sẽ mô tả những gì bạn đã thay đổi.

Đăng nhập Git trên nhánh phát triển

Tôi - Có Có, tôi có tổng cộng bốn cam kết trong nhánh phát triển. Một cam kết là để làm cho dự án có thể xây dựng. Có một cho mỗi trong số ba cuộc gọi dịch vụ. Mùi

Git - Hoàn hảo! Có vẻ như bạn đã làm theo các thực hành tốt nhất đúng cách. Hãy bắt đầu bằng cách ổn định việc xây dựng dự án bằng cách cập nhật gói.json. Thanh toán cho chi nhánh nâng cấp và tạo một bản sao của gói.json - gói-copy.json. Bây giờ, bằng cách sử dụng Git thay thế, nâng cấp / pack.json với Develop / pack.json và chạy khác biệt giữa pack.json và gói-copy.json. Vì, mã trực tiếp đã có một số gói đã được thay đổi và có các phiên bản khác nhau, bạn sẽ cần nâng cấp bằng cách xem diff.

Làm cho dự án có thể xây dựng

Tôi - Triệu Hãy để tôi thử điều đó. Ok, nó đang xây dựng và đang chạy.

Git - Tuyệt vời! Bây giờ, hãy để cho tôi làm việc với các cuộc gọi dịch vụ. Tôi thấy rằng bạn có một cam kết cho mỗi thay đổi cuộc gọi dịch vụ trong nhánh phát triển. Đến giờ hái cherry. Chọn từ cuộc gọi dịch vụ ít phức tạp nhất đến cuộc gọi dịch vụ phức tạp nhất. Chọn, hợp nhất và giải quyết xung đột. Hãy chắc chắn kiểm tra xem dự án có ở trong tình trạng có thể xây dựng được sau mỗi lần hái anh đào và trước mỗi lần cam kết không.

Tôi - làm S1 S1 xong. S2 xong. S3 xong rồi. Cảm ơn, Git Cảnh

Chào mừng bạn Nhưng chính bạn là người đã giúp mình, bằng cách tuân theo các thực hành cam kết của Git và không coi Git như một kho lưu trữ mã đơn thuần.

Tôi đã làm gì ở đây?

Cam kết thay đổi liên quan

Hãy tạm dừng một lát và suy nghĩ nếu thay đổi này nên đi trong cam kết này. Một cam kết nói rằng thay đổi của Dịch vụ: điểm cuối của dịch vụ-s1 và có các thay đổi dịch vụ-s2 sẽ tạo ra sự nhầm lẫn.

Don Cam Cam kết làm việc nửa vời

Chúng ta thường nghe nói về cam kết sớm, cam kết thường là thần chú. Trong ví dụ trên, bạn có thể có một cam kết cho các điểm cuối khác nhau của cùng một dịch vụ. Điều này được gọi là làm xúc xích.

Tuy nhiên, cá nhân tôi đã xóa các cam kết nhỏ của mình bằng chế độ tương tác git rebase. Điều này giúp tôi có một thay đổi hợp lý, có thể được chứng nhận và nó cũng giúp Người ủy thác đáng tin cậy xem xét mã của bạn. Điều này là rất thích hợp cho các dự án quy mô lớn.

Kiểm tra mã của bạn trước khi bạn cam kết

Chúng ta nên nghĩ về Git như một máy trạng thái, và bất kỳ máy nào cũng phải ở trong tình trạng có thể xây dựng ở bất kỳ trạng thái nào.

Viết tin nhắn cam kết tốt

Đây là một phần quan trọng nhất. Tôi luôn dừng lại một lúc và suy nghĩ liệu tôi có thể hiểu được không - sau ba tháng - loại thay đổi trong cam kết này bằng cách chỉ nhìn vào thông điệp cam kết.

Phần kết luận

Tôi đã có thể nhanh chóng giải quyết mớ hỗn độn. Tôi có thể ra khỏi thời điểm WTF và FML đó chỉ vì tôi tuân theo một số thực tiễn tốt. Chúng tồn tại vì một lý do và giống như muối trong thực phẩm - bạn chỉ nhận ra giá trị của chúng khi chúng không được sử dụng.

Những sai lầm sẽ xảy ra sớm hay muộn, một cách vô thức. Nhưng hãy chắc chắn rằng bạn có ý thức làm theo một số thực hành xung quanh Git.

Tôi là một fan hâm mộ của các thông điệp cam kết ngữ nghĩa Git, giúp điều hướng trong lịch sử Git. Bởi vì, hãy thành thật, bạn có thể hy vọng mọi người sẽ sử dụng cùng một từ cho mỗi thông điệp cam kết. Tuy nhiên, loại tin nhắn có thể được dự kiến.

Điều này giúp đảm bảo rằng, sau mỗi lần cam kết, dự án của bạn có thể được xây dựng - điều này thực sự hữu ích.

VSCode có hỗ trợ bệnh cho Git. Nó trở nên siêu dễ dàng để xem các xung đột và giải quyết chúng, đôi khi chỉ với một cú nhấp chuột. Xem ví dụ dưới đây

Người giới thiệu

  • Thực hành tốt nhất của Git
  • Tích hợp kiểm soát phiên bản siêu tuyệt vời trong VSCode
  • Tin nhắn Cam kết ngữ nghĩa Git
  • Git Tip: Cách thức hợp nhất các tập tin cụ thể của 341 từ một chi nhánh khác
  • Git Tip: Tài liệu Git - git-cherry-pick
  • Mẹo Git: Tài liệu Git - git-reset

Đặc biệt cảm ơn bạn bè của tôi Saurabh Rajani và Anish Dhargalkar đã giúp tôi hoàn thiện nội dung.