Mục đích của khu vực tổ chức là để có một không gian linh hoạt cho cam kết của bạn. Tôi nghĩ rằng điều này sẽ trở nên rõ ràng hơn nếu bạn tương phản git với các hệ thống kiểm soát phiên bản được tập trung hóa, chẳng hạn như lật đổ.
Lật đổ
Trong lật đổ, bạn có thể chọn để cam kết một số tệp của bản sao làm việc của bạn. Nhưng chỉ có các tập tin hoàn chỉnh. Bây giờ: Điều gì sẽ xảy ra nếu bạn muốn tạo tập tin giai đoạn A
, không phải tập tin B
và các phần của tập tin C
liên quan đến tập tin A
mà không phải là các phần phụ thuộc vào thay đổi trong tập tin B
(từ đó bạn sẽ gặp vấn đề với tính nhất quán của cam kết).
Git
Git giải quyết điều này bằng cách cung cấp dàn dựng như là bản sao làm việc thứ hai. Trong khu vực tổ chức, bạn sẽ ghép một ảnh chụp nhanh mà bạn sẽ cam kết (nói đại khái).
Do đó, trong khu vực tổ chức, bạn có thể tạo một ảnh chụp nhanh bao gồm các thay đổi A
và một phiên bản tệp C
chỉ phản ánh các thay đổi trong đó A
.
Đối với các câu hỏi cụ thể
Bạn có thể giai đoạn tại bất kỳ điểm nào bạn muốn. Cá nhân tôi thích lên sân khấu ngay trước khi tôi khởi động cam kết.
Khi có các thay đổi trong một tập tin được sắp xếp và sau đó thay đổi tập tin đó trong bản sao làm việc, bạn đã không thay đổi tập tin theo giai đoạn. Bạn có thể quyết định có nên thực hiện những điều đó hay không hoặc có nên thay đổi giai đoạn đó không. Tức là nếu bạn chạy, git gui citool
bạn sẽ thấy sự khác biệt của các phiên bản được dàn dựng và không được dàn dựng (các công cụ đơn giản và đẹp mắt để dàn dựng và cam kết theo dòng thông minh).
Git thận trọng ở đây, đó có lẽ là một điều tốt.
Chiến lược cam kết chung: Cam kết chi tiết
Tôi nghĩ khi nói về câu hỏi "Khi nào tôi nên lên sân khấu", người ta cũng nên nói về thói quen cam kết.
VCS tập trung
Trong các hệ thống kiểm soát phiên bản tập trung nơi bạn cam kết với một máy chủ trung tâm, điều quan trọng đối với đồng nghiệp là các cam kết của bạn đã hoàn tất và được kiểm tra tốt. Vì vậy, mọi người sẽ cố gắng cam kết không thường xuyên và sau đó cam kết trạng thái của các tệp hoàn chỉnh để giảm thiểu khả năng xảy ra lỗi. Do đó, một cam kết có xu hướng khá lớn, bao gồm rất nhiều thay đổi (nếu chúng không phải là sửa chữa đơn giản). Những thay đổi trong một cam kết có thể hoàn toàn không liên quan.
Git
Trong Git, một cam kết được thực hiện cục bộ, chỉ đẩy chúng ra một máy chủ khiến chúng trở nên công khai. Do đó, một cam kết là giá rẻ trong một ý nghĩa. Một cam kết trong ý nghĩa lật đổ là khá so sánh với một số git commit
theo sau git push
. Sự khác biệt này có vấn đề.
Git cho phép bạn cam kết các dòng mã, ngay cả khi bạn đã thay đổi các dòng khác trong cùng một tệp. Điều này mang lại cho bạn rất nhiều lợi ích vì ví dụ bạn có thể phạm phải lỗi bảo mật trong dòng 100 trong khi đã thay đổi dòng 300-350 giới thiệu một tính năng mới.
- Bạn có thể tách các thay đổi khác nhau trong các cam kết khác nhau. Điều này phân tách chúng độc đáo trong lịch sử phiên bản của bạn và thậm chí cho phép bạn hoàn nguyên cái này nhưng không phải cái kia.
- Cam kết của bạn không nhất thiết phải phản ánh trạng thái "biên dịch" bản sao làm việc của bạn (mặc dù tôi cố gắng giữ nguyên như vậy).
Vậy đâu là "kiểm soát chất lượng" và bảo đảm xây dựng trong một cam kết mà người dùng lật đổ sẽ mong đợi? Nó được chuyển sang các hành động khác trong git. Bạn vẫn muốn đưa ra một trạng thái hoạt động của chương trình trong một kho lưu trữ công cộng. Do đó, bạn đảm bảo rằng các bài kiểm tra thành công và chương trình hoạt động trước khi đưa ra các thay đổi của bạn.
Ngoài ra, hãy cố gắng sử dụng các chi nhánh đến mức tối đa. Khi cam kết nhiều thay đổi nhỏ, bạn sẽ có một lịch sử phiên bản khá lớn. Nếu bạn làm việc trong các nhánh, bạn có thể phân loại các cam kết chi tiết đó theo tên nhánh và sau đó hợp nhất chúng lại (tùy chọn --no-ff
cũng sẽ bảo tồn các tính năng này sống trong một nhánh duy nhất).
Tức là bạn chỉ có thể giữ thói quen sáp nhập vào master
chi nhánh, nếu chi nhánh ở trạng thái tốt . Bạn cũng có thể sử dụng thẻ để theo dõi các mốc và phát hành.
Bây giờ để quay lại dàn dựng: Một khi bạn cam kết một vài dòng cho mỗi lần cam kết, bạn sẽ trực tiếp thực hiện trước khi cam kết. (Ít nhất đó là cách tôi làm điều đó).
git diff
vàgit diff --cached
là tốt, nhưng đôi khi tôi muốn nhiều hơn nữa).