2009-03-31 8 views
7

Chúng tôi đã already learned how to switch which branch points to what sử dụng git branch -m. Nếu tôi làm điều này, nó sẽ làm cho cuộc sống khó khăn cho những người khác kéo từ kho của tôi?Liệu git branch -m có tác dụng phụ cho các nhà phát triển khác không?

Nói rằng tôi làm một loạt các công cụ trên một chi nhánh topic1 và sau đó làm một

git branch -m master old_master 
git branch -m topic1 master 
git push origin master 

và sau đó người khác kéo master từ kho lưu trữ từ xa của tôi, những gì họ sẽ phải làm gì để làm cho điểm tất cả mọi thứ đến đúng vị trí? Tôi có phải nói với mọi người để lặp lại các bước của tôi không?

Điều này có giống với vấn đề xóa bỏ các cam kết sau khi đẩy chúng và để lại các nhà phát triển khác với các đối tượng lơ lửng không?

Trả lời

7

Tôi không chắc chắn những gì repo của bạn trông như thế nào nhưng đây là trường hợp xấu nhất.

Giả kho origin của bạn trông như thế này

 
origin: 
o---o---A---B---C master 

Và kho địa phương của bạn trông như thế này,

 
JimPuls: 
o---o---A---B---C master, origin/master 
     \ 
      D---E---F topic1 

Sau đó, sau khi chi nhánh của bạn đổi tên kho địa phương của bạn trông như thế này:

 
JimPuls: 
o---o---A---B---C old_master, origin/master 
     \ 
      D---E---F master 

Bây giờ, khi bạn đẩy master đến origin sẽ là bản cập nhật không nhanh về phía trước. Sau khi đẩy, kho origin sẽ trông như thế này:

 
origin: 
o---o---A...B...C (B & C are orphaned commits) 
     \ 
      D---E---F master 

Điều này có thể tàn nhẫn với bạn bè của bạn có thể đã thực hiện cam kết trên đầu trang của C. Ví dụ, nếu Sally đã làm việc với bạn kho cô có thể trông như thế này:

 
Sally: 
o---o---A---B---C origin/master 
       \ 
        G---H---I master 

Bây giờ, nếu bạn làm đẩy phi nhanh về phía trước của bạn và Sally hiện một fetch kho của cô sẽ trông như thế này:

 
Sally: 
      D---E---F origin/master 
     /
o---o---A---B---C 
       \ 
        G---H---I master 

Bây giờ Sally phải tìm ra cách để có được công việc của mình (G, H, I) trở lại kho lưu trữ.Nếu cô ấy chỉ cần hợp nhất với origin/master thì các thay đổi trong B và C sẽ trở lại trong kho lưu trữ (oops!). Thay vào đó, cô ấy sẽ phải cherry-pick hoặc rebase G-H-I của cô ấy thay đổi thành origin/master.

Thật thú vị khi Git cho phép bạn làm điều đó nhưng đó là loại yêu cầu sự cố. Bạn đang thực sự hy vọng rằng Sally nhận thấy tình hình. Đây là lý do tại sao bạn nên cảnh báo tất cả những người đóng góp khác khi bạn làm điều này để họ có thể đối phó với sự thay đổi một cách thích hợp.

LƯU Ý: ở trên là trường hợp xấu nhất. Nếu chi nhánh topic1 của bạn khởi hành từ master tại C thì thay đổi tua đi nhanh và không có vấn đề gì.

+0

giải thích tốt – Sujoy

0

Về cơ bản hoạt động của bạn đều giống nhau như:

# git checkout master 
# git reset --hard topic1 
# git push origin master 

Và họ sẽ có chính xác hiệu ứng rằng: Ai cũng sẽ nhận được chi nhánh topic1 (nó được đặt tên master cho họ, mặc dù) và tổ tiên của nó lên đến điểm trong đó mastertopic1 được phân tách đầu tiên. Các chi nhánh master cũ sau đó nằm xung quanh trong kho của họ và sẽ được thu gom rác tại một số điểm trong tương lai bởi vì không có gì trỏ đến nó nữa.

Nếu topic1 là chi nhánh có nguồn gốc từ HEAD hiện tại của master bạn sẽ được sử dụng tại đây. Nếu không, bạn sẽ gặp phải tình huống "lịch sử viết lại", điều này có thể gây ra sự lộn xộn của bạn, ví dụ: các thẻ của bạn. Bạn cần phải suy nghĩ cẩn thận về những gì bạn đang thực sự cố gắng đạt được. Có lẽ một đơn giản git merge sẽ phục vụ bạn tốt hơn?