2012-06-12 23 views
30

Có cách nào để xem hợp nhất đã được cam kết theo cách khác 3 chiều không?Xem Git đã cam kết hợp nhất trong công cụ tìm khác biệt 3 chiều bên ngoài

Nếu hợp nhất lớn giữa các nhánh được cam kết cách đây 3 tuần, có cách nào tôi có thể thấy khác biệt 3 chiều của nó trong một công cụ khác biệt ngoài bên ngoài như BeyondCompare3? Tôi đang tìm kiếm chỉ các tệp đã thay đổi trong cam kết hợp nhất. Tiền thưởng nếu tôi có thể làm cho nó chỉ hiển thị cho tôi những xung đột và bất cứ điều gì thay đổi bằng tay, trái ngược với việc nhìn thấy toàn bộ sự khác biệt của một tập tin giữa hai chi nhánh.

tôi sẽ không quan tâm giải quyết cho 2 chiều diff nếu phía bên trái có < < < < < ===== >>>>> đánh dấu xung đột và phía bên phải là kết quả đã cam kết.

Tôi cố gắng nhìn vào diff-cây, diff-files, diff, difftool, hiển thị, và những người khác và không thể hình dung nó ra. Tôi biết gitk sẽ hiển thị những thay đổi chỉ trong cam kết hợp nhất nhưng tôi không thích cái nhìn quá mức khác và nó rất khó hiểu khi có tấn thay đổi.

Nếu duy nhất tôi có thể làm điều gì đó như git difftool --cc firstparent..secondparent..result

Trả lời

2

Tôi không biết làm thế nào để làm một diff ba chiều trong git mà không cần một số hackery, nhưng đối với một hai chiều diff Tôi muốn sử dụng meld. meld có khả năng làm một cách ba chiều nếu bạn kiểm tra ba phiên bản khác nhau của dự án của bạn, làm một diff mới theo thư mục và chọn tùy chọn "Ba cách so sánh".

Đầu tiên cài đặt meld

sudo apt-get install meld

Sau đó thiết lập meld như difftool

git config --global diff.tool meld

Tìm các cam kết

git log | more

Mở các cam kết

git difftool <old-version>..HEAD

6

câu trả lời Cập nhật: phiên bản gốc của tôi về kịch bản dưới đây có sơ hở theo nghĩa là $conflicting_files trên thực tế không chỉ chứa các tập tin mà thực sự có mâu thuẫn, nhưng tất cả các file mà đã được thay đổi trong cả hai nhánh gốc (nhưng không nhất thiết phải có xung đột). Ngoài ra, nó không được sử dụng "công cụ hợp nhất được cấu hình" như được quảng cáo trong lý do, nhưng diffuse. Tôi đã giải quyết cả hai vấn đề trong số current version of the script.

câu trả lời gốc: Hãy nói rằng chúng ta có một "bậc thầy" chi nhánh với sự phát triển chính xảy ra, và một "chủ đề" chi nhánh đó cho biết thêm một số tính năng trên đầu trang của một số (cũ) bang chủ.Bằng cách nói rằng bạn đang tìm kiếm các tệp đã thay đổi trong cam kết hợp nhất, tôi giả sử bạn chỉ quan tâm đến các thay đổi "chủ đề" được giới thiệu tới "master" trong cam kết hợp nhất (bao gồm bất kỳ giải pháp xung đột nào), chứ không phải trong các thay đổi xung đột đã được thực hiện trong "chính" vì "chủ đề" đã được phân nhánh. Hơn nữa giả định rằng "bậc thầy" là phụ huynh đầu tiên của hợp nhất của bạn cam kết và "chủ đề" là lần thứ hai, điều này có thể đạt được với

git difftool <merge commit>^1 <merge commit> 

Lưu ý rằng nó không có ý nghĩa sử dụng 3 cách khác ở đây là chúng tôi đang xem xét trạng thái rằng bao gồm mọi giải pháp xung đột. Đây cũng là những gì GitHub hiển thị cho các cam kết hợp nhất, bằng cách này, xem ví dụ: this merge commit mà tôi đã sử dụng để thử nghiệm.

Để chỉ xem các file xung đột và các nghị quyết của họ trong một công cụ diff 3 chiều tôi đến với kịch bản này

#!/bin/sh 

if [ $# -ne 1 ]; then 
    echo "Rationale : Show the conflict resolution of a given merge commit in the configured merge tool." 
    echo "Usage : $(basename $0) <merge commit>" 
    exit -1 
fi 

# Test e.g. with https://github.com/git/git/commit/8cde60210dd01f23d89d9eb8b6f08fb9ef3a11b8 
our=$1^1 
their=$1^2 
base=$(git merge-base $our $their) 

conflicting_files=$(git merge-tree $base $our $their | grep -A 3 "changed in both" | grep "base" | grep -Po "[^\s]+$") 
for f in $conflicting_files; do 
    diffuse -r $our -r $base -r $their $f 
done 

Tôi đang sử dụng Diffuse thay vì Beyond Compare vì là người đầu tiên có thể làm việc trực tiếp trên Git cam kết trái ngược với các tệp cục bộ; thay đổi thứ tự các đối số theo ý thích của bạn. Để sử dụng BC, bạn có thể sẽ cần phải làm các kiểm tra tạm thời; Tôi cũng đang suy nghĩ về việc tái hợp nhất, áp dụng độ phân giải đã biết và chạy những gì đã từng cấu hình, nhưng cả hai ý tưởng này sẽ đòi hỏi nhiều công việc hơn để không làm lộn xộn cây làm việc của bạn và làm sạch.

+0

+1 để khuếch tán, thậm chí có thể làm khác biệt 4 cách với các cam kết khác nhau – Johan

0

Giống như sschuberth, tôi đã viết một tập lệnh giúp tôi tìm kiếm thay đổi trong cam kết hợp nhất. Nó hoạt động trên một tập tin duy nhất tại một thời điểm bằng cách sử dụng vimdiff để hiển thị sự khác biệt giữa cha mẹ và hợp nhất cam kết.

#! /usr/bin/env ruby 

require 'pp' 
require 'tmpdir' 

merge = ARGV[0] || abort("I need a merge commit as the first argument") 
file = ARGV[1] || abort("I need a path as the second argument") 
cmd = "vimdiff" 

commits = `git log -n 1 #{merge} --format="%H %P"`.split(' ') 
abort "expected three commits" unless commits.size == 3 
commits[0], commits[1] = commits[1], commits[0] 
tmpdir = Dir.mktmpdir 
commits.each do |commit| 
    tfile = "#{tmpdir}/#{commit[0..10]}" 

    puts "git show #{commit}:./#{file} > #{tfile}" 
    `git show #{commit}:./#{file} > #{tfile}` 
    cmd += " #{tfile}" 
end 
puts cmd 
exec(cmd) 

Hơi khó hiểu nhưng tôi đã đăng nó trong cơ hội tắt nó giúp ai đó.

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