2009-12-28 63 views
87

Làm cách nào chúng tôi có thể nhận được sự khác biệt giữa hai kho lưu trữ git?Nhận sự khác biệt giữa hai kho lưu trữ

Kịch bản: Chúng tôi có repo_a và repo_b. Sau này được tạo ra như một bản sao của repo_a. Đã có sự phát triển song song trong cả hai kho lưu trữ sau đó. Có cách nào chúng ta có thể liệt kê sự khác biệt của các phiên bản hiện tại của hai kho này?

+2

có thể trùng lặp của [Làm cách nào để so sánh hai kho lưu trữ git?] (Http://stackoverflow.com/questions/687450/how-do-i-compare-two-git-repositories) –

Trả lời

136

Trong repo_a:

git remote add -f b path/to/repo_b.git 
git remote update 
git diff master remotes/b/master 
git remote rm b 
+0

giải thích tuyệt vời, đã làm những gì tôi cần :) – Zlatko

+0

Tôi phải chỉ định điều khiển từ xa/b/master theo câu trả lời khác: http://stackoverflow.com/a/4710379/284051 –

+1

Điều gì xảy ra nếu bạn cần so sánh repo_a/master với một thẻ cụ thể của repo_b? –

7

Khi bạn có cả hai chi nhánh trong một kho lưu trữ, bạn có thể thực hiện git diff. Và nhận được chúng trong một kho lưu trữ dễ dàng như

git fetch /the/other/repo/.git refs/heads/*:refs/remotes/other/* 
+0

Có cách nào để chọn cherry không lịch sử với một chút thay đổi: Ví dụ trong tập tin repo từ xa được đặt trong một thư mục, nhưng tôi muốn áp dụng các thay đổi cho cùng một tệp nhưng được đặt trong thư mục khác trong repo cục bộ? –

+0

Nếu bạn đang nói về một thay đổi nhỏ, tôi nghĩ rằng dễ nhất sẽ chỉ là để làm cho một diff và sau đó áp dụng lại nó vào tập tin khác bằng cách sử dụng miếng vá. –

+0

Bản vá không được áp dụng vì tên tệp khác nhau mặc dù trên cùng một tệp –

2

Xem http://git.or.cz/gitwiki/GitTips, phần "Làm thế nào để so sánh hai kho địa phương" trong "General".

Nói tóm lại bạn đang sử dụng biến môi trường GIT_ALTERNATE_OBJECT_DIRECTORIES được tiếp cận với đối tượng cơ sở dữ liệu của các kho lưu trữ khác, và sử dụng git rev-parse với --git-dir/GIT_DIR để chuyển đổi tên mang tính biểu tượng trong kho lưu trữ khác để SHA-1 định danh.

phiên bản hiện đại sẽ giống như thế này (giả định rằng bạn đang ở trong 'repo_a'):

 
GIT_ALTERNATE_OBJECT_DIRECTORIES=../repo_b/.git/objects \ 
    git diff $(git --git-dir=../repo_b/.git rev-parse --verify HEAD) HEAD 

nơi ../repo_b/.git là đường dẫn đến đối tượng cơ sở dữ liệu trong repo_b (nó sẽ được repo_b.git thể nó là kho trần). Tất nhiên bạn có thể so sánh các phiên bản tùy ý, không chỉ HEADs.


Lưu ý rằng nếu repo_a và repo_b là kho cùng, nó có thể làm cho ý nghĩa hơn để đưa cả hai trong kho cùng, hoặc là sử dụng "git remote add -f ..." để tạo nickname (s) cho kho lưu trữ các bản cập nhật lặp đi lặp lại, hoặc vứt bỏ "git fetch ..."; như được mô tả trong các câu trả lời khác.

4
git diff master remotes/b 

Không chính xác. remotes/b là từ xa, nhưng không phải là chi nhánh.

Để có được nó để làm việc, tôi phải làm:

git diff master remotes/b/master 
0

Tốt nhất là phải có cả hai Repos trên máy tính cục bộ của bạn và sử dụng lệnh linux diff với hai thư mục như các thông số:

diff -r repo-A repo-B

+0

Cách duy nhất để làm cho điều này có thể sử dụng là đổi tên một trong các thư mục .git. điều này làm giảm đến hai dòng trang khác biệt không quan trọng. Đã có, làm điều đó, đến đây tìm kiếm một câu trả lời tốt hơn. – hildred

2

Meld thư mục có thể so sánh:

meld directory1 directory2 

Chỉ cần sử dụng các thư mục của hai Repos git và bạn sẽ nhận được một sự so sánh đồ họa đẹp:

enter image description here

Khi bạn bấm vào một trong các mục màu xanh, bạn có thể xem những gì thay đổi.

+0

Meld đóng băng trong khi so sánh các dự án trong giải pháp VS của tôi, BeyondCompare thì không. –

+0

trong OSX: diff -rq folder1 folder2 – Mark

0

Tôi sử dụng PyCharm có khả năng tuyệt vời để so sánh giữa các thư mục và tệp.

Chỉ cần mở thư mục mẹ cho cả hai repos và đợi cho đến khi nó lập chỉ mục. Sau đó, bạn có thể sử dụng kích chuột phải vào một thư mục hoặc tập tin và Compare to... và chọn thư mục/tập tin tương ứng ở phía bên kia.

Nó không chỉ hiển thị những tệp nào khác nhau mà còn cho nội dung của chúng. Dễ dàng hơn nhiều so với dòng lệnh.

3

Bạn có thể thêm repo khác đầu tiên như một điều khiển từ xa để repo hiện tại của bạn:

git remote add other_name PATH_TO_OTHER_REPO 

sau đó lấy brach từ xa rằng:

git fetch other_name branch_name:branch_name 

điều này tạo ra chi nhánh đó như là một chi nhánh mới trong hiện tại của bạn repo, sau đó bạn có thể phân biệt nhánh đó với bất kỳ nhánh nào của bạn, ví dụ, để so sánh nhánh hiện tại với nhánh mới (branch_name):

git diff branch_name 
Các vấn đề liên quan