Xem các thay đổi đối với một tệp cụ thể bằng git


472

Tôi biết rằng tôi có thể sử dụng git difflệnh để kiểm tra các thay đổi, nhưng, theo như tôi hiểu, đó là thư mục dựa trên. Điều này có nghĩa là nó cung cấp cho tất cả các thay đổi của tất cả các tệp trên thư mục hiện tại.

Làm cách nào tôi chỉ có thể kiểm tra các thay đổi trong một tệp cụ thể? Nói rằng, tôi đã thay đổi tệp file_1.rb, file_2.rb... file_N.rb, nhưng tôi chỉ quan tâm đến những thay đổi trong tệp file_2.rb. Làm cách nào để kiểm tra những thay đổi này sau đó (trước khi tôi cam kết)?



4
Câu hỏi chính của tôi là làm thế nào để kiểm tra sự khác biệt cho một tệp cụ thể trước khi tôi cam kết tất cả các thay đổi. Tôi đoán nhật ký Git cho những thay đổi đã cam kết.
Mellon

Câu trả lời:


642

Sử dụng một lệnh như:

git diff file_2.rb

Xem git difftài liệu để biết thông tin đầy đủ về các loại điều bạn có thể nhận được sự khác biệt.

Thông thường, git diffbản thân nó hiển thị tất cả các thay đổi trong toàn bộ kho lưu trữ (không chỉ thư mục hiện tại).


100
Nếu bạn muốn xem các thay đổi của tệp mà bạn đã "git add" 'ed, thì đó là "git diff --cached"
Ana Betts

8
Nếu bạn muốn kiểm tra một tệp dựa trên một cam kết cũ hơn: $ git diff [commit hash] file_2.rb
Alex Angelico

2
Làm thế nào để thoát khỏi chế độ xem khác?
Garry

1
Hoặc sử dụng SourceTree.
GeneCode

4
@GurpreetsinghDhanju Hãy thử nhấn Q

110

Một phương pháp khác (được đề cập trong câu trả lời SO này ) sẽ giữ lịch sử trong thiết bị đầu cuối và cung cấp cho bạn một bản ghi theo dõi rất sâu sắc của chính tệp:

git log --follow -p -- file

Điều này sẽ hiển thị toàn bộ lịch sử của tệp (bao gồm cả lịch sử ngoài tên và với các khác biệt cho mỗi thay đổi).

Nói cách khác, nếu thanh tên tệp đã từng được đặt tên là foo, thì thanh git log -p (không có tùy chọn --follow) sẽ chỉ hiển thị lịch sử của tệp cho đến khi được đổi tên - nó sẽ không hiển thị lịch sử của tập tin khi nó được gọi là foo. Sử dụng thanh git log --follow -p sẽ hiển thị toàn bộ lịch sử của tệp, bao gồm mọi thay đổi đối với tệp khi được gọi là foo.


3
Hoạt động độc đáo với --stat để có cái nhìn tổng quan về các dòng được thêm / xóa.
Tom Hale

2
Có, câu trả lời này phải xếp hạng ít nhất là cao hơn, theo dõi lịch sử, không chỉ là khác biệt hiện tại, mà bạn cũng không phải theo dõi tất cả các băm cam kết. Cách sử dụng khá đơn giản nhưng rất mạnh mẽ trong các thay đổi
Ilhicas

87

Bạn có thể sử dụng gitk [filename]để xem nhật ký thay đổi


2
Điều này sẽ hiển thị lịch sử của các cam kết trên tệp, đôi khi có thể là những gì bạn cần.
r1k0

26

Bạn có thể sử dụng lệnh dưới đây để xem ai đã thay đổi những gì trong một tệp.

git blame <filename>


4
Đây là câu trả lời tốt nhất vì nó cho bạn biết ai đã thực hiện thay đổi và khi nào cũng như cam kết thay đổi là một phần của. Để lọc một thay đổi cụ thể, chỉ cần thực hiện git blame <filename> | grep <searchfor>ở đâu <searchfor>là một giá trị ngắn. Ví dụ, để tìm ra người thay đổi foođể bardist/index.php, bạn sẽ sử dụnggit blame dist/index.php | grep bar
Kraang Thủ

15

Bạn có thể thực thi

git status -s

Điều này sẽ hiển thị tên tệp đã sửa đổi và sau đó bằng cách sao chép đường dẫn tệp quan tâm, bạn có thể thấy các thay đổi bằng cách sử dụng git diff

git diff <filepath + filename>

8

để liệt kê chỉ cam kết chi tiết cho các thay đổi tệp cụ thể,

git log --follow file_1.rb

để liệt kê sự khác biệt giữa các cam kết khác nhau cho cùng một tệp,

git log -p file_1.rb

chỉ liệt kê cam kết và thông điệp của nó,

git log --follow --oneline file_1.rb

5

bạn cũng có thể thử

git show <filename>

Đối với các xác nhận, git show sẽ hiển thị thông điệp tường trình và khác biệt văn bản (giữa tệp của bạn và phiên bản được cam kết của tệp).

Bạn có thể kiểm tra git show Documentation để biết thêm.



0

Hoàn toàn đồng ý với @Greg Hewgill

Và nếu đường dẫn của bạn bao gồm các khoảng trắng, bạn có thể sử dụng, hãy thử thêm bằng dấu nháy đơn 'hoặc `

git diff 'MyProject / Thư mục của tôi / Thư mục con của tôi / file_2.rb'

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.