Làm thế nào để khác biệt giữa các thay đổi và nguồn gốc không được cam kết tại địa phương


141

Giả sử tôi đã nhân bản một kho lưu trữ và bắt đầu sửa đổi các tệp. Tôi biết rằng nếu tôi có các thay đổi không được cam kết cục bộ, tôi có thể thực hiện một khác biệt như sau git diff test.txtvà nó sẽ cho tôi thấy sự khác biệt giữa CHÍNH cục bộ hiện tại và các thay đổi không được cam kết trong tệp. Nếu tôi cam kết những thay đổi đó, tôi có thể làm khác nó với kho lưu trữ ban đầu bằng cách sử dụnggit diff master origin/master

Nhưng có cách nào khác biệt với những thay đổi cục bộ với kho lưu trữ ban đầu trên máy chủ trước khi cam kết cục bộ không? Tôi đã thử nhiều hoán vị git diff --cached master origin/masterkhông có may mắn.


Tôi muốn biết tập tin của tôi đã thay đổi bao nhiêu so với phiên bản cam kết cuối cùng trên địa phương. Câu trả lời cho câu hỏi của tôi là câu hỏi này. Cảm ơn!
Souvik Ghosh

Câu trả lời:


133

Cho rằng kho lưu trữ từ xa đã được lưu trữ thông qua git fetchnó nên có thể so sánh với các cam kết này. Hãy thử như sau:

$ git fetch origin
$ git diff origin/master

5
Ah, xuất sắc. Chìa khóa là để chủ ra ngoài. Tôi đã thử một sự kết hợp nơi tôi đang thực hiện tìm nạp trước đó, nhưng khi tôi thực hiện git diff master origin/masternó vẫn đang so sánh với phiên bản đã cam kết (rõ ràng khi nhìn lại). Nhưng bỏ qua chủ bây giờ so sánh các thay đổi cục bộ so với phiên bản tìm nạp.
Chaitanya

@Chaitanya Tốt tôi có thể giúp. Thật ra tôi thấy các phong cách khác nhau mà Git sử dụng hơi khó chịu: một khi bạn phải viết origin mastervà ở một nơi khác origin/master. Vẫn còn nhiều việc phải làm, IMHO.
JJD

Điều này dường như không hoạt động: git diff origin/mastertrả về fatal: ambiguous argument 'origin/master': unknown revision or path not in the working tree.chủ tồn tại trên nguồn gốc, ví dụ, git fetch origin masterhoạt động tốt,
mikemaccana

42

Tôi biết đó không phải là một câu trả lời cho câu hỏi chính xác được hỏi, nhưng tôi thấy câu hỏi này đang tìm cách khác một tệp trong một nhánh và một tệp không được cam kết cục bộ và tôi đoán rằng tôi sẽ chia sẻ

Cú pháp:

git diff <commit-ish>:./ -- <path>

Ví dụ:

git diff origin/master:./ -- README.md
git diff HEAD^:./ -- README.md
git diff stash@{0}:./ -- README.md
git diff 1A2B3C4D:./ -- README.md

(Cảm ơn Eric Boehs về cách không phải nhập tên tệp hai lần)


Tôi thích giải pháp chung tốt hơn giải pháp hẹp, cụ thể ở trên. Tâm chia sẻ nơi bạn tìm thấy điều đó?
fbicknel

Tôi dường như không thể tìm thấy tài liệu về các chi tiết commit-ishvà dấu tách dấu hai chấm. Các tài liệu trên git-diff dường như không đề cập đến nó. Tôi đã sử dụng nó quá lâu đến nỗi tôi không nhớ nơi đầu tiên tôi tìm thấy nó. Có lẽ ví dụ của người khác về các lệnh khác và tôi vừa thử nghiệm git-diff. Tôi sợ một câu trả lời kháccommit-ish là điều tốt nhất tôi có thể đưa ra vào lúc này.
Nate

3
Một bổ sung tốt đẹp cho điều này là git diff master:./ -- README.md. Bằng cách đó, bạn không phải gõ README.mdhai lần và bạn có thể thêm nó vào bí danh dễ dàng hơn.
Eric Boehs

Cảm ơn @EricBoehs, Đó là một gợi ý tuyệt vời.
Nate

1
Cú pháp đó không làm việc cho tôi ... thay vì git diff master: -- README.mdcác ./tạo ra một /dev/nullnguồn chứ không phải là chi nhánh từ xa. Sử dụng git phiên bản 2.19.0
rustyDev

21

Để xem các thay đổi không theo giai đoạn (không thêm) vào các tệp hiện có

git diff

Lưu ý rằng điều này không theo dõi các tập tin mới. Để xem các thay đổi theo giai đoạn, không cam kết

git diff --cached


9

Nếu bạn muốn so sánh các tập tin một cách trực quan, bạn có thể sử dụng:

git difftool

Nó sẽ tự khởi động ứng dụng diff của bạn cho mỗi tệp đã thay đổi.

PS: Nếu bạn không đặt ứng dụng tìm khác biệt, bạn có thể làm như trong ví dụ bên dưới (Tôi sử dụng Winmerge ):

git config --global merge.tool winmerge
git config --replace --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
git config --global mergetool.prompt false

thay đổi này có hiệu lực ngay lập tức?
Dilip Raghunathan

Tôi chỉ tò mò, làm thế nào điều này liên quan đến câu hỏi được hỏi? Sẽ không git Difftool chỉ so sánh các thay đổi cục bộ với chủ? Tuy nhiên, OP muốn nó giữa các thay đổi cục bộ và chủ từ xa.
đăng

Cho đến nay, giải pháp đơn giản nhất
Chris Johnson
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.