2012-02-03 17 views
34

Tôi muốn tận dụng thuật toán git-merge trên hai tệp tùy ý trong một repo git. Đây là thư mục làm việc của tôi:chạy thuật toán kết hợp git trên hai tệp riêng lẻ

folder/ 
    file1 
    file2 

tệp1 và tệp 2 tương tự, nhưng tôi muốn xem git sẽ hợp nhất như thế nào nếu chúng là các phiên bản khác nhau của cùng một tệp. Nói cách khác, tôi muốn một cái gì đó như thế này:

git merge-files file1 file2 > merge_of_file1_file2 

Có cách nào để làm điều này không?

Trả lời

43

Điều này không thực sự hợp lý vì bạn không cung cấp tổ tiên chung. Tuy nhiên, nếu bạn có, bạn có thể sử dụng:

git merge-file <current-version> <common-ancestor> <other-version> 

Điều này đặt kết quả vào tệp phiên bản hiện tại; nếu bạn muốn chúng ở nơi khác, hãy sử dụng:

git merge-file -p <current> <common> <other> > <dest> 

Nó cần tổ tiên chung để cung cấp một cái gì đó để xem xét những thay đổi liên quan đến. Bạn có thể hack nó, bằng cách cung cấp một tập tin trống hoặc một bản sao của một phiên bản cũ của một trong số chúng từ lịch sử kho lưu trữ của bạn, nhưng chất lượng của kết quả sẽ phụ thuộc vào bạn chọn một tổ tiên chung như thế nào. , giữa đó và mỗi phiên bản mới. Một tệp trống sẽ chỉ hoạt động tốt nếu cả hai là rất tương tự (nhiều lần chạy ít nhất ba dòng giống hệt nhau).

Nếu không có điều đó, tất cả các bạn có thể thực sự làm là nhìn vào sự khác biệt:

git diff --no-index file1 file2 
+2

Điều gì về việc sử dụng một bản sao của một trong các tệp như tổ tiên chung? –

+1

@CarlG, Giả sử tệp 2 chứa một dòng nhiều hơn tệp1. Nếu bạn chọn file1 là tổ tiên, dòng này được hiểu là một phần bổ sung để hợp nhất sẽ là tệp 2. Nếu bạn chọn tệp2 làm anchestor, dòng được hiểu là xóa và bạn sẽ nhận được tệp1. –

+2

@CarlG Nói cách khác, nếu bạn bắt đầu với A và một bên thay đổi nó thành B trong khi bên kia giữ nó là A, kết quả được kết hợp rõ ràng là B. – Cascabel

29

Đối với những gì bạn đang cố gắng để làm:

touch file3 #empty 
git merge-file file1 file3 file2 

này sẽ làm việc kết hợp với ba chiều của file1 và tệp 2 với tệp3 (tệp trống) làm cơ sở.

Lưu ý rằng điều này ghi vào tệp1. Tất nhiên, bạn có thể làm như sau nếu điều đó không mong muốn:

touch file3 
cp file1 merge_of_file1_file2 
git merge-file merge_of_file1_file2 file3 file2 
+1

Tôi đã xác minh rằng nó hoạt động (thông qua Git Bash). Đây là chức năng bash tôi đã viết để đóng gói này thành một lệnh duy nhất: '' ' chức năng merge() { \t lạc __merge_result__ \t git merge file $ 1 __merge_result__ $ 2 \t rm __merge_result__ } ' '' –

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