Lấy sự khác biệt giữa hai kho lưu trữ


183

Làm thế nào chúng ta có thể nhận được sự khác biệt giữa hai kho git?

Kịch bản: Chúng tôi có repo_a và repo_b. Cái sau được tạo ra như một bản sao của repo_a. Sau đó đã có sự phát triển song song trong cả hai kho lưu trữ. 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 lưu trữ này không?


Câu trả lời:


250

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

Tôi đã phải xác định từ xa / b / master theo câu trả lời khác: stackoverflow.com/a/4710379/284051
Doug Moscrop

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

2
không làm việc cho tôi, đó là ném: fatal: đối số mơ hồ 'từ xa / b / master': sửa đổi không xác định hoặc đường dẫn không nằm trong cây làm việc. Sử dụng '-' để tách các đường dẫn khỏi các phiên bản, như thế này: 'git <lệnh> [<sửa đổi> ...] - [<file> ...]' Có ý tưởng nào ở đây không?
Andrew Heekin

2
Tôi đang nhận được giống như @AndrewHeekin. Có ai có giải pháp không?
Quốc hội

4
Tôi dường như cần phải chỉ định origin/masterchứ không phải là một trần master. Ngoài ra, điều này tìm thấy sự khác biệt giữa các nhánh chính, vậy nếu bạn muốn tìm tất cả các nhánh khác nhau thì sao? Ví dụ để kiểm tra trạng thái của một bản sao lưu kho lưu trữ?
davidA

33

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

meld directory1 directory2

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

nhập mô tả hình ảnh ở đây

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


1
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.
Sasha Bond

4
trong OSX: diff -rq thư mục1 thư mục2
Đánh dấu

1
Liên kết tuyệt vời! Chương trình rất đơn giản, hiện tôi đang sử dụng chương trình này làm chương trình tìm khác biệt cho OSX.
dmanexe

1
Điều này là hoàn toàn đáng yêu! Cám ơn vì đã chia sẻ.
Shihab Khan

Tôi không chắc liệu meld có khả năng xử lý các tệp bị git bỏ qua hay không - bạn nên cân nhắc điều này trong khi sử dụng nó
noamgot

11

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

git remote add other_name PATH_TO_OTHER_REPO

sau đó lấy brach từ xa đó:

git fetch other_name branch_name:branch_name

điều này tạo ra nhánh đó như một nhánh mới trong repo hiện tại của bạn, sau đó bạn có thể khác 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

7

Một khi bạn có cả hai nhánh trong một kho lưu trữ, bạn có thể làm một 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/*

Có cách nào để chọn lịch sử cherry với một chút thay đổi: Ví dụ: trong tệp 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ộ?
Eugen Konkov

Nếu bạn đang nói về một thay đổi nhỏ, tôi nghĩ cách dễ nhất sẽ là tạo một khác biệt và sau đó áp dụng lại nó vào tệp khác bằng cách sử dụng bản vá.
Michael Krelin - hacker

Bản vá không được áp dụng do các tên tệp khác nhau mặc dù trên đó là các tệp giống nhau
Eugen Konkov

Ồ, tôi chỉ nghĩ về các thư mục khác nhau, không phải tên tệp (thư mục có thể dễ dàng xử lý thông qua các tùy chọn vá). Chà, đối với tên tệp tôi chỉ cần thay đổi chúng theo cách thủ công hoặc thông qua tập lệnh. Điều đó nói rằng, tôi không nói rằng không có giải pháp nào tốt hơn, chỉ là những gì tôi có thể đưa ra mà không cần đào bất cứ nơi nào.
Michael Krelin - hacker

7
git diff master remotes/b

Điều đó không chính xác. remotes/blà một điều khiển từ xa, nhưng không phải là một chi nhánh.

Để làm cho nó hoạt động, tôi đã phải làm:

git diff master remotes/b/master

1
Điều này thực sự nên là một nhận xét về câu trả lời có liên quan.
EntangledLoops

6

Xem http://git.or.cz/gitwiki/GitTips , phần "Cách so sánh hai kho lưu trữ cục bộ" trong "Chung".

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

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

GIT_ALTERNATE_OB DỰ_DIRECTORIES = .. / repo_b / .git / object \
   git diff $ (git --git-dir = .. / repo_b / .git rev-parse - xác định đầu)

nơi ../repo_b/.gitlà đường dẫn đến cơ sở dữ liệu đối tượng trong repo_b (nó sẽ là 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ỉ các ĐẦU.


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


5

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 nhấp chuột phải vào một thư mục hoặc tệp Compare to...và chọn thư mục / tệp tương ứng ở phía bên kia.

Nó cho thấy không chỉ các tập tin khác nhau mà còn cả nội dung của chúng. Dễ dàng hơn nhiều so với dòng lệnh.


2

Đặt cược tốt nhất của bạn là có cả hai repos trên máy cục bộ của bạn và sử dụng lệnh linux diff với hai thư mục làm tham số:

diff -r repo-A repo-B


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

2

Một cách dễ dàng để làm điều đó mà không cần chạm vào cấu hình điều khiển từ xa của bạn. Từ repo A, trong master (giả sử bạn muốn so sánh các nhánh master):

git fetch path/to/repo_b.git master
git diff FETCH_HEAD

0

Bạn có thể sử dụng lệnh sau:

diff -x .git -r repo-A repo-B

hoặc cho bên cạnh bạn có thể sử dụng:

diff -x .git -W200 -y -r repo-A repo-B

Trong trường hợp Colorizing mọi tệp diff, bạn có thể sử dụng:

diff -x .git -W200 -y -r repo-A repo-B | sed -e "s/\(^diff .*\)/\x1b[31m\1\x1b[0m/"

dựa trên giải pháp @ andrew-heekin
Gerard

0

Nhắc nhở để tự ... tìm nạp trước, nếu không, kho lưu trữ không có hàm băm cục bộ (tôi đoán vậy).

Bước 1. Thiết lập điều khiển từ xa ngược dòng trở lên ^

khác biệt một tập tin theo mẫu này:

git diff localBranch gainreamBranch --spacepath / singlefile

git diff master upstream/nameofrepo -- src/index.js

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.