Tôi đang đóng góp cho một dự án nguồn mở khá nhỏ được lưu trữ trên Github. Để những người khác có thể tận dụng công việc của tôi, tôi đã tạo ra chiếc nĩa của riêng mình trên Github. Mặc dù sự lựa chọn của Github về thuật ngữ, tôi không muốn hoàn toàn tách rời khỏi dự án chính. Tuy nhiên, tôi không mong đợi hoặc mong muốn rằng tất cả công việc của tôi được chấp nhận vào kho lưu trữ chính. Một số của nó tuy nhiên, đã được sáp nhập vào kho chính và tôi mong đợi điều này để tiếp tục. Vấn đề tôi đang gặp phải là cách tốt nhất để giữ cho hai cây của chúng ta trong trạng thái mà mã có thể được chia sẻ giữa chúng một cách dễ dàng.Các phương pháp hay nhất cho kho lưu trữ git trên các dự án nguồn mở
Một số tình huống tôi đã hoặc sẽ gặp phải bao gồm:
- tôi cam kết mã mà sau đó được chấp nhận vào kho chính. Khi tôi kéo từ kho lưu trữ này trong tương lai, cam kết của tôi được nhân đôi trong kho lưu trữ của tôi.
- Tôi cam kết mã không bao giờ được chấp nhận vào kho lưu trữ chính. Khi tôi kéo từ kho này trong tương lai, hai cây đã phân tán và sửa chữa nó là khó khăn.
- Một người khác đến và căn cứ vào công việc của họ trên kho lưu trữ của tôi. Vì vậy, tôi nên nếu có thể tránh thay đổi các cam kết mà tôi đã đẩy, ví dụ bằng cách sử dụng git rebase.
- Tôi muốn gửi mã đến kho lưu trữ chính. Lý tưởng nhất, những thay đổi của tôi sẽ dễ dàng có thể được chuyển thành các bản vá (lý tưởng là sử dụng git format-patch) có thể trực tiếp và sạch sẽ áp dụng cho kho lưu trữ chính.
Theo như tôi có thể nói có hai, hoặc có thể là ba cách để xử lý việc này, không ai trong số đó làm việc đặc biệt tốt:
- thường chạy git rebase để giữ thay đổi của tôi dựa trên người đứng đầu kho lưu trữ ngược dòng. Bằng cách này tôi có thể loại bỏ các cam kết trùng lặp nhưng thường phải viết lại lịch sử, gây ra các vấn đề cho những người muốn lấy được công việc của họ từ tôi.
- Thường xuyên hợp nhất các thay đổi lưu trữ ngược dòng vào mỏ. Điều này làm việc ok vào cuối của tôi nhưng dường như không làm cho nó dễ dàng để gửi mã của tôi đến kho lưu trữ ngược dòng.
- Sử dụng một số kết hợp của những thứ này và có thể chọn git cherry-pick để giữ mọi thứ theo thứ tự.
Người khác đã làm gì trong tình huống này? Tôi biết tình hình của tôi tương tự như mối quan hệ giữa những người đóng góp hạt nhân khác nhau và kho lưu trữ chính của Linus, vì vậy hy vọng có những cách tốt để xử lý điều này. Tôi khá mới để git mặc dù, do đó, đã không làm chủ tất cả các sắc thái của nó. Cuối cùng, đặc biệt là do Github, thuật ngữ của tôi có thể không hoàn toàn nhất quán hoặc chính xác. Vui lòng sửa tôi.
Lưu ý rằng ngay cả khi bạn (ép buộc) đẩy các thay đổi được rebased của bạn, người khác cũng có thể dễ dàng kéo với rebase để cập nhật. Nó chỉ là một hội thảo khác, nơi lịch sử liên tục được viết lại ở mọi nơi. Trên hết, bạn cần phải cẩn thận hơn một chút do lực đẩy có thể quét sạch mọi thứ :) – rubenvb