Tìm khác biệt giữa phiên bản hiện tại và phiên bản cuối cùng


670

Sử dụng Git, làm thế nào bạn có thể tìm thấy sự khác biệt giữa phiên bản hiện tại và phiên bản cuối cùng?

git diff last version:HEAD

1
Nếu bạn sử dụng GitHub cho vị trí đám mây của repo thì rất đơn giản: điều hướng đến dự án của bạn và nhấp vào tiêu đề "cam kết" trong bảng hiển thị dự án của bạn
David Lundquist

1
Ý nghĩa của "phiên bản hiện tại và phiên bản cuối" thực sự cần được làm rõ trong câu hỏi.
ngất xỉu

Câu trả lời:


1170

Tôi không thực sự hiểu ý nghĩa của "phiên bản cuối".

Vì cam kết trước đó có thể được truy cập bằng CHÍNH ^, tôi nghĩ rằng bạn đang tìm kiếm thứ gì đó như:

git diff HEAD^ HEAD

Kể từ Git 1.8.5, @là bí danh HEAD, vì vậy bạn có thể sử dụng:

git diff @~..@

Sau đây cũng sẽ làm việc:

git show

Nếu bạn muốn biết khác biệt giữa đầu và bất kỳ cam kết nào bạn có thể sử dụng:

git diff commit_id HEAD

Và điều này sẽ khởi chạy công cụ tìm khác biệt trực quan của bạn (nếu được định cấu hình):

git difftool HEAD^ HEAD

Vì so sánh với HEAD là mặc định, bạn có thể bỏ qua nó (như được chỉ ra bởi Orient ):

git diff @^
git diff HEAD^
git diff commit_id

Cảnh báo

  • @ScottF và @Panzercrisis giải thích trong các nhận xét rằng trên Windows ~nhân vật phải được sử dụng thay vì ^.

Tôi muốn một cái gì đó giống như phiên bản và phiên bản đã cam kết trước khi nó ... git diff head-1
Rajeev

7
Kể từ Git 1.8.5, @là một bí danh cho HEAD. Và vì ~^giống nhau khi chỉ quay lại một lần, tôi thấy git diff @~..@việc gõ dễ dàng hơn nhiều.
Andrew

80
@Andrew git showvẫn dễ dàng hơn, vì đó @~..@là điều mặc định hiển thị.
amalloy

3
git showChỉ in thông điệp cam kết, nó không tạo ra khác biệt về các thay đổi cụ thể, ít nhất là trong Git 2.5.4 (Apple Git-61), vì vậy nó thực sự sẽ không phải là câu trả lời cho câu hỏi của OP.
dùng1944491

1
Vấn đề với git showlà nếu HEADlà một cam kết hợp nhất, bạn sẽ không nhận được những gì bạn mong đợi vì bản thân cam kết hợp nhất có thể không có bất kỳ thay đổi nào. git diff HEAD^ HEADsẽ hiển thị những thay đổi thực tế giữa các phiên bản
RubenLaguna

157

Giả sử "phiên bản hiện tại" là thư mục làm việc (sửa đổi không được cam kết) và "phiên bản cuối cùng" là HEAD(sửa đổi cam kết cuối cùng cho chi nhánh hiện tại), chỉ cần làm

git diff HEAD

Tín dụng cho những người sau đây đi đến người dùng Cerran.

Và nếu bạn luôn bỏ qua khu vực dàn dựng -akhi bạn cam kết, thì bạn có thể chỉ cần sử dụng git diff.

Tóm lược

  1. git diff cho thấy những thay đổi không có căn cứ.
  2. git diff --cached cho thấy những thay đổi theo giai đoạn.
  3. git diff HEAD hiển thị tất cả các thay đổi (cả dàn dựng và không dàn dựng).

Nguồn: git-diff (1) Trang hướng dẫn - Cerran


16
Và nếu bạn luôn bỏ qua khu vực dàn dựng -akhi bạn cam kết, thì bạn có thể chỉ cần sử dụng git diff. <1> git diffshow unstaged thay đổi. <2> git diff --cachedhiển thị các thay đổi theo giai đoạn . <3> git diff HEADhiển thị tất cả các thay đổi (cả được dàn dựng và không được dàn dựng). Nguồn: git-diff (1) Trang hướng dẫn sử dụng
Cerran

1
Đây phải là câu trả lời được chấp nhận vì nó trả lời ý định của câu hỏi.
tgoneil

Tên của "phiên bản chưa được hiện tại" trong git là gì? Có thực sự có một cái tên?
Mathieu CAROFF

118

Như đã chỉ ra trên một nhận xét của amalloy , nếu theo "phiên bản hiện tại và phiên bản cuối", bạn có nghĩa là cam kết cuối cùng và cam kết trước đó, bạn chỉ cần sử dụng

git show

5
Đây là những gì tôi đang tìm kiếm. Câu trả lời chính xác.
CodeManiak

12
Sử dụng git show HEAD~1để hiển thị cam kết cuối cùng, và git show HEAD~2, v.v. cho các cam kết cũ hơn. Chỉ hiển thị một tập tin duy nhất thông qua git show HEAD~2 my_file.
Florian Brucker

60

Sự khác biệt giữa cam kết cuối cùng nhưng một cam kết cuối cùng (cộng với trạng thái hiện tại, nếu có):

git diff HEAD~

hoặc thậm chí (dễ gõ hơn)

git diff @~

nơi @là synonim cho HEADcác chi nhánh và hiện tại ~có nghĩa là "cho tôi phụ huynh sửa đổi nêu trên".


Tôi khá thích git diff HEAD^(hơn là HEAD~hình thức tương đương ). Nó dễ nhớ hơn đối với một "git cũ" như tôi ;-)
sxc731

3
Cà rốt là một vấn đề trong một số thiết bị đầu cuối. Rất vui khi có tùy chọn
light24bulbs

1
Câu trả lời có thể được cải thiện bằng cách giải thích ý nghĩa ~@ý nghĩa.
Bob Stein

1
Nếu chúng tôi chỉ muốn kiểm tra những gì đã cam kết trong lần xác nhận cuối cùng, đừng sử dụng điều này (vì những thay đổi bẩn ảnh hưởng đến khác biệt). Một cú pháp ngắn hơn để thực sự diff HEAD^ HEADnên được git diff @^!. Xem git-scm.com/docs/gitrevutions chor1^!
Johnny Wong

@JohnnyWong Cảm ơn bạn đã làm rõ. Tôi đã đề cập đến "tình trạng hiện tại" để không gây nhầm lẫn cho độc giả.
Tomilov Anatoliy

53

Bạn cũng có thể làm theo cách này:

So sánh với các cam kết trước đó

git diff --name-status HEAD~1..HEAD

So sánh với hai cam kết hiện tại và trước đây

git diff --name-status HEAD~2..HEAD

16

Chỉ sử dụng cachedcờ nếu bạn đã thêm nhưng chưa cam kết:

git diff --cached --color

1
Đây chính xác là những gì tôi đang tìm kiếm khi tôi tìm thấy câu hỏi này. Cảm ơn!
William Rogers

7

Nhanh chóng và đơn giản, giả sử bạn đang ở trong chủ:

    git diff (checkout_id):file.txt file.txt

Thí dụ:

    git diff asdfioei91819280din198:file.txt file.txt

4

Đầu tiên, sử dụng " git log" để liệt kê các bản ghi cho kho lưu trữ.

Bây giờ, chọn hai ID cam kết, liên quan đến hai cam kết. Bạn muốn thấy sự khác biệt ( ví dụ - Cam kết nhiều nhất và một số cam kết cũ hơn (theo kỳ vọng của bạn về phiên bản hiện tại và một số phiên bản cũ) ).

Tiếp theo, sử dụng:

git diff <commit_id1> <commit_id2>

hoặc là

git difftool <commit_id1> <commit_id2>

3

Nếu cam kết hàng đầu được chỉ ra bởi HEAD thì bạn có thể làm một cái gì đó như thế này:

commit1 -> HEAD
commit2 -> HEAD~1
commit3 -> HEAD~2

Khác nhau giữa cam kết thứ nhất và thứ hai:

git diff HEAD~1 HEAD

Khác nhau giữa cam kết thứ nhất và thứ ba:

git diff HEAD~2 HEAD

Khác nhau giữa cam kết thứ hai và thứ ba:

git diff HEAD~2 HEAD~1

Và như thế...


2

Tôi sử dụng Bitbucket với IDE Eclipse với cài đặt plugin Eclipse EGit .

Tôi so sánh một tệp từ bất kỳ phiên bản nào trong lịch sử của nó (như SVN ).

Menu Project Explorer → Tệp → nhấp chuột phải → NhómHiển thị trong lịch sử .

Điều này sẽ mang lại lịch sử của tất cả các thay đổi trên tập tin đó. Bây giờ Ctrlbấm vào và chọn bất kỳ hai phiên bản → "So sánh với nhau" .


2

Điều này cũng sẽ hoạt động cho các thẻ (loại bỏ 'uniq' bên dưới và các phần khác nếu bạn cần xem tất cả các thay đổi):

 git diff v1.58 HEAD 

Dưới đây là giống nhau và có thể hữu ích cho việc tích hợp liên tục (CI) cho các dịch vụ siêu nhỏ trong kho lưu trữ nguyên khối:

git diff v1.58 HEAD  --name-only | sort -u | awk 'BEGIN {FS="/"} {print $1}' | uniq
<Folder Name> 

(Tín dụng - https://dzone.com/articles/build-test-and-deploy-apps-independently-from-a-mo )

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.