2012-02-02 28 views
18

Tôi đang làm việc trên một dự án Rails quy mô lớn và nhóm tôi đang làm việc đang sử dụng Github để quản lý dự án. Trong khi nhiều thay đổi được thực hiện tại địa phương và sau đó được đẩy trực tiếp đến chi nhánh phát triển của chúng tôi, chúng tôi tạo một chi nhánh khi chúng tôi đang thực hiện một thay đổi rất lớn. Khi thời gian đến để hợp nhất nhánh đó trở lại phát triển, tôi thường cố gắng rebase phát triển trở lại vào nhánh tính năng của mình trước khi hợp nhất chi nhánh tính năng của mình vào phát triển (để ngăn việc ghi đè tác phẩm của người khác). Tôi thấy rằng khi tôi làm điều này, tôi dường như chạy vào cùng một cuộc xung đột hợp nhất hai lần. Tôi chạy vào một danh sách đầy đủ các xung đột trong khi rebasing, sau đó chạy vào cùng một danh sách các xung đột một lần nữa trong khi hợp nhất. Tôi có nên rebase phát triển thành chi nhánh tính năng của mình trước khi hợp nhất tính năng của mình vào phát triển hay tôi nên hợp nhất tính năng của mình vào phát triển?Khi tôi đang sử dụng Git, tôi có nên rebase trước khi hợp nhất không?

Giả sử nhánh tính năng của tôi được gọi là "new_feature". quá trình của tôi cho việc sáp nhập nó với "phát triển" nhánh đi như thế này:

git checkout develop 

git pull (this is set up on our rig to always pull rebase) 

git checkout new_feature 

git rebase develop 

(lots of merge conflicts ensue) 

git checkout develop 

git merge -no-ff new_feature 

(same set of merge conflicts again) 

Đó là, nếu như thời gian thay đổi từ rebase của tôi gây ra tính năng chi nhánh mới của tôi để loại gương phát triển tất cả các cách trở lại, và sau đó phát triển xung đột với bản sao psudo của chính nó.

+3

lý do tại sao 'git merge -no-ff'? Nếu bạn vừa mới rebased new_feature vào phát triển, nó _should_ là một tiến nhanh. – Useless

+0

Tôi thực sự không chắc chắn. Trong một thời gian, chúng tôi có một anh chàng ở đây thực sự biết Git, và anh ấy nói với tôi rằng tôi nên làm theo cách đó vì một lý do nào đó liên quan đến việc dọn dẹp thời gian. Tôi thực sự không biết lý do là gì. –

+1

Tôi có thể thấy nó có thể làm cho dòng thời gian khó hiểu ... hmm. Việc rebase thay thế tất cả các commit trên 'new_feature' với các thay đổi tương đương được áp dụng cho' develop' thay vì điểm nhánh ban đầu, có nghĩa là bạn sẽ nhận được (bản sao) các commit cũ, có cha mẹ (giữa điểm nhánh ban đầu và 'phát triển/HEAD') cũ hơn chúng. – Useless

Trả lời

29

OK, quá lâu để nhận xét ngay bây giờ.

Để diễn giải hướng dẫn (git help rebase)

Assume the following history exists and the current branch is "new_feature": 

       A---B---C new_feature 
       /
      D---E---F---G develop 


    From this point, the result of either of the following commands: 

     git rebase develop 
     git rebase develop new_feature 

    would be: 

         A'--B'--C' <new_feature 
         /
      D---E---F---G <develop 

Bây giờ, nếu bạn có những mâu thuẫn, tình trạng thực tế sau khi lần đầu tiên chạy rebase sẽ

   A'--B'--C'--[local state] 
      / ^
D---E---F---G   new_feature 
      ^develop 

nơi [local state] là merge mâu thuẫn bạn chưa sửa chữa. Khi bạn đã giải quyết được xung đột nhập và thêm vào các tập tin được giải quyết để chỉ mục, bạn chạy git rebase --continue: bây giờ tình trạng của bạn sẽ được

   A'--B'--C'--H <new_feature 
      /
D---E---F---G <develop 

Rõ ràng vào thời điểm này kết hợp new_feature trở lại phát triển có thể tua nhanh như vậy :

   A'--B'--C'--H <new_feature <develop 
      /
D---E---F---G 

nhưng nếu nó không phải là bạn sẽ có được điều này thay vì

   A'--B'--C'--H <new_feature 
      /   \ 
D---E---F---G---------------I <develop 

Bây giờ nào các bạn thích từ một quan điểm thời gian, nó không phải là rõ ràng lý do tại sao hoặc sẽ có một vấn đề ... trừ khi bạn không bao giờ hoàn thành việc rebase và giải quyết các xung đột với H, nhưng tôi sẽ nghĩ git sẽ phàn nàn về điều đó.

+0

"nhưng nếu bạn không nhận được thay vào đó"? "không phải" là gì? Tôi không hiểu làm thế nào để gây ra một trong những kịch bản này. Sự khác biệt là gì? – Umagon

+1

"_... có thể được chuyển tiếp nhanh ... nhưng nếu nó không phải là ..._". Nếu bạn chọn không chuyển tiếp nhanh quá trình hợp nhất, với '--no-ff', bạn sẽ nhận được một cam kết hợp nhất thay vì chỉ di chuyển con trỏ nhánh, như biểu đồ hiển thị. Nếu bạn không hiểu cả hai kịch bản ở nơi đầu tiên mặc dù, bạn có thể cần phải đặt câu hỏi của riêng bạn hoặc nếu không tìm hiểu thêm về git, bởi vì tôi không thể thực sự đoán câu trả lời này bị mất bạn. – Useless

4

Âm thanh với tôi như bạn đang sử dụng rebase ngược lại nhưng nó có thể chỉ là một cụm từ khó hiểu.

Tôi muốn rebase chi nhánh tính năng lên phát triển và sau đó (phát triển) thực hiện git merge --ff-only feature.

+0

Tôi đang làm việc để chỉnh sửa bài đăng của mình để hiển thị quy trình, để xem tôi có nhận được sai không. –

+1

Như @Useless nhận xét, việc hợp nhất phải là một tiến nhanh (tôi thích ép buộc nó bằng cách sử dụng chỉ -ff). Tất cả các phần còn lại có vẻ ok mặc dù cách của bạn đặt nó trong lời nói không phải là tiêu chuẩn. Tôi khuyên bạn nên đọc http://progit.org/book/ – madth3

-1

Vì bạn đang chỉ định "quy mô lớn" và "rebase" trong cùng một câu hỏi, tôi khuyên bạn không nên làm điều đó. Thay vào đó, hãy sử dụng các hợp nhất.

Sử dụng --no-ff trong quá trình hợp nhất là rất tốt cho mục đích bảo toàn điểm chi nhánh ban đầu. Tôi hỗ trợ sử dụng nó.

Các vấn đề liên quan