Đô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?
Đô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:
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 diff
và git diff --cached
.
git diff
trạ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?
git diff --cached HEAD^
:)
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 b6af6qc
là một ví dụ về một cam kết băm.
HEAD^
là cam kết trước cam kết mới nhất.
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 HEAD
sẽ so sánh trạng thái hiện tại của worktree với cam kết hiện tại.
đ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
Đ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:
git diff
so sánh worktree với chỉ mục, không phải HEAD.