Làm cách nào để khác một tệp thành phiên bản tùy ý trong Git?


324

Làm thế nào tôi có thể khác một tập tin, pom.xmltừ nhánh chính sang phiên bản cũ hơn tùy ý trong Git?

Câu trả lời:


347

Bạn có thể làm:

git diff master~20:pom.xml pom.xml

... để so sánh hiện tại của bạn pom.xmlvới một trong master20 bản sửa đổi trước đây thông qua phụ huynh đầu tiên. master~20Tất nhiên, bạn có thể thay thế bằng tên đối tượng (SHA1sum) của một cam kết hoặc bất kỳ cách nào khác để chỉ định sửa đổi .

Lưu ý rằng đây thực sự là so sánh pom.xmlphiên bản cũ với phiên bản trong cây làm việc của bạn, chứ không phải phiên bản đã cam kết master. Nếu bạn muốn điều đó, thì bạn có thể làm như sau:

git diff master~20:pom.xml master:pom.xml

12
Lưu ý rằng điều này không chỉ hoạt động cho các tệp, nó cũng hoạt động cho các thư mục (phụ) git diff <revision>:foo/ HEAD:foo/.

2
Cũng lưu ý rằng trên windows bạn cần sử dụng dấu gạch chéo chuyển tiếp cho các thư mục nếu bạn đang sử dụng một công cụ xác định sửa đổi hoặc git sẽ cung cấp cho bạn một lỗi về tệp / thư mục không tồn tại trong phiên bản đó.
Dylan Nissley

1
@DylanNissley hoặc nó sẽ cung cấp cho bạn không có lỗi và không có khác biệt. Đó là những gì tôi thấy. Trong mọi trường hợp, cảm ơn bạn đã gợi ý về việc sử dụng dấu gạch chéo về phía trước thay vì dấu gạch chéo ngược.
Gary S.

Với các tệp windows tôi thấy việc thay đổi thư mục trở nên dễ dàng hơn và sau đó gọi git diff master ~ 20: ./ pom.xml ./pom.xml
lloyd

Một số phiên bản của git yêu cầu "-" giữa <sửa đổi> & <đường dẫn>
Josh

140
git diff <revision> <path>

Ví dụ:

git diff b0d14a4 foobar.txt

không hoạt động cho phiên bản 1.7.11 nếu tệp không có trong thư mục hiện tại. Ví dụ: 'git diff f76d078 thử nghiệm / Config' sản lượng "lỗi: Không thể truy cập 'test / f76d078'"
simpleuser

1
@ user1663987 chỉ cần vượt qua một đường dẫn đầy đủ liên quan đến root dự án : git diff <revision> root/path/file.

1
test / Config liên quan đến root (như trong test là thư mục con của root). nhưng sau đó, ví dụ root / path / file của bạn dường như BAO GỒM root?
đơn giản

41

Nếu bạn muốn thấy sự khác biệt giữa lần xác nhận cuối cùng của một tệp, bạn có thể thực hiện:

git log -p -1 filename

Điều này sẽ cung cấp cho bạn sự khác biệt của tệp trong git, không so sánh tệp cục bộ của bạn.


2
điều này sẽ không trả lại bất cứ điều gì
Andrei Cristian Prodan

@AndreiCristianProdan Sau đó, bạn không có thay đổi ở đó. Bạn có thể tăng -1từng bước cho đến khi bạn nhận được các thay đổi.
kaiser

Điều này là rất tốt đẹp. Tôi đã tạo một hàm bash có thể hữu ích: gitlog () { git log -${3:-p} -${2:-1} $1; } Được sử dụng như: gitlog Rakefilehoặc gitlog Rakefile 5gitlog Rakefile 10 s. Cái đầu tiên cho thấy một khác biệt; thứ hai cho thấy năm khác biệt; thứ ba cho thấy mười --no-patch.
auxbuss

18

Để xem những gì đã được thay đổi trong một tệp trong lần xác nhận cuối cùng:

git diff HEAD~1 path/to/file.

Bạn có thể thay đổi số (~ 1) thành cam kết thứ n mà bạn muốn tìm khác biệt.


Câu trả lời này thực sự chỉ là một trường hợp cụ thể của câu trả lời tổng quát hơn này , nơi HEAD~1được thay thế <revision>, điều này làm cho câu trả lời này bị trùng lặp.

1
cái này không hiệu quả gây tử vong: đối số mơ hồ 'ĐẦU ~ 1': không biết sửa đổi hoặc đường dẫn không có trong cây làm việc. Sử dụng '-' để tách các đường dẫn khỏi các phiên bản
Andrei Cristian Prodan

Câu trả lời này là đơn giản và chức năng cho tôi.
Douglas Frari

6

Cú pháp chung:

$git diff oldCommit..newCommit -- **FileName.xml > ~/diff.txt

cho tất cả các tệp có tên "FileName.xml" ở bất kỳ đâu trong repo của bạn.

Lưu ý khoảng trắng giữa "-" và "**"

Trả lời cho câu hỏi của bạn:

$git checkout master
$git diff oldCommit..HEAD -- **pom.xml 
or
$git diff oldCommit..HEAD -- relative/path/to/pom.xml 

như mọi khi với git, bạn có thể sử dụng thẻ / sha1 / "HEAD ^" để xác nhận cam kết.

Đã thử nghiệm với git 1.9.1 trên Ubuntu.


6

Nếu không cam kết nào là ĐẦU của bạn thì việc mở rộng cú đúp của bash chứng tỏ thực sự hữu ích, đặc biệt nếu tên tệp của bạn dài, ví dụ trên:

git diff master~20:pom.xml master:pom.xml

Sẽ trở thành

git diff {master~20,master}:pom.xml

Thêm về mở rộng Brace với bash.


6

Để so sánh với 5 cam kết với hiện tại, cả hai master, chỉ cần làm:

git diff master~5:pom.xml master:pom.xml

Ngoài ra, bạn có thể tham khảo cam kết số băm, ví dụ nếu số băm là x110bd64, bạn có thể làm một cái gì đó như thế này để thấy sự khác biệt:

git diff x110bd64 pom.xml


2
git diff master~20 -- pom.xml

Hoạt động nếu bạn không ở trong nhánh chủ quá.


2

Nếu bạn ổn bằng cách sử dụng một công cụ đồ họa (hoặc thậm chí thích nó), bạn có thể:

gitk pom.xml

Trong gitk, sau đó bạn có thể nhấp vào bất kỳ cam kết nào (để "chọn" nó) và nhấp chuột phải vào bất kỳ cam kết nào khác để chọn "Diff this -> select" hoặc "Diff select -> this" trong menu bật lên, tùy theo thứ tự bạn thích.



0

Nếu bạn cần tìm khác biệt trên một tệp trong một ngăn, ví dụ bạn có thể làm

git diff stash@{0} -- path/to/file

-1

Nếu bạn đang tìm kiếm khác biệt trên một cam kết cụ thể và bạn muốn sử dụng giao diện người dùng github thay vì dòng lệnh (giả sử bạn muốn liên kết nó với những người khác), bạn có thể làm:

https://github.com/<org>/<repo>/commit/<commit-sha>/<path-to-file>

Ví dụ:

https://github.com/grails/grails-core/commit/02942c5b4d832b856fbc04c186f1d02416895a7e/grails-test-suite-uber/build.gradle

Lưu ý các liên kết Trước và Tiếp theo ở trên cùng bên phải cho phép bạn điều hướng qua tất cả các tệp trong cam kết.

Điều này chỉ hoạt động cho một cam kết cụ thể, không phải để so sánh giữa bất kỳ hai phiên bản tùy ý.

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.