Làm thế nào để xem tập tin diff trong git trước khi cam kết


443

Điều này thường xảy ra với tôi:

Tôi đang thực hiện một vài thay đổi liên quan cùng một lúc trong một hoặc hai ngày và khi đến lúc phải cam kết, cuối cùng tôi quên mất những gì đã thay đổi trong một tệp cụ thể. (Đây chỉ là một repo git cá nhân, vì vậy tôi ổn với việc có nhiều hơn một bản cập nhật trong một cam kết.)

Có cách nào để xem trước các thay đổi giữa tệp cục bộ của tôi sắp được kiểm tra và cam kết cuối cùng cho tệp đó không?

Cái gì đó như:

git diff --changed /myfile.txt

Và nó sẽ in ra một cái gì đó như:

line 23
  (last commit): var = 2+2
  (current):     var = myfunction() + 2

line 149
  (last commit): return var
  (current):     return var / 7

Bằng cách này, tôi có thể nhanh chóng thấy những gì tôi đã làm trong tệp đó kể từ lần kiểm tra cuối cùng.

Câu trả lời:


732

Nếu bạn muốn xem những gì bạn chưa git added:

git diff myfile.txt

hoặc nếu bạn muốn xem các thay đổi đã được thêm

git diff --cached myfile.txt

20
kiểm tra git add -p. Xem xét mọi thay đổi, phê duyệt có chọn lọc các thay đổi cho giai đoạn, hủy bỏ bất cứ lúc nào nếu bạn thay đổi quyết định và thậm chí chỉnh sửa nội tuyến một đoạn. Tôi không bao giờ git addkhông có nó.
Kyle Baker

2
Làm thế nào bạn có thể thoát tập tin?
Kick Buttowski

3
@Kick Hãy thử nhấnq
wjandrea

ngoài ra, nếu bạn muốn loại bỏ các tiền tố 'a /' và 'b /' ngớ ngẩn trong kết quả khác, bạn có thể đặt git config --global diff.noprefix true.
Liang

64
git diff HEAD file

sẽ cho bạn thấy những thay đổi bạn đã thêm vào worktree của mình từ lần xác nhận cuối cùng. Tất cả các thay đổi (dàn dựng hoặc không dàn dựng) sẽ được hiển thị.


1
Giải pháp của bạn hoạt động. Nhưng tôi hơi bối rối. ĐẦU chỉ vào số cam kết mới nhất. Vì vậy, khi chúng tôi git add, chỉ mục của thư mục làm việc được cập nhật và không phải là CHÍNH. Vậy làm thế nào để nó cho thấy sự khác biệt.
Mav55

17

Để kiểm tra sự khác biệt địa phương:

git diff myfile.txt

hoặc bạn có thể sử dụng một công cụ tìm khác biệt (trong trường hợp bạn muốn hoàn nguyên một số thay đổi):

git difftool myfile.txt

Để sử dụng git difftoolhiệu quả hơn, hãy cài đặt và sử dụng công cụ GUI yêu thích của bạn như Meld, DiffMerge hoặc OpenDiff.

Lưu ý: Bạn cũng có thể sử dụng .(thay vì tên tệp) để xem các thay đổi thư mục hiện tại.

Để kiểm tra các thay đổi trên mỗi dòng, hãy sử dụng: git blamesẽ hiển thị dòng nào được cam kết trong đó cam kết.


Để xem tệp thực tế trước khi xác nhận ( masterchi nhánh của bạn ở đâu ), hãy chạy:

git show master:path/my_file

15

Bạn đã thử -v(hoặc --verbose) tùy chọn cho git commit? Nó thêm khác biệt của cam kết trong trình soạn thảo tin nhắn.


Câu trả lời tốt. Điều này có thể cung cấp thông tin trong trình soạn thảo cam kết, làm cho tôi cam kết dễ dàng hơn. Có cách nào để đóng vùng thông tin Changes not staged for commit:có thể làm cho trình soạn thảo cam kết sạch hơn không.
Radian Jheng

15

Một kỹ thuật khác để xem xét nếu bạn muốn so sánh một tệp với cam kết cuối cùng mang tính mô phạm hơn:

git diff master myfile.txt

Ưu điểm của kỹ thuật này là bạn cũng có thể so sánh với cam kết áp chót với:

git diff master^ myfile.txt

và cái trước đó:

git diff master^^ myfile.txt

Ngoài ra, bạn có thể thay thế '~' cho ký tự dấu '^' và 'tên chi nhánh' cho 'chủ' nếu bạn không ở trong nhánh chính.


14

Tôi nghĩ rằng đây là trường hợp sử dụng hoàn hảo để đảm bảo GUI. - Mặc dù tôi hoàn toàn hiểu rằng nó cũng có thể đạt được đủ tốt trong dòng lệnh.

Cá nhân, mỗi cam kết của tôi, tôi làm từ git-gui. Trong đó tôi có thể thực hiện nhiều cam kết nguyên tử với các khối / dòng riêng biệt nếu nó có ý nghĩa để làm như vậy.

Gut Gui cho phép xem các khác biệt trong một giao diện được định dạng tốt, khá nhẹ. Có vẻ như đây là một cái gì đó bạn cũng nên kiểm tra.


Tôi đồng ý - nó cũng cho phép bạn chỉnh sửa thông điệp cam kết trong khi nhìn vào diff.
François

Rất tốt để biết, nhưng tôi muốn gắn bó với CLI. Tôi đã sử dụng một vài gói có nó, nhưng tôi đã chuyển sang thiết bị đầu cuối / vim cho quy trình làm việc của mình. Cảm ơn mặc dù.
Sốt McBoss

Vâng, nếu bạn dính vào GUI, có rất nhiều tính năng thú vị như thế git bisectkhông thực sự có thể truy cập được.
NoBugs

2
Tôi đồng ý - Có nhiều tùy chọn trong đó nhanh hơn nhiều và có ý nghĩa hơn khi sử dụng dòng lệnh. Tuy nhiên, xem trước các thay đổi không phải là một trong số đó.
VitalyB

Ngoài ra còn có giao diện người dùng văn bản, chạy trong thiết bị đầu cuối. Một giá trị kiểm tra là tig"giao diện chế độ văn bản cho Git".
smido

10

Trên macOS, hãy vào thư mục gốc git và nhập git diff *


Có nó, tôi chỉ thử nghiệm nó. Bạn đã cài đặt git? Bất kỳ thông báo lỗi? Có lẽ một câu hỏi mới có thể được hỏi về điều này.
catanore

4

Cách tốt nhất mà tôi tìm thấy, ngoài việc sử dụng GUI cam kết chuyên dụng, là sử dụng git difftool -d- Điều này mở công cụ tìm khác biệt của bạn trong chế độ so sánh thư mục, so sánh HEAD với thư mục bẩn hiện tại.


chính xác những gì tôi cần Cảm ơn
Biệt thự Ivan Ferrer

3
git difftool -d HEAD filename.txt

Điều này cho thấy một so sánh bằng cách sử dụng cửa sổ khe VI trong thiết bị đầu cuối.

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.