Làm thế nào để xem những thay đổi trong một cam kết Git?


1549

Khi tôi làm, git diff COMMITtôi thấy những thay đổi giữa cam kết đó và CHÍNH (theo như tôi biết), nhưng tôi muốn thấy những thay đổi được thực hiện bởi cam kết duy nhất đó.

Tôi đã không tìm thấy bất kỳ tùy chọn rõ ràng trên diff/ logsẽ cung cấp cho tôi đầu ra đó.


Câu trả lời:


1975

Để xem khác biệt cho một COMMIThàm băm cụ thể :

git diff COMMIT~ COMMITsẽ cho bạn thấy sự khác biệt giữa COMMITtổ tiên của nó và COMMIT. Xem các trang hướng dẫn cho git diff để biết chi tiết về lệnh và các thông báo về ~ký hiệu và bạn bè của nó.

Ngoài ra, git show COMMITsẽ làm một cái gì đó rất giống nhau. (Dữ liệu của cam kết, bao gồm cả khác biệt - nhưng không phải cho các cam kết hợp nhất.) Xem trang chủ git show .


17
Lưu ý rằng các ^nhu cầu được trích dẫn trong các vỏ Thomson và Bourne (đồng nghĩa với |đó) rcvà các dẫn xuất của nó (toán tử caret) và zshvới tính năng mở rộng ( nottoán tử toàn cầu)
Stephane Chazelas

3
Lưu ý rằng HEAD^ngụ ý cha mẹ đầu tiên trong trường hợp một cam kết có nhiều cha mẹ (nghĩa là cam kết hợp nhất).
Mansour

23
git diff COMMIT~ COMMITlàm việc cho tôi, chú ý dấu ngã thay vì dấu mũ. Tôi đang chạy phiên bản git 2.6.1.windows.1 trên Windows 10.
Juuso Ohtonen

14
@tradetree: từ CAM KẾT được cho là được thay thế bằng tên của một số cam kết, ví dụ: tổng SHA.
Nick Matteo

91
Tôi cảm thấy như git show phù hợp hơn cho câu hỏi này và nên là gợi ý được đề cập đầu tiên.
pypmannetjies

497

Như đã đề cập trong " Shorthand for diff of git commit with cha mẹ của nó? ", Bạn cũng có thể sử dụng git diffvới:

git diff COMMIT^!

hoặc là

git diff-tree -p COMMIT

Với git show, bạn sẽ cần (để tập trung vào diff một mình) để làm:

git show --color --pretty=format:%b $COMMIT

Các COMMITtham số là một ish cam- :

Một đối tượng cam kết hoặc một đối tượng có thể được đệ quy đệ quy cho một đối tượng cam kết. Sau đây là tất cả các cam kết: một đối tượng cam kết, một đối tượng thẻ trỏ đến một đối tượng cam kết, một đối tượng thẻ trỏ đến một đối tượng thẻ trỏ đến một đối tượng cam kết, v.v.

Xem gitrevision "ĐẶC BIỆT CÁCH MẠNG" để tham khảo một cam kết.
Xem thêm " Cây-ish có nghĩa là gì trong Git? ".


371

Bạn cũng có thể thử cách dễ dàng này:

git show <COMMIT>

2
Có vẻ như điều này làm một cái gì đó khá khác biệt
Biến đổi khổ sở

3
Nó chỉ hiển thị thông điệp cam kết. Không phải là khác biệt của các thay đổi mã được áp dụng cho cam kết này.
k0pernikus

1
Có nó không? Cuối cùng trong các phiên bản git gần đây ...
Davy

2
Đây phải là câu trả lời đúng được cập nhật
Scott Skiles

1
Đây nên là câu trả lời.
Roel

77

git show cho thấy những thay đổi được thực hiện trong cam kết gần đây nhất.

Tương đương với git show HEAD.

git show HEAD~1 đưa bạn trở lại 1 cam kết.


45

Tôi thường làm:

git diff HEAD~1

Để hiển thị những thay đổi liên quan đến cam kết cuối cùng. Nếu bạn có nhiều cam kết hơn, chỉ cần tăng số 1 lên số lượng cam kết bạn muốn xem.


34

Trước tiên hãy lấy ID cam kết bằng cách sử dụng,

git log #to list all

Hoặc là

git log -p -1 #last one commit id

Sao chép id cam kết.

Bây giờ chúng tôi sử dụng hai phương pháp để liệt kê các thay đổi từ một cam kết cụ thể,

Cách 1:

git diff commit_id^! #commit id something like this 1c6a6000asad012

Cách 2:

git show commit_id
For example: git show 1c6a600a

2
^!nghĩa là gì ??
Martín Coll

2
^! là cách viết tắt của cam kết ^ .. cam kết có nghĩa là sẽ loại trừ tất cả các bậc cha mẹ và kiểm tra khác biệt trong cam kết đó
Mohideen bin Mohammed

Tôi không phải là chuyên gia nhưng tôi có một trường hợp (có nhiều chi nhánh được tham gia) trong đó git log c ^! không hoàn toàn giống với nhật ký git c ^ .. c. Trong thực tế, nó tốt hơn nhiều: git log c ^ .. c liệt kê quá nhiều mục trong khi git log c ^! đã làm điều đúng đắn, vì vậy đây là điều tôi đã tìm kiếm trong một thời gian dài
user829755

32
git show <commit_sha>

Điều này sẽ chỉ cho bạn những gì trong cam kết đó. Tôi nghĩ rằng bạn có thể thực hiện một phạm vi nó chỉ bằng cách đặt một khoảng trống giữa hai shas cam kết.

git show <beginning_sha> <ending_sha>

Điều này khá hữu ích nếu bạn thường xuyên khởi động lại vì nhật ký tính năng của bạn sẽ liên tiếp.


25

Từ trang man cho git-diff (1) :

git diff [options] [<commit>] [--] [<path>…]
git diff [options] --cached [<commit>] [--] [<path>…]
git diff [options] <commit> <commit> [--] [<path>…]
git diff [options] <blob> <blob>
git diff [options] [--no-index] [--] <path> <path>

Sử dụng cái thứ 3 ở giữa:

git diff [options] <parent-commit> <commit>

Cũng từ cùng một trang người đàn ông, ở dưới cùng, trong phần Ví dụ :

$ git diff HEAD^ HEAD      <3>

So sánh phiên bản trước lần xác nhận cuối cùng và lần xác nhận cuối cùng.

Phải thừa nhận rằng nó có một chút khó hiểu, nó sẽ ít gây nhầm lẫn như

So sánh các cam kết gần đây nhất với các cam kết trước đó.


3
Viết lại của bạn sẽ áp dụng cho git diff HEAD HEAD^.
Richard

git diff HEAD ^ HEAD không hiển thị bất kỳ thay đổi nào.
dùng3690202

@ user3690202 do đó ngụ ý rằng không có bất kỳ thay đổi nào để hiển thị. Đó thực sự là trường hợp?

Làm thế nào có thể không có bất kỳ thay đổi để hiển thị? Nếu bạn muốn xem cam kết cuối cùng, chắc chắn trừ khi đó là một kho lưu trữ hoàn toàn mới, sẽ có một số thay đổi để hiển thị?
dùng3690202

@ user3690202 có thể thực hiện "cam kết trống" với Git mà thực tế không chứa bất kỳ thay đổi nào từ cha mẹ, mặc dù có một biện pháp bảo vệ tích hợp để kiểm tra và ngăn chặn điều này, mặc dù nó có thể được ghi đè bằng tùy chọn dòng lệnh. Tôi nghi ngờ rằng bạn sẽ cố tình tạo một cam kết trống, vì vậy một khả năng khác là bạn bằng cách nào đó có chuyển đổi kết thúc dòng trước cam kết (hoặc các công cụ khoảng trắng hài hước khác) đang lừa Git nghĩ rằng không có thay đổi nào thực sự được thực hiện. Bạn đang chạy Git trên nền tảng nào?

22

Sau đây dường như để thực hiện công việc; Tôi sử dụng nó để hiển thị những gì đã được đưa vào bởi một sự hợp nhất.

git whatchanged -m -n 1 -p <SHA-1 hash of merge commit>

Điều đó sẽ làm việc quá với git log? (vì stackoverflow.com/a/18585297/6309 )
VonC

16

Khả năng khác:

git log -p COMMIT -1

1
@GrantMcLean Có, và nó đã có trong câu trả lời nâng cao nhất, vì vậy tôi không đề cập đến nó.
John_West

11

Bạn đã có thể sử dụng git diff HEAD HEAD^1 để xem khác biệt với cam kết cha mẹ.

Nếu bạn chỉ muốn xem danh sách các tập tin, hãy thêm --stattùy chọn.


Đây là những gì bạn muốn nói, git diff Head ^ 1 Head
Shibir Basak

Lưu ý rằng điều này sẽ hiển thị những gì bạn đã thêm khi xóa, vì nó sẽ làm một so sánh ngược lại. Cách bạn nên đọc difflệnh là: tôi cần thay đổi gì trong tệp để nhận được từ cam kết HEADthành cam kết HEAD^1?
brainplot

9
git difftool COMMIT^ <commit hash>

cũng có thể nếu bạn đã cấu hình Difftool của bạn.

Xem ở đây cách cấu hình Difftool Hoặc trang hướng dẫn ở đây

Ngoài ra, bạn có thể sử dụng git diff-tree --no-commit-id --name-only -r <commit hash>để xem tập tin nào đã được thay đổi / cam kết trong hàm băm xác nhận


9

Tôi thích lệnh dưới đây để so sánh một cam kết cụ thể và cam kết cuối cùng của nó:

git diff <commit-hash>^-

Thí dụ:

git diff cd1b3f485^-

6

Để xem tác giả và thời gian bằng cách sử dụng cam kết git show COMMIT. Điều này sẽ dẫn đến một cái gì đó như thế này:

commit 13414df70354678b1b9304ebe4b6d204810f867e
Merge: a2a2894 3a1ba8f
Author: You <you@you.com>
Date:   Fri Jul 24 17:46:42 2015 -0700

     Merge remote-tracking branch 'origin/your-feature'

Nếu bạn muốn xem tập tin nào đã được thay đổi, hãy chạy phần sau với các giá trị từ dòng Hợp nhất ở trên git diff --stat a2a2894 3a1ba8f.

Nếu bạn muốn xem khác biệt thực tế, hãy chạy git --stat a2a2894 3a1ba8f


"Nếu bạn muốn xem khác biệt thực tế, hãy chạy git --stat a2a2894 3a1ba8f". Tôi nghĩ bạn có ý nghĩa git diff a2a2894 3a1ba8fkhác unknown option: --stat.
Trái cây

5

Để kiểm tra thay đổi hoàn toàn:

  git diff <commit_Id_1> <commit_Id_2>

Để chỉ kiểm tra các tệp đã thay đổi / thêm / xóa:

  git diff <commit_Id_1> <commit_Id_2> --name-only

LƯU Ý : Để kiểm tra khác biệt mà không có cam kết ở giữa, bạn không cần đặt id cam kết.


4

Tôi đang chạy phiên bản Git 2.6.1.windows.1 trên Windows 10, vì vậy tôi cần một sửa đổi nhỏ cho câu trả lời của Nevik (dấu ngã thay vì dấu mũ):

git diff COMMIT~ COMMIT

Một lựa chọn khác là trích dẫn dấu mũ:

git diff "COMMIT^" COMMIT

3

Lệnh này sẽ giúp bạn nhận được xác nhận cha mẹ Git:

git log -n 2 <commit-hash>

Sau đó git diff-tool <commit-hash> <parent-commit-hash>

Thí dụ:

bonnie@bonnie ~/ $ git log -n 2 7f65b9a9d3820525766fcba285b3c678e889fe3

commit 7f65b9a9d3820525766fcba285b3c678e889fe3b
Author: souparno <souparno.majumder@gmail.com>
Date:   Mon Jul 25 13:17:07 2016 +0530

CSS changed to maintain the aspect ratio of the channel logos and to fit them properly.

commit c3a61f17e14e2b80cf64b172a45f1b4826ee291f
Author: souparno <souparno.majumder@gmail.com>
Date:   Mon Jul 25 11:28:09 2016 +0530

The ratio of the height to width of the channel images are maintained.

Sau đây

git difftool 7f65b9a9d3820525766fcba285b3c678e889fe3b c3a61f17e14e2b80cf64b172a45f1b4826ee291f

2

Nếu bạn chỉ muốn xem những thay đổi trong cam kết mới nhất, đơn giản git showsẽ cung cấp cho bạn điều đó.


1

Trong trường hợp kiểm tra thay đổi nguồn trong chế độ xem đồ họa,

$gitk (Mention your commit id here)

ví dụ:

$gitk HEAD~1 

Tôi không hiểu tại sao câu trả lời này bị hạ thấp. Tôi đồng ý rằng dòng lệnh và công cụ dựa trên văn bản là cách để đi nhưng gitk cung cấp rất nhiều thông tin hữu ích.
ShellFish
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.