khác bản sao làm việc hiện tại của một tập tin với bản sao cam kết của chi nhánh khác


158

Tôi có một repo với tập tin footrong nhánh chính. Tôi chuyển sang chi nhánh thanh và thực hiện một số thay đổi foo. Làm thế nào bây giờ tôi có thể chạy git diffgiữa bản sao này (chưa được cam kết) và bản sao của nhánh chính?

Câu trả lời:


151

Các công việc sau đây cho tôi:

git diff master:foo foo

Trong quá khứ, nó có thể là:

git diff foo master:foo


9
Mỗi lần tôi thấy câu trả lời của bạn liên quan git diff, tôi luôn nghĩ về stackoverflow.com/questions/5256249/git-diff-doesnt-show-enough/
Lỗi

@VonC: cảm ơn, thật tuyệt khi biết nó đáng để vẽ chúng :) Thật tình cờ, bạn có hiểu được sự kỳ quặc mà tôi đã cập nhật câu trả lời của mình không?
Mark Longair

2
Bạn đã thử với một --để tách các tham số khỏi các đối số đường dẫn? git diff -- master:foo foo
VonC

1
Trên 1.8, git diff -- master:foo fookhông hoạt động - dường như coi arg master:foolà tên tệp không tồn tại (và bỏ qua nó) thay vì tệp trong một nhánh. Hãy thử chuyển đổi 2 đối số cuối cùng - nếu nó hoạt động, so sánh khác phải được đảo ngược, nhưng đầu ra không thay đổi.
Kelvin

9
Đối với tôi thì ngược lại - tôi có thể làm git diff master:foo foonhưng không phải ngược lại. Tôi cũng không hiểu. Với git 1.7.9.5 / Ubuntu 12.04 ít nhất tôi có thể làm git diff -R master:foo foođể có được sự khác biệt mà tôi thực sự muốn. Khi tôi thử điều đó với msysgit 1.9.4 / Windows 7 x64 tôi nhận được fatal: unable to read 0000000000000000000000000000000000000000. Không có -Rtôi nhận được thông báo lỗi giống như bạn với git 1.7.9.5, nhưng với 1.9.4 tôi nhận được fatal: master:foo: no such path in the working tree.
JMM

100

Bạn đang cố gắng so sánh cây làm việc của mình với một tên nhánh cụ thể, vì vậy bạn muốn điều này:

git diff master -- foo

Đó là từ hình thức git-diff này (xem trang chủ git-diff)

   git diff [--options] <commit> [--] [<path>...]
       This form is to view the changes you have in your working tree
       relative to the named <commit>. You can use HEAD to compare it with
       the latest commit, or a branch name to compare with the tip of a
       different branch.

FYI, cũng có một tùy chọn --cached(aka --staged) để xem khác biệt của những gì bạn đã dàn dựng, thay vì mọi thứ trong cây làm việc của bạn:

   git diff [--options] --cached [<commit>] [--] [<path>...]
       This form is to view the changes you staged for the next commit
       relative to the named <commit>.
       ...
       --staged is a synonym of --cached.

2
Cảm ơn. Không biết tại sao, nhưng chỉ có câu trả lời này hoạt động với tôi với git 1.8.1 trong Linux.
srking

Tuyệt vời cảm ơn bạn. Tôi gác máy vì muốn đưa tên của chi nhánh hiện tại của mình vào lệnh diff, nhưng tôi thấy điều đó không cần thiết.
yoyo

Điều này làm việc cho tôi một vài tháng trước, nhưng dường như không phải bây giờ. Hiện tại tôi đang ở phiên bản git 2.7.4 (Apple Git-66); Tôi không biết những gì tôi đã có trước đây.
hBrent

@hBrent cái này vẫn hoạt động với tôi trên OSX 10.11 với git 2.7.3. Đây là một repo mẫu nhanh với các hướng dẫn nếu điều đó hữu ích: github.com/jordan-brough/git-diff-test
Jordan Brough

Cảm ơn @JordanBrough.
hBrent

14

Cũng thế: git diff master..feature foo

git diff foo master:fookhông làm việc trên các thư mục cho tôi.


Tôi cũng không. Nó có phải là một thứ Windows?
Scott Stafford

@ScottStafford Tôi đang dùng Ubuntu, vì vậy không, có vẻ như đó không phải là một thứ Windows.
ArtBIT

Hoạt động với tôi miễn là tôi cung cấp rõ ràng cả hai tên chi nhánh (cửa sổ) git diff branch1:foo master:foo
Meep

12
git difftool tag/branch filename

Đây là câu trả lời duy nhất phù hợp với tôi để so sánh giữa một bản sao làm việc cục bộ của một tệp và phiên bản tệp đó trong một repo từ xa (không phải là "bản gốc"). Cảm ơn, Adir và Baz
Chuột

git difftoolkhông có -vtùy chọn theo tài liệu git-scm.com/docs/git-difftool . Ý bạn là -ysao
ks1322

10
git diff mybranch master -- file

cũng nên làm việc


4
Điều này chỉ hoạt động cho các tập tin cam kết với mybranch, không phải là bản sao làm việc hiện tại của tập tin.
yoyo

"-" nghĩa là gì ở trên
Pushparaj

Điều này cho phép so sánh theo cả hai hướng: git diff deployment master -- filegit diff master deployment -- filehoạt động như mong đợi với bất kỳ 2 chi nhánh nào .
viktorkho

0

Để xem các thay đổi cục bộ so với chi nhánh hiện tại của bạn

git diff .

Để xem thay đổi cục bộ so với bất kỳ chi nhánh hiện có khác

git diff <branch-name> .

Để xem những thay đổi của một tập tin cụ thể

git diff <branch-name> -- <file-path>

Hãy chắc chắn rằng bạn chạy git fetchlúc đầu.

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.