git Difftool, mở tất cả các tệp diff ngay lập tức, không nối tiếp


240

Hành vi git diff mặc định là mở từng tệp diff theo thứ tự (đợi tệp trước đó được đóng trước khi mở tệp tiếp theo).

Tôi đang tìm cách mở tất cả các tệp cùng một lúc - ví dụ như trong BeyondCompare, điều này sẽ mở tất cả các tệp trong các tab trong cùng một cửa sổ BC.

Điều này sẽ giúp dễ dàng hơn để xem xét một tập hợp thay đổi phức tạp; vuốt qua lại giữa các tệp khác và bỏ qua các tệp không quan trọng.


"Git diff" hay "git Difftool"? Bạn có thể muốn gửi yêu cầu trên (mở cho tất cả và với giao diện web đa dạng) danh sách gửi thư git: git@vger.kernel.org
Jakub Narębski

Tôi đang sử dụng "git Difftool" để kích hoạt ứng dụng khác bên ngoài. Cảm ơn ý tưởng danh sách gửi thư.
Seba Illingworth

Nó sẽ hữu ích để biết nền tảng. Trên nền tảng dựa trên Unix, tôi sẽ viết một tập lệnh để thực hiện tìm khác biệt và hướng dẫn git sử dụng tập lệnh đó. Trong kịch bản, tôi chỉ đơn giản là chạy diff trong nền sau đó để script chết.
Chris Cleeland

Nền tảng Windows, nhưng cảm ơn vì ý tưởng Chris.
Seba Illingworth

1
Đối với mergetool: stackoverflow.com/questions/39259116/
Kẻ

Câu trả lời:


214

Bắt đầu với gitv1.7.11, bạn có thể sử dụng git difftool --dir-diffđể thực hiện một thư mục khác.

Ví dụ, tính năng này hoạt động tốt với Meld 3.14.2 và cho phép bạn duyệt tất cả các tệp đã sửa đổi:

git difftool --dir-diff --tool=meld HEAD~ HEAD

Đây là một hàm Bash tiện dụng:

git-diff-meld() (
  git difftool --dir-diff --tool=meld "${1:-HEAD~}" "${2:-HEAD}"
)

Câu trả lời sau đây áp dụng cho các gitcài đặt cũ hơn v1.7.11.


Câu hỏi tương tự đã được hỏi trên danh sách thư git .

Tôi kết hợp một tập lệnh shell dựa trên chuỗi email đó thực hiện một thư mục khác nhau giữa các lần xác nhận tùy ý.

Bắt đầu với git v1.7.10, git-diffalltập lệnh được bao gồm trong contribcài đặt git tiêu chuẩn.

Đối với các phiên bản trước v1.7.10, bạn có thể cài đặt từ git-diffalldự án trên GitHub .

Dưới đây là mô tả dự án:

Kịch bản git-diffall cung cấp một cơ chế khác biệt dựa trên thư mục cho git. Kịch bản dựa trên tùy chọn cấu hình diff.tool để xác định xem trình xem diff được sử dụng.

Tập lệnh này tương thích với tất cả các biểu mẫu được sử dụng để chỉ định một phạm vi sửa đổi cho diff:

1) git diffall: hiển thị khác nhau giữa cây làm việc và thay đổi theo giai đoạn
2) git diffall --cached [<commit>]: hiển thị khác nhau giữa các thay đổi theo giai đoạn và HEAD (hoặc cam kết có tên khác)
3) git diffall <commit>: hiển thị khác nhau giữa cây làm việc và cam kết có tên
4) git diffall <commit> <commit>: hiển thị khác biệt giữa hai cam kết có tên
5) git diffall <commit>..<commit>: giống nhau như trên
6) git diffall <commit>...<commit>: hiển thị các thay đổi trên nhánh chứa và lên đến lần thứ hai, bắt đầu từ một tổ tiên chung của cả hai<commit>

Lưu ý: tất cả các hình thức có một giới hạn đường dẫn tùy chọn [--] [<path>]

Kịch bản này dựa trên một ví dụ được cung cấp bởi Thomas Rast trong danh sách Git .


Sự khác biệt giữa git-diffall và github.com/wmanley/git-meld là gì? Tôi đã thử cả hai và chúng dường như cung cấp chức năng giống hệt nhau từ cái nhìn đầu tiên.
kynan

5
Tôi cho một người đánh giá rất cao kịch bản của bạn. Thành thật mà nói, tôi không thể hiểu tại sao Git không hành xử đúng đắn trong vấn đề này (Mercurial, và đã làm như vậy trong nhiều năm), tôi cũng không thể hiểu được sự thiếu quan tâm từ cộng đồng Git.
Douglas

6
Cập nhật (liên quan git difftool --dir-diffvà vượt quá so sánh): Tôi đã liên hệ với Phần mềm xe tay ga (tác giả của Beyond So sánh) và họ nói rằng đó bcompare.exekhông phải là giải pháp được hỗ trợ và có thể gây ra sự cố nếu có nhiều hơn một lần mở khác nhau. Họ dự định thêm hỗ trợ cho thư mục khác với bcomp.exephiên bản trong tương lai (trong thời gian này, tôi sẽ tiếp tục sử dụng bcompare.exenhư một cách giải quyết không được hỗ trợ).
Peter Rust

4
@coin Tôi vừa thử nghiệm với Beyond So sánh 4 và --dir-diff dường như hoạt động với bcomp.exe được hỗ trợ.
Peter Rust

5
Chỉ cần bình luận để nói rằng --dir-diffhoạt động hoàn hảo với Meld. Từ đó, nó sẽ cho phép bạn chọn và xem các khác biệt cho các tệp riêng lẻ.
mkasberg

61

Đây là những gì tôi đã giải quyết ...

Sao chép mã sau vào một tệp có tên git-diffall(không có phần mở rộng):

#!/bin/sh
git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename" &
done

Đặt tệp vào cmdthư mục của thư mục cài đặt git của bạn (ví dụ C:\Program Files (x86)\Git\cmd)

Và sử dụng như bạn sẽ git diff:

git diffall
git diffall HEAD
git diffall --cached 
git diffall rev1..rev2
etc...

Ghi chú: Chìa khóa của nó là & param cho biết lệnh diff bên ngoài chạy trong tác vụ nền để các tệp được xử lý ngay lập tức. Trong trường hợp BeyondCompare, điều này sẽ mở một màn hình với mỗi tệp trong tab riêng.


Cảm ơn vì đăng. Unfortunatley, nó không hoạt động với tùy chọn -s của WinMerge. Tất cả các tệp tạm thời ngoại trừ tệp đầu tiên bị xóa trước khi WinMerge xem xét chúng.
Carlos Rendon

Carlos: Tôi sử dụng WinMerge với Git. Cách tiếp cận của tôi là thêm 'ngủ 1' sau khi khởi chạy WinMerge (trong trường hợp của tôi dường như đã khởi chạy "trong nền" - không cần &). Bằng cách này, tệp tạm thời chỉ đủ dài để WinMerge chọn nó một lần (trừ trường hợp lạ). Điều đó cũng có nghĩa là phải mất 1 giây cho mỗi tệp để mở tất cả. Đó là một hack khó chịu (tôi sẽ không bao giờ trình bày nó như một "câu trả lời"!), Nhưng là một cách dễ dàng, khá hiệu quả.
Woody Zenfell III

2
Để sử dụng trên Linux, với Git 2.x, tôi đã phải thực hiện một sửa đổi nhỏ: thay đổi "$filename"thành "../$filename". Sau đó, nó hoạt động hoàn hảo với Beyond So sánh
Dave C

1
@DaveC trong luồng gốc, nó nói "lưu trữ tệp trong thư mục cmd của cài đặt git của bạn" và tiến hành với một ví dụ trên windows. Bạn đã lưu trữ tệp "git-diffall" trong Linux ở đâu?
m4l490n

2
Chúng ta có cần khởi động lại windows sau khi thêm git-diffalltập tin vào C:\Program Files\Git\cmdthư mục không? Tôi đã làm đúng như hướng dẫn nhưng khi thực hiện $ git diffall git: 'diffall' is not a git command. See 'git --help'. Did you mean this? difftool
nesdis

19

meld có một tính năng gọn gàng mà nếu bạn cung cấp cho nó một thư mục dưới sự kiểm soát nguồn (Git, Mercurial, Subversion, Bazaar và có thể là những người khác), nó sẽ tự động liệt kê tất cả các tệp đã thay đổi và bạn có thể nhấp đúp để xem các khác biệt.

IMO dễ dàng hơn nhiều để nhập meld .và tìm ra VCS hơn là cấu hình VCS của bạn để khởi chạy meld. Ngoài ra, bạn có thể sử dụng cùng một lệnh cho dù dự án của bạn đang sử dụng VCS nào, điều này thật tuyệt nếu bạn chuyển đổi giữa chúng nhiều.

Nhược điểm duy nhất là việc quét các thay đổi chậm hơn so với việc chuyển các thay đổi từ git / hg / svn, mặc dù nó có đủ chậm để trở thành vấn đề hay không sẽ phụ thuộc vào cách bạn sử dụng.


4
Đối với tôi, nhược điểm chính là meld (vì bất kỳ lý do gì) mở diff trong một cửa sổ mới thay vì một tab mới và sau khi đóng diff, tập tin trong thư mục làm việc sẽ mở trong một tab mới với thông báo popup khó chịu trước đó.
kynan

công cụ đẹp nhưng cài đặt Windows khủng khiếp (tính đến đầu năm 2012).
Wernight

@kynan Đây có vẻ như là giải pháp hoàn hảo cho cách khác biệt của VCS nếu không phải vì điều đó cửa sổ bật lên đôi khó chịu. Thật xấu hổ. :(
PKKid

Một tính năng tuyệt vời của meld là các bộ lọc khác của nó: bỏ qua các thay đổi, ví dụ như trong các bình luận hoặc thêm / xóa các dòng trống, git diffkhông cung cấp.
kynan

1
Tôi đã sử dụng phương pháp này trong một năm hoặc lâu hơn; nó hoạt động tốt cho các dự án nhỏ hơn nhưng một khi bạn có một dự án lớn (tức là rất nhiều tệp) thì nó bị chậm một cách khó khăn vì nó "quét" thủ công cho git diffs (không chắc tại sao nó lại sử dụng cách tiếp cận này khi git rõ ràng có thể cung cấp cho nó một danh sách tệp trực tiếp ...)
namuol

3

Tôi đã tìm thấy phương thức này (GitDiff.bat và GitDiff.rb) sao chép các tệp ra các thư mục tạm thời cũ / mới và sau đó thực hiện một thư mục so sánh chúng.

Nhưng tôi muốn xem các tệp làm việc trực tiếp (từ thư mục làm việc), vì BeyondCompare có tính năng tiện dụng là có thể chỉnh sửa tệp từ trong cửa sổ diff, rất tốt để dọn dẹp nhanh.

Chỉnh sửa: một phương pháp tương tự ở đây để trả lời câu hỏi của tôi trong danh sách gửi thư git.


3

git meld=> https://github.com/wmanley/git-meld là một tập lệnh tuyệt vời sẽ mở ra một khác biệt gọn gàng của tất cả các tệp trong một cửa sổ.


Hoạt động tuyệt vời! Là một phần thưởng bổ sung, nó hoạt động chính xác như hg meld. Cảm ơn!
PKKid

2

Thông báo ở đây rằng Araxis Merge có tùy chọn lệnh '-nowait':

-nowait Ngăn chặn so sánh chờ đợi để so sánh được đóng lại

Có lẽ điều này trả về một mã thoát ngay lập tức và sẽ làm việc, bất cứ ai có kinh nghiệm này? Không thể tìm thấy tùy chọn tương tự cho BeyondCompare ...


2

Khuếch tán cũng có tích hợp VCS. Nó tương tác với rất nhiều VCS khác, bao gồm SVN, Mercurial, Bazaar, ... Đối với Git, nó thậm chí sẽ hiển thị ba pan nếu một số nhưng không phải tất cả các thay đổi được dàn dựng. Trong trường hợp có xung đột, thậm chí sẽ có bốn tấm.

Ảnh chụp màn hình khuếch tán với các chỉnh sửa theo giai đoạn và không được dàn dựng

Gọi nó với

diffuse -m

trong bản sao làm việc Git của bạn.

Nếu bạn hỏi tôi, sự khác biệt về hình ảnh tốt nhất mà tôi đã thấy trong một thập kỷ. (Và tôi cũng đã thử meld.)


Bạn có thể cho biết phần nào của khuếch tán bạn thích, đặc biệt là trên meld không?
musiphil 24/07/2015

@musiphil: Tôi thích sự đơn giản của nó - dường như có bộ tính năng chính xác cần thiết để giải quyết công việc, không hơn, nhưng cũng không ít. (Giống như sắp xếp lại sự khác biệt và chiều rộng kích thước tab.) Tôi không nhớ tại sao tôi chuyển từ meld và tôi đã không sử dụng meld kể từ đó vì vậy tôi không thể thực sự so sánh chúng bây giờ.
krlmlr

1
Diffuse làm việc với git mà không có bất kỳ cấu hình. Diffuse -m mở một cửa sổ với git diff trong các tab khác nhau; trong khi các công cụ khác cần quá nhiều cấu hình để bắt đầu.
mosh

1

Nếu tất cả những gì bạn muốn làm là mở tất cả các tệp hiện đang được sửa đổi, hãy thử một cái gì đó như:

vi $ (trạng thái git | sed -n '/.*modified: * / s /// p')

Nếu bạn đang thực hiện các "thay đổi phức tạp", bạn có thể muốn xem xét lại quy trình làm việc của mình. Một trong những tính năng thực sự hay của git là nó giúp nhà phát triển dễ dàng giảm các bộ thay đổi phức tạp thành một loạt các bản vá đơn giản. Thay vì cố gắng chỉnh sửa tất cả các tệp hiện đang được sửa đổi, bạn có thể muốn xem xét

git thêm --patch
Điều này sẽ cho phép bạn chọn lọc giai đoạn hunk.


1

Tôi đã viết một tập lệnh powershell sẽ nhân đôi hai cây làm việc và so sánh với DiffMerge. Vì vậy, bạn có thể làm:

GitNdiff master~3 .

Ví dụ, để so sánh nhánh chính ba lần đăng ký với cây làm việc hiện tại.

Nó sáng bóng và mới và có thể đầy lỗi. Một nhược điểm là các tệp trong cây làm việc của bạn chưa được thêm vào được sao chép ra cả hai cây làm việc. Nó cũng có thể chậm.

http://github.com/fschwiet/GitNdiff


1

Đối với những người quan tâm đến việc sử dụng git-diffall trên Mac OS X với Araxis, tôi đã rẽ nhánh dự án git-diffall trên github và thêm một AppleScript bao bọc lệnh Araxis Merge. Lưu ý: đây là bản sao được sửa đổi một chút của araxisgitdifftệp đi kèm với Araxis Merge cho Mac OS X.

https://github.com/sorens/git-diffall


1

Sau đây hoạt động với meld và kdiff3

git difftool --dir-diff origin/branch1..origin/branch2

Mở tất cả các tệp trong một cửa sổ mà bạn có thể duyệt dễ dàng. Có thể được sử dụng với các thay đổi thay cho nguồn gốc / tên chi nhánh

ví dụ: git difftool --dir-diff origin/master..24604fb72f7e16ed44115fbd88b447779cc74bb1


-2

Bạn có thể sử dụng gitk và xem tất cả sự khác biệt cùng một lúc


3
Vâng, tôi thấy gitk hữu ích, nhưng khi nói đến diff-ing BC là những gì tôi muốn thấy :)
Seba Illingworth
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.