Câu hỏi Làm cách nào để hiển thị các thay đổi đã được tổ chức?


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

Tôi thấy rằng git-diff (1) trang người đàn ông nói

git diff [--options] [-] […]

Biểu mẫu này là để xem các thay đổi bạn đã thực hiện liên quan đến chỉ mục (vùng dàn dựng cho lần commit 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 để tiếp tục thêm vào chỉ mục nhưng bạn vẫn chưa. 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 hoàn toàn không thể hiểu được điều này. Phải có một số lớp lót tiện dụng mà tôi có thể tạo bí danh cho đúng không?


1697
2017-10-19 09:57


gốc


git status -v cũng vậy. Xem câu trả lời của tôi bên dưới - VonC
@VonC Tôi luôn sử dụng nó, nhưng được less, như trong: git status -v | less - khối quản lý :) - Mr Office


Các câu trả lời:


Nó chỉ nên là:

git diff --cached

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

--staged và --cached không trỏ đến HEAD, chỉ khác biệt đối với HEAD. Nếu anh đào chọn thứ cần cam kết sử dụng git add --patch (hoặc là git add -p), --staged sẽ trả về những gì được tổ chức.


2102
2017-10-19 10:07



Nếu bạn chỉ muốn tên tệp, hãy làm như sau git diff --name-only --cached trên mỗi bài đăng tại stackoverflow.com/a/4525025/255187 - Michel Hébert
Sử dụng điều này với git difftool --staged thay vì git diff --staged để khởi chạy công cụ khác biệt hình ảnh mặc định trên mỗi tệp. difftool có thể được thay thế cho diff với bất kỳ đối số nào khác. - LightCC


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

Simple Git diffs

git diff

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 tổ chức cho một cam kết.

git diff --cached

Hiển thị các thay đổi giữa chỉ mục và HEAD (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à được tổ chức cho một cam kết.

git diff HEAD

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 commit cuối cùng, cho dù chúng có được dàn dựng hay không.

Cũng thế:

Có thêm một chút chi tiết về 365Git.


1411
2017-10-24 21:05



Đây là ngây thơ, tôi sợ (như thường là trường hợp với bất kỳ lời giải thích git). Nếu bạn có sửa đổi cục bộ foo.c và không thực hiện git add foo.c, sau đó foo.c Là không có trong chỉ mục; nó không được dàn dựng để cam kết. Nếu git diff foo.c ngây thơ so với làm việc foo.c để chỉ mục, sau đó nó sẽ phải hiển thị một sự khác biệt lớn giữa một tập tin rỗ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, git diff quay trở lại, cho tập tin đó, khi sử dụng HEAD sao chép. - Kaz
@Kaz nói đúng, chỉ số là không phải một phiến đá trống. Đó là một bản sao ảo của HEAD mà các thay đổi theo giai đoạn được áp dụng. Hãy nhớ rằng Git hoạt động bằng cách lưu thay đổi, chứ không phải bằng cách lưu toàn bộ tệp. Khi bạn tạo một tệp, nó chỉ lưu trữ các thay đổi được thực hiện. Nếu chỉ mục là trống như bạn ngụ ý, nó sẽ không biết làm thế nào để lưu các thay đổi trong chỉ mục, và sẽ phải lưu toàn bộ tập tin là "mới được thêm vào" - đó là sai. - ADTC
@Kaz Cả chỉ mục và HEAD sẽ có phiên bản không thay đổi của foo.c tập tin (chúng không phải là bản sao vật lý, nhưng chỉ là bản sao hợp lý cho bạn và tôi. Để Git chúng chỉ là luồng dữ liệu giống nhau mà mọi cam kết có liên quan đến tệp đó đề cập đến). Vì vậy, khi bạn làm git diff trên đầy đủ không có lề foo.c nó không thực sự rơi trở lại HEAD nó thực sự làm việc khác với chỉ mục (điều này xảy ra chứa phiên bản chính xác của tệp như HEAD làm). Vì vậy, đồ họa là chính xác. - ADTC
Xin chào, tôi muốn biết ý nghĩa của nó "mục lục"trong bối cảnh này? Cảm ơn! - Gab是好人
@Abizern Vì vậy, chỉ số là những thay đổi theo giai đoạn? - Gab是好人


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

Screenshot of diffuse with staged and unstaged edits

Gọi nó bằng

diffuse -m

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

Nếu bạn hỏi tôi, hình ảnh tốt nhất khác nhau tôi đã thấy trong một thập kỷ. Ngoài ra, nó không phải là cụ thể 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ả hai giai đoạn và cây làm việc trong git diff?


52
2018-03-18 07:22



Cảm ơn, điều 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 kiếm hình ảnh tốt nhất cho Linux cho đến nay, nhưng tôi đã bỏ lỡ việc có thể tìm ra văn bản khác từ khay nhớ tạm - Meld yêu cầu tệp cho đầu vào. Diffuse cho phép điều này, cũng như sắp xếp lại thủ công. Sẽ dùng thử một lúc. - Drew Noakes
Liên kết bị hỏng đến diffuse.sourceforge.net, sử dụng sourceforge.net/projects/diffuse cho bây giờ. - user1133275
brew install diffuse hoạt động trên OS X. Không hiển thị 3 ô nếu cả thay đổi không được tổ chức và theo giai đoạn - ý của bạn có phải là các thay đổi chưa có trong chỉ mục không? - Brent Faust
Bạn có phiên bản khuếch tán nào? Có - nếu bạn thêm tệp và sau đó sửa đổi tệp cục bộ, tệp sẽ hiển thị ba ngăn. - krlmlr
Bạn cũng có thể thiết lập khuếch tán làm mặc định của bạn difftoolvà sử dụng cơ chế / công cụ / bí danh tích hợp sẵn để khởi chạy nó. Xem câu trả lời của tôi ở đây: <stackoverflow.com/a/45684512/6501141>; - LightCC


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

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

Và nó sắp trở nên hoàn chỉnh hơn: xem "Hiển thị cả hai giai đoạn và cây làm việc trong git diff?"(git 2.3.4+, Q2 2015):

git status -v -v

38
2017-08-31 10:05



Dòng cuối cùng phải là git diff HEAD - artur
@artur tại sao? Điểm của câu trả lời là đề cập đến git status -vv cũng bao gồm những gì git diff HEAD làm. - VonC
Không hoạt động git version 1.8.3.1. Tôi biết nó cũ, nhưng nếu có thể, lưu ý khi lá cờ này được giới thiệu. - onebree
@onebree 1.8.3.1 là tháng 6 năm 2013, thực sự cũ. Nhưng git status -v lớn hơn (github.com/git/git/commit/…, git 1.2.0, February 2006!). Lưu ý rằng nó hiển thị sự khác biệt giữa mục lục và HEAD: nếu bạn đã thêm bất kỳ thứ gì vào chỉ mục (không git add), sau đó git status -v sẽ không hiển thị bất kỳ khác biệt nào. git status -v -v gần đây hơn (Git 2.3.4, tháng 3 năm 2015) - VonC
@VonC đó là lỗi của tôi ... tôi đã làm git diff -v. - onebree


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

git diff --cached --name-only

Các --cachedtùy chọn của git diff có nghĩa là để có các tệp được dàn dựng và --name-only tùy chọn có nghĩa là chỉ lấy tên của các tệp.


23
2017-07-19 17:39



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


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

git diff --staged

15
2017-08-14 23:33





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 trữ / tổ chức trong Index:

$ git diff --cached

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


Khởi chạy công cụ Visual Diff thay thế

Câu trả lời mặc định sẽ nhổ ra những thay đổi khác biệt tại git bash (tức là trên dòng lệnh hoặc trong giao diện điều khiển). Đối với những người thích một đại diện trực quan của sự khác biệt tập tin dàn dựng, có một kịch bản có sẵn trong git mà ra mắt một công cụ khác biệt trực quan cho mỗi tập tin đượ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ẽ thực hiện tương tự như git diff --staged, ngoại trừ bất kỳ lúc nào công cụ tìm khác biệt được chạy (tức là mỗi khi một tệp được xử lý theo cách khác), nó sẽ khởi chạy công cụ khác biệt hình ảnh 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 bị đóng. Do đó, bạn sẽ cần đóng mỗi tệp để xem tệp tiếp theo.


Bạn luôn có thể sử dụng difftool thay cho diff trong lệnh git

Đối với tất cả các nhu cầu khác về thị giác của bạn, git difftool sẽ làm việc thay cho bất kỳ git diff lệnh, 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 hỏi liệu có nên thực hiện nó cho mỗi tệp hay không, hãy thêm -y tùy chọn (tôi nghĩ rằng 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 tin trong công cụ tìm khác biệt trực quan, từng cái một, đưa lên một tệp tiếp theo sau khi công cụ được đóng lại.

Hoặc để xem xét sự 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, hãy xem trang hướng dẫn:

$ git difftool --help


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

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

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

Hoặc, xem trang hướng dẫn sử dụng difftool để biết cách cấu hình git để sử dụng một công cụ tìm khác biệt hình ảnh mặc định khác.


12
2018-03-14 14:30



Đối với OP tôi nghi ngờ đây là câu trả lời tốt nhất. - Matt Ruwe


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


7
2017-10-14 18:32





Nếu ý định của bạn là push-target branch repo từ xa và pass đầu tiên của bạn tại một log thay đổi commit không đầy đủ, bạn có thể sửa câu lệnh commit trước khi push như thế này.

Cục bộ

... 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 không được đề cập trong cam kết ...

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

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

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

git push

7
2018-02-25 21:16





Đối với Staging Area và sử dụng so sánh Repository

$git diff --staged

Để sử dụng so sánh Làm việc và Kho lưu trữ

$ git diff 

nhưng nếu một tệp được thay đổi và được thêm vào khu vực dàn dựng ($ git add fileName) và chúng tôi cố gắng thấy sự khác biệt với ( $ git diff). Nó sẽ không trả về bất kỳ sự khác biệt nào vì tệp nằm trong vùng dàn dựng và nó sẽ không được so sánh với kho lưu trữ.


7
2017-11-20 06:30



"Để sử dụng so sánh Làm việc và Kho lưu trữ $ git diff". Tôi khá chắc chắn rằng git diff so sánh giữa Working vs Staging. Xem stackoverflow.com/a/1587952 - wisbucky


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 của git. Nhưng nếu bạn muốn hiển thị các thay đổi được thêm vào hoặc bị mắc kẹt thì bạn cần phải cung cấp các tùy chọn bổ sung sẽ cho phép git biết rằng bạn quan tâm đến các tệp bị thêm hoặc bị thêm vào khác biệt .

$ 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
$

Một khi bạn thêm các tập tin, bạn không thể sử dụng mặc định của '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;

4
2018-04-13 14:31