Xem sự khác biệt giữa trạng thái hiện tại và cam kết cuối cùng


92

Đôi khi khi tôi chuẩn bị thực hiện một cam kết, tôi không thể nhớ chính xác những gì đã thay đổi kể từ lần cam kết cuối cùng. Làm cách nào tôi có thể thấy sự khác biệt giữa trạng thái hiện tại của mã và lần cam kết cuối cùng?

Câu trả lời:


113

Nếu bạn chưa thêm bất kỳ tệp nào vào chỉ mục (với git add), chỉ cần thực hiện

git diff

Điều này sẽ hiển thị sự khác biệt giữa cây làm việc và chỉ mục của bạn.

Nếu bạn đã thêm tệp vào chỉ mục, bạn cần làm điều này để hiển thị sự khác biệt giữa chỉ mục và cam kết cuối cùng (HEAD).

git diff --cached

Cuối cùng, nếu bạn muốn xem những thay đổi được thực hiện trong cây làm việc so với bản cam kết mới nhất ( HEAD), bạn có thể (như Carlos đã chỉ ra)

git diff HEAD

Những thay đổi đó là sự kết hợp của git diffgit diff --cached.


2
git diffso sánh worktree với chỉ mục, không phải HEAD.
Carlos Martín Nieto

@ CarlosMartínNieto Bạn nói đúng, thưa ông. Tôi đã cải thiện bài viết của mình để phản ánh điều này.
Klas Mellbourn

Tôi chạy nó, nhưng thiết bị đầu cuối, không kết thúc, làm thế nào tôi có thể thoát.? không có gì hoạt động.
Francisco Corrales Morales

@KlasMellbourn, Có thể xảy ra git difftrạng thái của chỉ mục và cam kết trước đó trong một thông báo khác nhau không?
alpha_989

2
Đã tìm ra nó git diff --cached HEAD^:)
alpha_989

33

Nếu bạn vừa thực hiện một cam kết hoặc muốn xem những gì đã thay đổi trong cam kết cuối cùng so với trạng thái hiện tại (giả sử bạn có một cây làm việc sạch), bạn có thể sử dụng:

git diff HEAD^

Điều này sẽ so sánh HEAD với cam kết ngay trước đó. Một người cũng có thể làm

git diff HEAD^^

để so sánh với trạng thái chơi 2 lần cam kết trước. Để xem sự khác biệt giữa trạng thái hiện tại và một cam kết nhất định, chỉ cần thực hiện:

git diff b6af6qc

Trong trường hợp b6af6qclà một ví dụ về một cam kết băm.


3
Lưu ý cho phiên bản cmd Windows của git - bạn phải thoát ký tự dấu mũ (^) bằng chính dấu mũ. Do đó, "git diff HEAD ^" sẽ là "git diff HEAD ^^". Theo cách tương tự, "HEAD ^^" sẽ được nhập là "HEAD ^^^^".
Eellor

1
Trong câu trả lời này, tôi nghĩ rằng có một chút không rõ ràng "cam kết cuối cùng" đề cập đến những gì. HEAD^là cam kết trước cam kết mới nhất.
Klas Mellbourn

3

Bạn yêu cầu git thay đổi cam kết hiện tại / cuối cùng, có nghĩa là viết tắt của HEAD.

Vì vậy, git diff HEADsẽ so sánh trạng thái hiện tại của worktree với cam kết hiện tại.


3

điều này cũng cho thấy sự khác biệt và những tệp đã được thay đổi / sửa đổi.

$ git status 

Hiển thị các đường dẫn có sự khác biệt giữa tệp chỉ mục và cam kết HEAD hiện tại, các đường dẫn có sự khác biệt giữa cây làm việc và tệp chỉ mục và các đường dẫn trong cây làm việc không được git theo dõi (và không bị gitignore bỏ qua (5) ). Đầu tiên là những gì bạn sẽ cam kết bằng cách chạy git commit; thứ hai và thứ ba là những gì bạn có thể cam kết bằng cách chạy git add trước khi chạy git commit.

https://www.kernel.org/pub/software/scm/git/docs/git-status.html


2

Điều này cũng làm việc cho tôi:

# The last one
git diff HEAD~1 HEAD

# The last but one, etc...
git diff HEAD~2 HEAD~1

Điều này thường hoạt động đối với lịch sử tuyến tính. Điều này có thể trở nên phức tạp hơn nếu cũng có các cam kết hợp nhất. Tôi khuyên bạn nên xem tài liệu này để có lời giải thích hay và đầy đủ, đặc biệt là ví dụ minh họa cây cam kết:

https://git-scm.com/docs/gitrevisions

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.