Làm cách nào để hiển thị các thay đổi đã được dàn dựng?


2141

Tôi đã dàn dựng một vài thay đổi sẽ được cam kết; Làm thế nào tôi có thể thấy khác biệt của tất cả các tệp được dàn dựng cho lần xác nhận tiếp theo? Tôi biết về trạng thái git , nhưng tôi muốn thấy sự khác biệt thực tế - không chỉ tên của các tệp được dàn dựng.

Tôi thấy rằng trang man git-diff (1) nói

git diff [--options] [-] [Mạnh]

Biểu mẫu này là để xem những thay đổi bạn đã thực hiện liên quan đến chỉ mục (khu vực tổ chức cho lần xác nhận tiếp theo). Nói cách khác, sự khác biệt là những gì bạn có thể nói với git để thêm vào chỉ mục nhưng bạn vẫn không có. Bạn có thể thực hiện các thay đổi này bằng cách sử dụng git-add (1).

Thật không may, tôi không thể hiểu điều này. Phải có một số lót tiện dụng mà tôi có thể tạo bí danh cho, phải không?


76
git status -vlàm việc quá Xem câu trả lời của tôi dưới đây
VonC

3
@VonC Tôi luôn sử dụng cái này, nhưng được chuyển đến less, như trong: git status -v | less- khối có thể quản lý :)
Mr Office

Câu trả lời:


2613

Nó chỉ nên là:

git diff --cached

--cachedcó nghĩa là hiển thị các thay đổi trong bộ đệm / chỉ mục (tức là thay đổi theo giai đoạn) so với hiện tại HEAD. --stagedlà một từ đồng nghĩa với --cached.

--staged--cachedkhông chỉ ra HEAD, chỉ khác biệt đối với HEAD. Nếu bạn chọn những gì để cam kết sử dụng git add --patch(hoặc git add -p), --stagedsẽ trả lại những gì được dàn dựng.


35
Nếu bạn chỉ muốn tên tệp, hãy thực hiện các thao tác sau git diff --name-only --cachedcho mỗi bài đăng tại stackoverflow.com/a/4525025/255187
Michel Hébert

4
Sử dụng cái này git difftool --stagedthay vì git diff --stagedkhởi chạy công cụ tìm khác biệt mặc định trên mỗi tệp. difftoolcó thể được thay thế cho diffbất kỳ đối số khác là tốt.
LightCC

Và bạn có thể sử dụng git difftool --staged -dđể tìm khác biệt hai thư mục trong một công cụ trực quan thay vì một tệp cùng một lúc.
Robert Bernstein

vì câu hỏi này được đánh dấu là câu trả lời và hiển thị đầu tiên, nó nên bao gồm git diff ở đầu, sau đó git [[khác]], chỉ 2 xu của tôi
Vitaliy Terziev

Và để xem các thay đổi trong một tập tin được dàn dựng, sau đây sẽ hoạt động:git diff --cached -- <stagedfile>
Rõ ràngChild

1605

Một đồ họa đơn giản làm cho điều này rõ ràng hơn:

Đơn giản Git khác

khác biệt

Hiển thị các thay đổi giữa thư mục làm việc và chỉ mục. Điều này cho thấy những gì đã được thay đổi, nhưng không được dàn dựng cho một cam kết.

git diff - đã đóng

Hiển thị các thay đổi giữa chỉ mục và CHÍNH (là cam kết cuối cùng trên nhánh này). Điều này cho thấy những gì đã được thêm vào chỉ mục và dàn dựng cho một cam kết.

git diff

Hiển thị tất cả các thay đổi giữa thư mục làm việc và HEAD (bao gồm các thay đổi trong chỉ mục). Điều này cho thấy tất cả các thay đổi kể từ lần cam kết cuối cùng, cho dù chúng có được dàn dựng cho cam kết hay không.

Ngoài ra :

Có một chút chi tiết hơn về 365Git.


8
Điều này là ngây thơ, tôi sợ (như thường thấy với bất kỳ lời giải thích git nào). Nếu bạn có thay đổi địa phương foo.cvà không thực hiện git add foo.c, sau đó foo.ckhông nằm trong chỉ số ; nó không được dàn dựng cho cam kết. Nếu git diff foo.cngây thơ so với làm việc foo.cvới chỉ mục, thì nó sẽ phải hiển thị một sự khác biệt lớn giữa một tệp trống / không tồn tại và toàn bộ nội dung của foo.c. Vì vậy, trên thực tế, khi một tệp không tồn tại trong chỉ mục, hãy git diffquay lại, đối với tệp đó, khi sử dụng HEADbản sao.
Kaz

9
@Kaz nói đúng, chỉ số không phải là một bảng trống. Đó là một bản sao ảo của những HEADthay đổi theo giai đoạn được áp dụng. Hãy nhớ rằng Git hoạt động bằng cách lưu các thay đổi, không phải bằng cách lưu toàn bộ tệp. Khi bạn tạo tập tin, nó chỉ lưu trữ những thay đổi được thực hiện. Nếu chỉ mục trống như bạn ngụ ý, nó sẽ không biết cách lưu các thay đổi trong chỉ mục và sẽ phải lưu toàn bộ tệp dưới dạng "mới được thêm" - đó là sai.
ADTC

8
@Kaz Cả chỉ mục và HEADsẽ có phiên bản không thay đổi của foo.ctệp (chúng không phải là bản sao vật lý, mà chỉ là bản sao logic cho bạn và tôi. Đối với Git, chúng chỉ là cùng một luồng dữ liệu mà mọi cam kết từng tham gia tệp đó đề cập đến ). Vì vậy, khi bạn làm git difftrên hoàn toàn unstaged foo.clại nó không thực sự rơi xuống HEADnó thực sự làm diff với Index (mà xảy ra để chứa các phiên bản chính xác cùng của tập tin như HEADvậy). Vì vậy, đồ họa là chính xác.
ADTC

2
Xin chào, tôi muốn biết " chỉ mục " nghĩa là gì trong bối cảnh này? Cảm ơn!
Gab 是

2
@TomRussell git status -vtương đương với git diff --cached( git statustất nhiên là cộng thêm )
wvducky

54

Nếu bạn quan tâm đến chế độ xem trực quan, công cụ khuếch tán hình ảnh khuếch tán có thể làm điều đó. Nó thậm chí sẽ hiển thị ba bảng nếu một số nhưng không phải tất cả các thay đổi được dàn dựng. Trong trường hợp có xung đột, thậm chí sẽ có bốn tấm.

Ảnh chụp màn hình khuếch tán với các chỉnh sửa theo giai đoạn và không được dàn dựng

Gọi nó với

diffuse -m

trong bản sao làm việc Git của bạn.

Nếu bạn hỏi tôi, sự khác biệt về hình ảnh tốt nhất mà tôi đã thấy trong một thập kỷ. Ngoài ra, nó không đặc trưng cho Git: Nó tương tác với rất nhiều VCS khác, bao gồm SVN, Mercurial, Bazaar, ...

Xem thêm: Hiển thị cả cây dàn dựng & cây làm việc trong git diff?


1
Cảm ơn, đây trông giống như một công cụ tốt đẹp. Tôi đã tìm thấy Meld là công cụ tìm khác biệt trực quan tốt nhất cho Linux cho đến nay, nhưng tôi đã bỏ lỡ việc có thể tìm văn bản khác từ bảng tạm - Meld yêu cầu các tệp để nhập. Diffuse cho phép điều này, cũng như sắp xếp lại thủ công. Sẽ thử nó một lúc.
Drew Noakes

Liên kết bị hỏng đến diffuse.sourceforge.net, sử dụng sourceforge.net/projects/diffuse ngay bây giờ.
dùng1133275

1
brew install diffusehoạt động trên OS X. Không hiển thị 3 bảng nếu cả thay đổi không theo giai đoạn và theo giai đoạn - bạn có nghĩa là những thay đổi chưa có trong chỉ mục?
Brent Faust

Phiên bản khuếch tán nào bạn có? Có - nếu bạn thêm một tệp và sau đó sửa đổi tệp cục bộ, nó sẽ hiển thị ba bảng.
krlmlr

Bạn cũng có thể thiết lập khuếch tán dưới dạng Difftool mặc định của mình và sử dụng cơ chế / công cụ / bí danh tích hợp đó để khởi chạy nó. Xem câu trả lời của tôi tại đây: < stackoverflow.com/a/45684512/6501141 >
LightCC

50

Lưu ý rằng git status -v cũng cho thấy những thay đổi theo giai đoạn! (có nghĩa là bạn cần phải dàn dựng - git add- một số thay đổi. Không có thay đổi theo giai đoạn, không khác biệt với git status -v.
Nó thực hiện điều đó kể từ Git 1.2.0, tháng 2 năm 2006 )

Ở dạng dài (mặc định), git statuscó tùy chọn "dài dòng" không có giấy tờ, thực sự hiển thị sự khác biệt giữa CHÍNH và chỉ mục.

Và nó sắp trở nên hoàn thiện hơn nữa: xem " Hiển thị cả cây được dàn dựng & làm việc trong git diff? " (Git 2.3.4+, Q2 2015):

git status -v -v

Dòng cuối cùng phải làgit diff HEAD
artur 31/05/2015

2
@artur tại sao? Điểm của câu trả lời là đề cập đến điều đó git status -vvcũng bao gồm những gì git diff HEAD.
VonC

Không hoạt động git version 1.8.3.1. Tôi biết nó đã cũ, nhưng nếu có thể, hãy lưu ý khi lá cờ này được giới thiệu.
onebree

2
@onebree 1.8.3.1 là tháng 6 năm 2013, thực sự cũ. Nhưng git status -vcũ hơn ( github.com/git/git/commit/ Wite , git 1.2.0, tháng 2 năm 2006!). Lưu ý rằng nó hiển thị độ lệch giữa chỉ mụcHEAD: nếu bạn đã thêm bất cứ thứ gì vào chỉ mục (không git add), thì git status -vsẽ không hiển thị bất kỳ khác biệt nào. git status -v -vlà gần đây hơn (Git 2.3.4, tháng 3 năm 2015)
VonC

@VonC đó là sai lầm của tôi ... Tôi đã làm git diff -v.
onebree

25

Bạn có thể sử dụng lệnh này.

git diff --cached --name-only

Các --cachedtùy chọn git diffphương tiện để có được file dàn dựng, và các --name-onlyphương tiện tùy chọn để chỉ nhận được tên của các tập tin.


2
Vui lòng chỉnh sửa với nhiều thông tin hơn. Các câu trả lời chỉ dành cho mã và "thử cái này" không được khuyến khích, vì chúng không chứa nội dung có thể tìm kiếm và không giải thích lý do tại sao một người nào đó nên "thử cái này".
abarisone

2
Không chắc chắn lý do tại sao tôi muốn điều này, với --name-onlytùy chọn tôi cũng có thể sử dụng thường xuyêngit status
Simon Forsberg

16

Từ phiên bản 1.7 trở lên phải là:

git diff --staged

15

SỬ DỤNG CÔNG CỤ DIFF VISUAL

Câu trả lời mặc định (tại dòng lệnh)

Các câu trả lời hàng đầu ở đây hiển thị chính xác cách xem các thay đổi được lưu trong bộ nhớ cache / theo giai đoạn trong Index:

$ git diff --cached

hoặc $ git diff --stagedđó là một bí danh.


Thay vào đó, khởi chạy Visual Diff Tool

Câu trả lời mặc định sẽ đưa ra các thay đổi khác nhau tại git bash (tức là trên dòng lệnh hoặc trong bảng điều khiển). Đối với những người thích biểu diễn trực quan về sự khác biệt của tập tin theo giai đoạn, có một tập lệnh có sẵn trong git sẽ khởi chạy một công cụ tìm khác biệt cho mỗi tệp được xem thay vì hiển thị chúng trên dòng lệnh, được gọi là difftool:

$ git difftool --staged

Điều này sẽ làm tương tự như vậy git diff --staged, ngoại trừ bất cứ khi nào công cụ diff được chạy (tức là mỗi khi tệp được xử lý bởi diff), nó sẽ khởi chạy công cụ tìm khác biệt trực quan mặc định (trong môi trường của tôi, đây là kdiff3 ).

Sau khi công cụ khởi chạy, tập lệnh git diff sẽ tạm dừng cho đến khi công cụ tìm khác biệt trực quan của bạn được đóng lại. Do đó, bạn sẽ cần phải đóng từng tệp để xem tệp tiếp theo.


Bạn luôn có thể sử dụng difftoolthay cho difflệnh git

Đối với tất cả các nhu cầu khác biệt về thị giác của bạn, git difftoolsẽ hoạt động thay cho bất kỳ git difflệnh nào , bao gồm tất cả các tùy chọn.

Ví dụ: để khởi chạy công cụ tìm khác biệt trực quan mà không cần hỏi có nên làm điều đó cho mỗi tệp hay không, hãy thêm -ytùy chọn (tôi nghĩ thông thường bạn sẽ muốn điều này !!):

$ git difftool -y --staged

Trong trường hợp này, nó sẽ kéo từng tệp trong công cụ tìm khác biệt trực quan, từng tệp một, đưa ra tệp tiếp theo sau khi đóng công cụ.

Hoặc để xem khác biệt của một tệp cụ thể được dàn dựng trong Index:

$ git difftool -y --staged <<relative path/filename>>

Đối với tất cả các tùy chọn, xem trang người đàn ông:

$ git difftool --help


Thiết lập công cụ Visual Git

Để sử dụng một công cụ git trực quan khác với mặc định, hãy sử dụng -t <tool>tùy chọn:

$ git difftool -t <tool> <<other args>>

Hoặc, xem trang man Difftool để biết cách định cấu hình git để sử dụng một công cụ tìm khác biệt trực quan mặc định khác.


Các .gitconfigmục ví dụ cho vscode là công cụ diff / merge

Một phần của việc thiết lập một Difftool liên quan đến việc thay đổi .gitconfigtệp, thông qua các lệnh git thay đổi nó phía sau hậu trường hoặc chỉnh sửa trực tiếp.

Bạn có thể tìm thấy .gitconfigtrong thư mục nhà của bạn, chẳng hạn như ~trong Unix hoặc thông thường c:\users\<username>trên Windows).

Hoặc, bạn có thể mở người dùng .gitconfigtrong trình chỉnh sửa Git mặc định của mình với git config -e --global.

Dưới đây là các mục ví dụ trong người dùng toàn cầu của tôi .gitconfigcho VS Code là cả công cụ tìm khác biệt và công cụ hợp nhất:

[diff]
    tool = vscode
    guitool = vscode
[merge]
    tool = vscode
    guitool = vscode
[mergetool]
    prompt = true
[difftool "vscode"]
    cmd = code --wait --diff \"$LOCAL\" \"$REMOTE\"
    path = c:/apps/vscode/code.exe
[mergetool "vscode"]
    cmd = code --wait \"$MERGED\"
    path = c:/apps/vscode/code.exe

14

Đối với sử dụng so sánh Khu vực tổ chức và Kho lưu trữ (cam kết cuối cùng)

 $git diff --staged

Lệnh so sánh các $ git add fileNamethay đổi theo giai đoạn ( ) của bạn với cam kết cuối cùng của bạn. Nếu bạn muốn xem những gì bạn đã dàn dựng sẽ đi vào cam kết tiếp theo của bạn, bạn có thể sử dụng git diff --staged. Lệnh này so sánh các thay đổi theo giai đoạn của bạn với cam kết cuối cùng của bạn.

Để sử dụng so sánh dàn dựng và sử dụng

$ git diff 

Lệnh so sánh những gì trong thư mục làm việc của bạn với những gì trong khu vực tổ chức của bạn. Điều quan trọng cần lưu ý là git diff tự nó không hiển thị tất cả các thay đổi được thực hiện kể từ lần cam kết cuối cùng của bạn - chỉ những thay đổi vẫn chưa được thực hiện. Nếu bạn đã dàn dựng tất cả các thay đổi của mình ( $ git add fileName), git diff sẽ không cung cấp cho bạn đầu ra.

Ngoài ra, nếu bạn tạo một tệp ( $ git add fileName) và sau đó chỉnh sửa tệp, bạn có thể sử dụng git diff để xem các thay đổi trong tệp được phân loại và các thay đổi không được phân loại.


"Để sử dụng so với kho so sánh sử dụng $ git diff" . Tôi khá chắc chắn git diffso sánh giữa Làm việc và Dàn dựng. Xem stackoverflow.com/a/1587952
wvducky

8

Nếu ý định của bạn là nhắm mục tiêu một nhánh repo từ xa và lần đầu tiên bạn vượt qua nhật ký thay đổi cam kết là không đầy đủ, bạn có thể sửa câu lệnh cam kết trước khi đẩy như thế này.

Tại địa phương

... thực hiện một số thay đổi ...

git diff # look at unstaged changes

git commit -am"partial description of changes"

... nhớ lại nhiều thay đổi chưa được đề cập trong cam kết ...

git diff origin / master # nhìn vào giai đoạn nhưng không được thay đổi

... sửa đổi tuyên bố cam kết ...

git commit --amend -m"i missed mentioning these changes ...."

git push

7

Nếu bạn có nhiều tệp với các thay đổi theo giai đoạn, có thể sử dụng thực tế hơn git add -i, sau đó chọn 6: diffvà cuối cùng chọn (các) tệp bạn quan tâm.


6

Theo mặc định, git diff được sử dụng để hiển thị các thay đổi không được thêm vào danh sách các tệp được cập nhật git. Nhưng nếu bạn muốn hiển thị các thay đổi được thêm hoặc so le thì bạn cần cung cấp các tùy chọn bổ sung sẽ cho git biết rằng bạn quan tâm đến các tập tin khác nhau hoặc được thêm vào .

$ git diff          # Default Use
$ git diff --cached # Can be used to show difference after adding the files 
$ git diff --staged # Same as 'git diff --cached' mostly used with latest version of git 

Thí dụ

$ git diff 
diff --git a/x/y/z.js  b/x/y/z.js index 98fc22b..0359d84 100644
--- a/x/y/z.js 
+++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {

-        if (a)
+        if (typeof a !== 'undefined')
             res = 1;
         else
             res = 2;

$ git add x/y/z.js
$ git diff
$

Khi bạn đã thêm các tệp, bạn không thể sử dụng mặc định 'git diff'. Bạn phải làm như thế này: -

$ git diff --cached
diff --git a/x/y/z.js  b/x/y/z.js index 98fc22b..0359d84 100644
    --- a/x/y/z.js 
    +++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {

    -        if (a)
    +        if (typeof a !== 'undefined')
                 res = 1;
             else
                 res = 2;

2

git guigit-colalà các tiện ích đồ họa cho phép bạn xem và thao tác chỉ mục. Cả hai đều bao gồm các khác biệt trực quan đơn giản cho các tập tin theo giai đoạn và git-colacũng có thể khởi chạy một công cụ tìm khác biệt trực quan tinh vi hơn.

Xem câu trả lời liên quan chặt chẽ của tôi tại Làm thế nào để xóa một tệp khỏi chỉ mục trong git? và danh mục chính thức này của Git - GUI Client .


0

Cũng nghĩ về gitkcông cụ này, được cung cấp với git và rất hữu ích để xem các thay đổi

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.