Làm thế nào tôi có thể thấy những gì đã thay đổi trong một tập tin trước khi cam kết git?


351

Tôi đã nhận thấy rằng trong khi làm việc trên một hoặc hai vé, nếu tôi bước đi, tôi không chắc mình đã làm gì, thay đổi gì, vân vân.

Có cách nào để xem các thay đổi được thực hiện cho một tệp nhất định trước khi git add và sau đó git commit không?

Câu trả lời:


525

Bạn đang tìm kiếm git diff. Tùy thuộc vào tình huống chính xác của bạn, có ba cách hữu ích để sử dụng nó:

# show differences between index and working tree
# that is, changes you haven't staged to commit
git diff [filename]
# show differences between current commit and index
# that is, what you're about to commit
# --staged does exactly the same thing, use what you like
git diff --cached [filename]
# show differences between current commit and working tree
git diff HEAD [filename]

Nó sẽ hoạt động đệ quy trên các thư mục và nếu không có đường dẫn nào được đưa ra, nó sẽ hiển thị tất cả các thay đổi.


1
@ sveilleux2 Không, chỉ cần chạy git diff mà không có bất kỳ đối số nào - như câu cuối cùng của câu trả lời nói, nếu không có đường dẫn nào được đưa ra, nó sẽ hiển thị tất cả các thay đổi. (Dấu ngoặc trên [filename]biểu thị một đối số tùy chọn.) Với việc *bạn cho phép shell liệt kê tất cả các tệp, vì vậy nếu bạn ở trong thư mục con, bạn sẽ chỉ nhận được những thứ trong thư mục con đó (không phải toàn bộ repo) và bạn ' sẽ bỏ lỡ những thay đổi trong các tập tin ẩn.
Cascabel

# hiển thị sự khác biệt giữa cam kết hiện tại và chỉ mục # đó là, những gì bạn sắp thực hiện git diff --cached [tên tệp] Ý bạn là: # hiển thị sự khác biệt giữa cam kết hiện tại và chỉ mục # đó là những gì bạn đang nói về đến đẩy ? git diff --cached [tên tệp]
ofarooq

3
Để xem sự khác biệt được tạo sau khi thêm tệp (nghĩa là sau "git add"), hãy thực hiện "git diff --staged [tên tệp]"
Sidtharthan

Ồ, tại sao nó quá phức tạp?! Điều gì sẽ xảy ra nếu chúng ta có một vài tá tệp? .. Chỉ cần phàn nàn với giao diện git ... Vâng, dường như, git add -plà một cách thay thế để kiểm tra tất cả các tệp.
Kirby

@Jefromi - vui lòng xem xét thêm git diff --staged [filename]vào câu trả lời chính của bạn vì đó là tình huống thường xuyên hơn.
Lazarus Thurston



8

Đối với tôi git add -plà cách hữu ích nhất (và dự định mà tôi nghĩ bởi các nhà phát triển git?) Để xem xét tất cả các thay đổi chưa được thực hiện (nó hiển thị độ lệch cho mỗi tệp), chọn một tập hợp thay đổi tốt phải thực hiện theo cam kết, sau đó khi bạn có dàn dựng tất cả những thứ đó, sau đó sử dụng git commitvà lặp lại cho lần xác nhận tiếp theo. Sau đó, bạn có thể làm cho mỗi cam kết là một tập hợp thay đổi hữu ích hoặc có ý nghĩa ngay cả khi chúng diễn ra trong các tệp khác nhau. Tôi cũng đề nghị tạo một chi nhánh mới cho mỗi vé hoặc hoạt động tương tự và chuyển đổi giữa chúng bằng cách sử dụng checkout(có thể sử dụng git stashnếu bạn không muốn cam kết trước khi chuyển đổi), mặc dù nếu bạn đang thực hiện nhiều thay đổi nhanh thì điều này có thể gây khó khăn. Đừng quên hợp nhất thường xuyên.


Vì vậy, thay vì git add tên tập tin sử dụng git add -p?
Timothy T.

1
git add -p là sự kết hợp của dàn dựng, xem các thay đổi bạn có thể thực hiện và chọn từng bước một theo cách tương tác. Xem Cam kết chỉ là một phần của tệp trong Git để biết thêm về git add -p.
Angelos Ason viêm

5

git diff

Hiển thị các thay đổi giữa cây làm việc và chỉ mục hoặc cây, thay đổi giữa chỉ mục và cây, thay đổi giữa hai cây hoặc thay đổi giữa hai tệp trên đĩa.


Báo giá hơi quá nhiều - theo mặc định, nó thực hiện so sánh đầu tiên: giữa cây làm việc và chỉ mục.
Cascabel

4

Hãy nhớ rằng, bạn đang cam kết thay đổi , không phải tệp.

Vì lý do này, rất hiếm khi tôi không sử dụng git add -p(hoặc tương đương với pháp sư) để thêm các thay đổi của mình.


2
git KHÔNG đối phó với những thay đổi - cố gắng nghĩ về nó như thể nó là nguồn gốc của sự nhầm lẫn và sai lầm. giao dịch git với ảnh chụp nhanh.
Chris Dodd

3
git diff <path>/filename

đường dẫn của bạn có thể là đường dẫn hệ thống hoàn chỉnh cho đến tệp hoặc
nếu bạn đang ở trong dự án, bạn cũng dán đường dẫn tệp đã sửa đổi
cho các tệp đã sửa đổi với đường dẫn sử dụng:git status


2

Vâng, trường hợp của tôi khi bạn không muốn quan tâm đến danh sách tập tin. Chỉ cần hiển thị tất cả.

Khi bạn đã chạy git addvới danh sách tập tin của bạn:

$ git diff --cached $(git diff --cached --name-only)

Trong các phiên bản gần đây hơn git, bạn cũng có thể sử dụng --staged, đó là từ đồng nghĩa của --cached.

Điều tương tự có thể được sử dụng cho các tập tin chưa được thêm nhưng không có --cachedtùy chọn.

$ git diff $(git diff --name-only)

Bí danh lệnh Git cho tùy chọn "lưu trữ":

$ git config --global alias.diff-cached '!git diff --cached $(git diff --cached --name-only)'

3
Cảm ơn các chi tiết git diff --cached --name-only là lệnh tôi đang tìm ....
Doogle

1

Chuyển đến repo git tương ứng của bạn, sau đó chạy lệnh dưới đây:

tên tập tin git diff

Nó sẽ mở tệp với các thay đổi được đánh dấu, nhấn phím return / enter để cuộn xuống tệp.

Tên tệp PS phải bao gồm đường dẫn đầy đủ của tệp hoặc nếu không bạn có thể chạy mà không có đường dẫn tệp đầy đủ bằng cách vào thư mục / thư mục tương ứng của tệp


0

Bạn cũng có thể sử dụng trình soạn thảo văn bản thân thiện với git. Chúng hiển thị màu trên các dòng đã được sửa đổi, một màu khác cho các dòng được thêm vào, một màu khác cho các dòng bị xóa, v.v.

Một trình soạn thảo văn bản tốt thực hiện điều này là GitHub's Atom 1.0 .

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.