2012-01-26 38 views
5

Giả sử tôi có một số mã được đặt hàng, nhưng việc đặt hàng không phải là yêu cầu kỹ thuật.Hợp nhất độ phân giải xung đột với mã mới

apple 
kiwi 
strawberry 

Và sau đó tôi có hai chủ đề mà tôi muốn kết hợp trong, mà diffs trông giống như:

TOPIC BRANCH: orange 
    kiwi 
+ orange 
    strawberry 

Và cũng

TOPIC BRANCH: pear 
    kiwi 
+ pear 
    strawberry 

Có cách nào cho hai bản vá lỗi này để được giải quyết tự động? Dường như với tôi như nó là một cuộc xung đột hợp nhất kể từ khi họ cạnh tranh cho cùng một dòng mới. Một giải pháp mà tôi đã đưa ra là sắp xếp lại một trong những thay đổi vì thứ tự sắp xếp chỉ là một yêu cầu mềm (nơi mà các hoa quả thực sự là định nghĩa hàm).

TOPIC BRANCH: pear' 
    apple 
+ pear 
    kiwi 

Vì vậy, bây giờ chúng tôi có thể hợp nhất orangepear' với nhau để hình thức:

_ apple 
p pear 
_ kiwi 
o orange 
_ strawberry 

Có cách nào khác để giải quyết này như vậy mà đặt hàng có thể được giữ? Tôi cũng nghĩ đến số pear phải hạ lưu từ orange sao cho orange luôn được ưu tiên và sẽ không có xung đột hợp nhất nữa. Nhưng đây là sự phụ thuộc sai từ orangepear là hai chi nhánh tính năng riêng biệt.

Người ta có thể được xếp vào thân cây trước cái kia nhưng không được liệt kê các nhánh tích hợp.

Chỉnh sửa: Nó chỉ cho tôi biết hai khối có thể được giữ lại (bổ sung chỉ tôi đoán?) Có thể có hai chiến lược hợp nhất được gọi là "tôi đầu tiên" và "bạn đầu tiên" sao cho một thứ tự không rõ ràng có thể được giải quyết -tương tác giữa hai nhánh.

+0

Bạn đã xem các chiến lược hợp nhất git chưa? người đàn ông git-hợp nhất và tìm kiếm các chiến lược khác nhau, bao gồm cả một đệ quy gọi là kiên nhẫn. – idlethread

Trả lời

7

Cách tiếp cận cơ bản là xác định công cụ hợp nhất tùy chỉnh và sau đó sử dụng tính năng thuộc tính git để yêu cầu git sử dụng công cụ hợp nhất tùy chỉnh đó cho các tệp đó.

Ví dụ:

  1. tạo một kho lưu trữ kiểm tra:

    $ git init t 
    $ cd t 
    
  2. xác định một công cụ tùy chỉnh merge gọi mymerge:

    $ git config merge.mymerge.name "my custom merge tool" 
    $ git config merge.mymerge.driver "cat '%A' '%B'|sort -u >'%A'.tmp && mv '%A'.tmp '%A'" 
    

    Các công cụ hợp nhất trên concatenates các tập tin, các loại các dòng kết quả, và sau đó loại bỏ các dòng trùng lặp. Nếu bạn không muốn thay đổi thứ tự, hãy thay thế lệnh trên bằng tập lệnh tùy chỉnh thực hiện những gì bạn muốn. Xem git help attributes để biết thêm thông tin.

  3. tell git mà bạn muốn sử dụng mymerge khi sáp nhập bất kỳ tập tin có tên foo.txt trong kho:

    $ echo "foo.txt merge=mymerge" >.gitattributes 
    $ git add .gitattributes 
    $ git commit -m "tell git to use the mymerge merge tool for foo.txt" 
    
  4. làm cho một số dữ liệu thử nghiệm trên ba nhánh:

    $ printf 'apple\nkiwi\nstrawberry\n' >foo.txt 
    $ git add foo.txt 
    $ git commit -m "common ancestor version of foo.txt" 
    $ git checkout -b orange 
    $ printf 'apple\nkiwi\norange\nstrawberry\n' >foo.txt 
    $ git commit -a -m "add orange" 
    $ git checkout -b pear master 
    $ printf 'apple\nkiwi\npear\nstrawberry\n' >foo.txt 
    $ git commit -a -m "add pear" 
    
  5. sáp nhập các chi nhánh (lưu ý không có xung đột!):

    $ git checkout master 
    $ git merge orange 
    $ git merge pear 
    
  6. lợi nhuận!

    $ cat foo.txt 
    apple 
    kiwi 
    orange 
    pear 
    strawberry 
    
0

Nếu mã cần được đặt trong tệp riêng biệt, bạn có thể sử dụng công cụ hợp nhất tùy chỉnh có hai tệp đầu vào, đọc chúng và xuất nội dung của chúng, được sắp xếp vào tệp kết quả của bạn. Sau đó, bạn sẽ yêu cầu git sử dụng công cụ hợp nhất tùy chỉnh cho tệp này. Tôi không biết đủ về git để biết nếu bạn có thể thiết lập công cụ tùy chỉnh hợp nhất dựa trên loại tập tin hoặc regex của một số loại mặc dù, nhưng nó là một ý tưởng mà có thể cung cấp cho bạn những gì bạn muốn.

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