2013-07-16 21 views
102

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ó những 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.txt và nó sẽ cho tôi thấy sự khác biệt giữa HEAD cục bộ hiện tại và các thay đổi được sửa đổ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ể phân biệt nó với kho lưu trữ ban đầu bằng cách sử dụng git diff master origin/masterCách Khác biệt giữa các thay đổi và nguồn gốc không được cam kết của địa phương

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

+0

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

Trả lời

98

Cho rằng kho lưu trữ từ xa đã được lưu trữ qua git fetch, bạ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 
+4

Ah, tuyệt vời. Điều quan trọng là để lại chủ. Tôi đã thử một sự kết hợp mà tôi đã làm một lấy trước, nhưng khi tôi đã làm 'git diff master origin/master' nó vẫn so sánh với phiên bản cam kết (rõ ràng trong nhìn lại). Nhưng bỏ qua tổng thể hiện so sánh các thay đổi cục bộ so với phiên bản đã tìm nạp. – Chaitanya

+0

@Chaitanya Tốt Tôi có thể giúp. Trên thực tế tôi tìm thấy các phong cách khác nhau Git sử dụng một chút khó chịu: một khi bạn phải viết 'master gốc' và một nơi nào khác' origin/master'. Vẫn còn việc phải làm, IMHO. – JJD

+0

Điều này dường như không hoạt động: 'git diff origin/master' trả về ' fatal: ambiguous argument 'origin/master': chưa biết sửa đổi hoặc đường dẫn không có trong cây đang hoạt động.' master tồn tại trên nguồn gốc mặc dù, ví dụ 'git fetch xuất xứ master' hoạt động tốt, – mikemaccana

27

Tôi biết nó không phải là một câu trả lời cho câu hỏi chính xác yêu cầu, nhưng tôi thấy câu hỏi này tìm cách để diff một file trong một chi nhánh và một tập tin không bị giam địa phương và tôi figured 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 [email protected]{0}:./ -- README.md 
git diff 1A2B3C4D:./ -- README.md 

(Cảm ơn Eric Boehs kiếm một cách để không phải gõ lại tên hai lần)

+0

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

+0

Tôi không thể tìm thấy tài liệu về chi tiết của 'commit-ish' và dấu phân cách dấu hai chấm. Các tài liệu trên [git-diff] (http://git-scm.com/docs/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 tôi đã tìm thấy nó lần đầu tiên. Có lẽ là ví dụ của người khác về các lệnh khác và tôi chỉ thử nghiệm với 'git-diff'. Tôi sợ [một câu trả lời khác trên 'commit-ish'] (http://stackoverflow.com/a/23303550/761771) là tốt nhất tôi có thể nghĩ ra vào lúc này. – Nate

+1

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.md' hai lần và bạn có thể thêm nó vào một bí danh dễ dàng hơn. –

5

Nếu bạn muốn so sánh các file trực quan, bạn có thể sử dụng:

git difftool 

Nó sẽ bắt đầu ứng dụng khác một cách tự động cho mỗi tập tin đã thay đổi .

PS: Nếu bạn không thiết lập một ứng dụng khác, bạn có thể làm điều đó như trong ví dụ dưới đây (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 
+0

thay đổi này có hiệu lực ngay lập tức không? –

+0

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

15

Để xem không dàn dựng (không tăng) thay đổi các tệp hiện có

git diff

Lưu ý rằng điều này không theo dõi tệp mới. để xem dàn dựng, thay đổi không cam

git diff --cached

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