Quản lý phân nhánh, yêu cầu kéo và giải quyết xung đột
Hai nhà phát triển thêm các cột vào cùng một bảng trong cùng một ngày. Một người đẩy sang sản xuất, người kia theo sau một giờ sau đó và ghi đè lên thay đổi đầu tiên. Nghe có vẻ quen thuộc? Phân nhánh, yêu cầu kéo và giải quyết xung đột tồn tại để ngăn chặn chính xác loại xung đột này.
Sử dụng các nhánh tính năng để thay đổi cơ sở dữ liệu
Một chiến lược phân nhánh đơn giản cho các dự án cơ sở dữ liệu SQL tuân theo ba nguyên tắc:
- Tạo một nhánh tính năng cho mọi thay đổi, cho dù đó là bảng mới, sửa lỗi hay cập nhật thủ tục lưu trữ.
- Hợp nhất các nhánh tính năng thành các yêu cầu kéo chính.
- Luôn giữ chính ở trạng thái có thể triển khai.
Khi bạn bắt đầu thay đổi cơ sở dữ liệu, hãy phân nhánh .main Công việc của bạn bị cô lập với mọi thứ khác đang được tiến hành. Bạn sửa đổi các tệp có liên quan .sql và vì mỗi đối tượng có tệp riêng của nó, một commit thêm một cột vào CustomersTables/Customers.sql chỉ chạm và không có gì khác.
git checkout -b feature/add-customer-email
Sau khi hoàn thành các thay đổi, đẩy nhánh vào kho lưu trữ từ xa:
git add .
git commit -m "Add Email column to Customers table"
git push origin feature/add-customer-email
Xem lại các thay đổi bằng yêu cầu kéo
Yêu cầu kéo báo hiệu rằng các thay đổi của bạn đã sẵn sàng cho cặp mắt thứ hai. Bởi vì các dự án cơ sở dữ liệu SQL lưu trữ từng đối tượng trong một tệp riêng biệt, sự khác biệt hiển thị T-SQL chính xác đã thay đổi. Các tệp riêng biệt giúp xem xét dễ dàng hơn nhiều so với tập lệnh di chuyển 500 dòng kết hợp các sửa đổi không liên quan.
Yêu cầu kéo cho các thay đổi cơ sở dữ liệu nên giải quyết các câu hỏi như:
- Thay đổi lược đồ có phá vỡ các truy vấn hiện có hoặc thủ tục được lưu trữ không?
- Quy ước đặt tên có phù hợp với phần còn lại của dự án không?
- Thay đổi có yêu cầu cập nhật tương ứng cho tập lệnh sau triển khai không?
- Thay đổi có gây mất dữ liệu hoặc yêu cầu di chuyển dữ liệu không?
Trong Azure DevOps, tạo yêu cầu kéo từ một nhánh tính năng vào main phần Repos . Trong GitHub, hãy sử dụng tab Yêu cầu kéo .
Kết nối yêu cầu kéo với các bản dựng CI
Yêu cầu kéo với bản dựng màu xanh lá cây mang lại cho người đánh giá sự tự tin. Định cấu hình PR để kích hoạt bản dựng CI biên dịch dự án cơ sở dữ liệu SQL. Nếu bản dựng không thành công do tham chiếu bị hỏng, lỗi cú pháp hoặc phần phụ thuộc chưa được giải quyết, thì vấn đề sẽ được phát hiện trước khi đến chính.
Trong Azure DevOps, bạn đặt cấu hình trình kích hoạt bản dựng CI thông qua chính sách nhánh Xác thực bản dựng . Trong GitHub, bạn thiết lập quy trình làm việc kích hoạt các pull_request sự kiện nhắm mục tiêu nhánh main .
Giải quyết xung đột hợp nhất trong các dự án cơ sở dữ liệu SQL
Xung đột xảy ra khi hai nhánh sửa đổi cùng một tệp theo cách mà Git không thể tự dung hòa. Trong các dự án cơ sở dữ liệu, một kịch bản phổ biến là hai nhà phát triển chỉnh sửa cùng một CREATE TABLE câu lệnh. Một người thêm một Phone cột, người kia thêm Addressvà cả hai đều chạm vào cùng một vùng của tệp.
Để giải quyết xung đột:
Lấy những thay đổi mới nhất từ
mainnhánh tính năng của bạn:git checkout feature/add-customer-phone git pull origin mainGit đánh dấu các phần xung đột trong tệp. Mở tệp và xem lại cả hai phiên bản.
Chỉnh sửa tệp để bao gồm cả hai thay đổi theo cú pháp chính xác.
Đánh dấu xung đột là đã giải quyết và cam kết:
git add Tables/Customers.sql git commit -m "Resolve merge conflict: include both Phone and Address columns"
Mẹo
Giảm tần suất xung đột hợp nhất bằng cách giữ cho các nhánh tính năng tồn tại trong thời gian ngắn. Hợp nhất chúng trở lại main ngay sau khi thay đổi hoàn tất và được xem xét. Các nhánh hoạt động lâu dài khác biệt đáng kể sẽ main khó hợp nhất hơn.
Xác thực sau khi giải quyết xung đột
Hợp nhất văn bản sạch sẽ không đảm bảo lược đồ hợp lệ. Giả sử một nhánh đổi tên một cột trong khi một nhánh khác thêm một thủ tục được lưu trữ tham chiếu đến tên cột cũ. Git hợp nhất các tập tin mà không khiếu nại, nhưng dự án bị hỏng. Luôn xây dựng lại sau khi giải quyết xung đột:
dotnet build MyDatabaseProject.sqlproj
📝 Một bản dựng thành công xác nhận rằng các tham chiếu đối tượng vẫn còn nguyên vẹn và cú pháp T-SQL là chính xác sau khi hợp nhất.
Khóa takeaways
Sử dụng các nhánh tính năng tồn tại trong thời gian ngắn để cô lập các thay đổi cơ sở dữ liệu và hợp nhất chúng trở lại thông main qua các yêu cầu kéo. Định cấu hình các bản dựng CI dưới dạng kiểm tra yêu cầu kéo để xác thực thành công dotnet build mọi thay đổi được đề xuất trước khi hợp nhất. Xung đột hợp nhất trong .sql tệp thường đơn giản vì mỗi tệp chứa một khai báo đối tượng duy nhất. Luôn xây dựng lại dự án sau khi giải quyết xung đột hợp nhất để xác minh rằng tất cả các tham chiếu đối tượng đều còn nguyên vẹn. Tiếp theo, bạn tìm hiểu cách phát hiện khi cơ sở dữ liệu trực tiếp không đồng bộ với dự án của bạn.