Câu hỏi Làm cách nào để so sánh các tệp từ hai nhánh khác nhau?


Tôi có một kịch bản hoạt động tốt trong một nhánh và bị phá vỡ trong một nhánh khác. Tôi muốn xem xét hai phiên bản song song và xem có gì khác biệt. Có cách nào để làm điều này không?

Rõ ràng Tôi không tìm kiếm một công cụ so sánh (tôi sử dụng Beyond Compare). Tôi đang tìm một lệnh git diff cho phép tôi so sánh phiên bản chính với phiên bản nhánh hiện tại của tôi để xem những gì đã thay đổi. Tôi không ở giữa một hợp nhất hay bất cứ thứ gì. Tôi chỉ muốn nói điều gì đó như

git diff mybranch/myfile.cs master/myfile.cs

1091
2017-11-04 18:04


gốc




Các câu trả lời:


git diff có thể cho bạn thấy sự khác biệt giữa hai cam kết:

git diff mybranch master -- myfile.cs

Hoặc, tương đương:

git diff mybranch..master -- myfile.cs

Sử dụng cú pháp sau, nếu một trong hai bên là HEAD nó có thể bị bỏ qua (ví dụ: master.. so sánh master đến HEAD).

Bạn cũng có thể quan tâm mybranch...master (từ git diff tài liệu):

Biểu mẫu này là để xem các thay đổi trên nhánh chứa và đến thứ hai <commit>, bắt đầu từ một tổ tiên chung của cả hai <commit>. git diff A...B tương đương với git diff $(git-merge-base A B) B.

Nói cách khác, điều này sẽ tạo ra sự khác biệt về những thay đổi trong master kể từ khi nó phân ra từ mybranch (nhưng không có thay đổi mới kể từ đó mybranch).


Trong mọi trường hợp, -- dấu phân tách trước tên tệp cho biết kết thúc cờ dòng lệnh. Đây là tùy chọn trừ khi Git sẽ bị nhầm lẫn nếu đối số đề cập đến một cam kết hoặc một tệp, nhưng bao gồm cả nó không phải là một thói quen xấu để có được vào. Xem https://stackoverflow.com/a/13321491/54249 cho một vài ví dụ.


Các đối số tương tự có thể được chuyển đến git difftool nếu bạn có một cấu hình.


1580
2017-11-04 18:13



Và nếu cả hai phiên bản bạn muốn so sánh là cây công việc, bạn có thể sử dụng git diff branch1 branch2 myfile.cs. (Các -- không cần thiết nữa, vì nó chỉ có thể mất tối đa hai đối số sửa đổi.) - Cascabel
Tôi đã thử mọi phiên bản của điều này và không có gì xảy ra. Tôi đã cấu hình difftool của tôi (nó hoạt động cho việc sáp nhập). Tôi có một tập tin gọi là bd.ps1. Mỗi phiên bản của lệnh tôi gõ không làm gì cả. Thậm chí không đưa ra một sai lầm. WTH!?!?! - Micah
@Micah: Bạn có đang thử nó với sự khác biệt đơn giản không? Bạn có chính xác gõ đường dẫn liên quan đến thư mục hiện tại không? (Nó sẽ âm thầm hiển thị không có khác nếu tập tin không tồn tại, và bạn sử dụng --. Lỗi thường gặp và dễ thực hiện.) - Cascabel
Điều này không hiệu quả đối với tôi trừ khi tôi đưa đường dẫn đầy đủ vào tệp, như được hiển thị bởi git diff --name-status branch1..branch2 (có lẽ hiển nhiên, nhưng nghĩ tôi sẽ đề cập đến nó trong trường hợp người khác có cùng rắc rối với tôi). - hBrent
Thứ tự của mybranch và master cũng rất quan trọng. Tệp trong nhánh đầu tiên sẽ được hiển thị bằng các tiền tố '-', tệp trong nhánh thứ hai sẽ được hiển thị bằng các tiền tố '+'. - timbo


Bạn có thể làm được việc này: git diff branch1:file branch2:file

Nếu bạn có cấu hình difftool, thì bạn cũng có thể: git difftool branch1:file branch2:file

Câu hỏi liên quan: Làm cách nào để xem đầu ra git diff bằng chương trình khác biệt trực quan


309
2017-11-04 18:12



Sử dụng dấu hai chấm không thực sự là một cách tuyệt vời - nó có nghĩa là bạn đang tham chiếu các tệp thông qua các đối tượng cây, vì vậy bạn phải nhập đường dẫn đầy đủ, thay vì liên quan đến thư mục hiện tại của bạn. - Cascabel
@ Jefromi, điều này có thể đã thay đổi trong một phiên bản mới hơn, nhưng ít nhất bây giờ bạn có thể sử dụng các đường dẫn tương đối (ví dụ: branch1:./file). Điều này cũng hữu ích nếu tệp ở một vị trí riêng biệt giữa các nhánh (ví dụ: git diff branch1:old/path/to/file branch2:new/path/to/file). - redbmk
@redbmk Vâng, đó là đôi khi từ năm 2010 đến nay! Tuy nhiên, nếu đó là cùng một tệp trên cả hai nhánh, không cần phải làm như thế này, chỉ git diff branch1 branch2 path/to/file. - Cascabel
@ jefromi cool, tôi không chắc về dòng thời gian khi được thêm vào. Vâng, tôi thường sử dụng cú pháp bạn đã đề cập, nhưng câu trả lời của Tim đã giúp tôi tìm ra cách so sánh các tệp với các đường dẫn khác nhau, mặc dù nó không thực sự là câu hỏi được đặt ra - redbmk
Trong khi tôi thích ý tưởng này, tôi không thể có được cú pháp này để làm việc hoặc tìm thấy bất kỳ đề cập đến nó trong các tài liệu git diff. Tôi đang thiếu gì? Cảm ơn! - yoyo


Cú pháp hiện đại hơn:

git diff ..master path/to/file

Tiền tố dấu chấm kép có nghĩa là "từ thư mục làm việc hiện tại đến". Bạn cũng có thể nói:

  • master.., tức là ngược lại ở trên. Điều này cũng giống như master.
  • mybranch..master, tham chiếu rõ ràng một trạng thái khác với cây làm việc hiện tại.
  • v2.0.1..master, nghĩa là tham chiếu một thẻ.
  • [refspec]..[refspec]về cơ bản, bất kỳ điều gì có thể nhận dạng là trạng thái mã thành git.

125
2018-06-25 00:41





Tôi chỉ đơn giản là làm git diff branch1 branch2 path/to/file

Điều này kiểm tra sự khác biệt giữa các tập tin. Những thay đổi trong branch1 sẽ có màu đỏ. Những thay đổi trong branch2 sẽ có màu xanh lá cây.

Giả sử rằng branch1 là quá khứ và branch2 là tương lai. Bạn có thể đảo ngược điều này bằng cách đảo ngược thứ tự của các nhánh trong diff: git diff branch2 branch1


8
2018-05-22 14:14



Phiên bản nào của git diff có thể làm được điều này? Nó dường như không được hỗ trợ trong phiên bản tôi đang chạy (2..9.2.windows.1). - Vince Bowdren


Có nhiều cách để so sánh các tệp từ hai nhánh khác nhau:

  • Lựa chọn 1: Nếu bạn muốn so sánh tập tin từ n nhánh cụ thể với một nhánh cụ thể khác:

    git diff branch1name branch2name path/to/file
    

    Thí dụ:

    git diff mybranch/myfile.cs mysecondbranch/myfile.cs
    

    Trong ví dụ này, bạn đang so sánh tệp trong nhánh “mybranch” với   trong nhánh “mysecondbranch”.

  • Lựa chọn 2: Cách đơn giản:

     git diff branch1:file branch2:file
    

    Thí dụ:

     git diff mybranch:myfile.cs mysecondbranch:myfile.cs
    

    Ví dụ này tương tự như tùy chọn 1.

  • Tùy chọn 3: Nếu bạn muốn so sánh thư mục làm việc hiện tại của bạn với một số chi nhánh:

    git diff ..someBranch path/to/file
    

    Thí dụ:

    git diff ..master myfile.cs
    

    Trong ví dụ này, bạn đang so sánh tệp từ nhánh thực tế của bạn với   tệp trong nhánh chính.


8
2018-04-04 13:34





Đồng ý với câu trả lời được gợi ý bởi @dahlbyk. Nếu bạn muốn các diff được ghi vào một tập tin khác để đánh giá mã sử dụng lệnh sau đây.

git diff branch master -- filepath/filename.extension > filename.diff --cached

2
2017-10-06 07:19





Cách tốt nhất để làm điều đó là sử dụng git diff theo cách sau: git diff <source_branch> <target_branch> -- file_path

Nó sẽ kiểm tra sự khác biệt giữa các tệp trong các nhánh đó. Hãy xem bài viết này để biết thêm thông tin về lệnh git  và cách chúng hoạt động.


0
2018-05-07 12:18





Để so sánh hai tệp trong git bash bạn cần sử dụng lệnh:

git diff <Branch name>..master -- Filename.extension   

Lệnh này sẽ hiển thị sự khác biệt giữa hai tệp trong chính bash.


0
2018-01-17 04:26