2009-05-13 29 views

Trả lời

179

Với phiên bản git gần đây bạn có thể git add -N file (hoặc --intent-to-add), có thêm một blob zero-length để chỉ số tại địa điểm đó. Upshot là tập tin "untracked" của bạn bây giờ sẽ trở thành một sửa đổi để thêm tất cả các nội dung vào tập tin này có độ dài bằng không, và hiển thị trong đầu ra "git diff".

git diff 

echo "this is a new file" > new.txt 
git diff 

git add -N new.txt 
git diff 
diff --git a/new.txt b/new.txt 
index e69de29..3b2aed8 100644 
--- a/new.txt 
+++ b/new.txt 
@@ -0,0 +1 @@ 
+this is a new file 

Đáng buồn thay, như đã chỉ ra, bạn có thể không git stash khi bạn có một tập tin --intent-to-add cấp phát như thế này. Mặc dù nếu bạn cần phải stash, bạn chỉ cần thêm các tập tin mới và sau đó stash chúng. Hoặc bạn có thể sử dụng giải pháp mô phỏng:

git update-index --add --cacheinfo \ 
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt 

(thiết lập bí danh là bạn của bạn ở đây).

+0

Nó chỉ ra rằng bản sao của tôi của Git không đủ gần đây để có thêm -N, nhưng điều này trả lời câu hỏi của tôi. –

+1

Bạn có thể mô phỏng "git add -N new.txt" với "git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 mới.txt " (làm cách nào tôi quản lý để đưa câu trả lời sai?) – araqnid

+20

Khi người đứng đầu,' git add -N' ngắt 'git stash'. http://bit.ly/hLDfHq –

63

Tôi tin rằng bạn có thể khác với các tệp trong chỉ mục của bạn và các tệp không được theo dõi bằng cách chỉ cung cấp đường dẫn cho cả hai tệp.

git diff --no-index tracked_file untracked_file 
+2

Tính năng này có hoạt động nếu bạn có nhiều tệp không được theo dõi mà bạn đã tạo từ lần commit cuối cùng không? –

+8

Có, câu trả lời hoàn hảo! Sau đó tôi có thể sử dụng 'git diff --no-index untracked_file_1 untracked_file_2' để có được' git diff' cú pháp tô màu vv trên diffs ... đẹp. –

+25

Tôi không hiểu tại sao bạn so sánh tệp được theo dõi với *** một tệp không được liên kết không liên quan. *** Nếu bạn chỉ muốn có được kết xuất khác cho tệp không được theo dõi, bạn chỉ có thể sử dụng ['/ dev/null' ] (https://en.wikipedia.org/wiki/Null_device) thay vào đó: 'git diff --no-index -/dev/null '. –

26

Đối với gitting hàng ngày tương tác của tôi (trong đó tôi phân biệt cây làm việc với HEAD mọi lúc, và muốn có các tệp không được bao gồm trong phần khác), add -N/--intent-to-add không sử dụng được, vì nó breaksgit stash.

Vì vậy, đây là thay thế git diff của tôi. Nó không phải là một giải pháp đặc biệt là sạch, nhưng kể từ khi tôi thực sự chỉ sử dụng nó một cách tương tác, tôi vẫn ổn với một hack:

d() { 
    if test "$#" = 0; then 
     (
      git diff --color 
      git ls-files --others --exclude-standard | 
       while read -r i; do git diff --color -- /dev/null "$i"; done 
     ) | `git config --get core.pager` 
    else 
     git diff "[email protected]" 
    fi 
} 

Typing chỉ d sẽ bao gồm các file untracked trong diff (đó là những gì tôi quan tâm trong tôi quy trình làm việc) và d args... sẽ hoạt động như thường lệ git diff.

Ghi chú:

  • Chúng tôi đang sử dụng thực tế ở đây là git diff thực sự là diffs chỉ cá nhân nối, vì vậy nó không thể nói với d đầu ra từ một "diff thực" - ngoại trừ một thực tế rằng tất cả các tập tin không được sắp xếp được sắp xếp cuối cùng.
  • Vấn đề duy nhất với chức năng này là đầu ra được tô màu ngay cả khi được chuyển hướng; nhưng tôi không thể bận tâm để thêm logic cho điều đó.
  • Tôi không thể tìm thấy bất kỳ cách nào để tải các tệp không được theo dõi bằng cách chỉ cần lắp ráp danh sách đối số slick cho git diff. Nếu ai đó tìm ra cách để thực hiện việc này hoặc nếu có thể một tính năng được thêm vào git tại một số thời điểm trong tương lai, vui lòng để lại ghi chú tại đây!
+3

Trớ trêu thay, giải pháp 'git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt' của tôi đã gợi ý cho các gits cũ hơn * làm việc với' git stash', giả sử bạn đã có e69de29bb trong db, ví dụ: bằng cách sử dụng 'add -N' trước đây. ly nó không chính xác tương đương với 'git add -N' theo cách nào đó: tbh Tôi không chắc chắn làm thế nào. – araqnid

+0

Bạn đang thực hiện so sánh chuỗi thay vì kiểm tra bình đẳng bằng lệnh 'test' của bạn, nhân tiện. Không nên ảnh hưởng đến bất kỳ điều gì, nhưng 'test" $ # "-eq 0' chính xác hơn là những gì được dự định. – Wildcard

-1

Giả sử bạn không có địa phương cam kết,

git diff origin/master 
+4

Câu hỏi yêu cầu lệnh 'git diff' bao gồm các tệp không được theo dõi. Lệnh này không bao gồm chúng. Ngoài ra, cho dù các cam kết cục bộ có tồn tại hay không hoàn toàn không liên quan gì đến câu hỏi này. – toon81

+0

JFTR, tôi 'git merge --squash mybranch' và' git diff master' cho tôi thấy những thay đổi trong các tập tin không được theo dõi. – muammar

+1

Điều đó là không thể. Bạn dường như bị nhầm lẫn về những gì "untracked" có nghĩa là. Untracked không có nghĩa là một tập tin được theo dõi trong một nhánh và không phải là một nhánh khác, nó có nghĩa là nó không phải là "trong Git" ở bất kỳ đâu. Cho dù bạn squash hay không làm cho không có sự khác biệt. 'git diff' không hiển thị sự khác biệt trong các tập tin không được theo dõi: bởi vì chúng không được báo trước, không bao giờ có bất kỳ sự khác biệt nào để hiển thị, theo định nghĩa. Nó chỉ là cách Git hoạt động. :) – toon81

11

Không phải 100% vào vấn đề, nhưng vì không có câu trả lời thực sự thỏa đáng, ở đây được nêu một số khác cùng loại đó;) Nếu các tập tin untracked, rõ ràng các diff là toàn bộ tập tin, vì vậy bạn chỉ có thể xem chúng với ít:

less $(git ls-files --others --exclude-standard) 

Navigate giữa chúng với: n và: p cho tiếp theo và trước ..

+0

bạn cũng có thể chạy 'git diff/dev/null ' và lấy bản vá ở định dạng vá thay vì "chỉ" một tệp – SimSimY

15

Các thay đổi hoạt động khi được tổ chức và không được dàn dựng với lệnh này. Các tệp mới hoạt động khi được dàn dựng:

$ git diff HEAD 

Nếu chúng không được dàn dựng, bạn sẽ chỉ thấy sự khác biệt về tệp.

+3

'HEAD' là [giá trị mặc định] (https: // git-scm .com/docs/git-diff # git-diff-emgitdiffem - tùy chọn - cachedltcommitgt - ltpathgt82308203), vì vậy điều này giống với 'git diff' không giải quyết được vấn đề. –

2

này làm việc cho tôi:

git add my_file.txt 
git diff --cached my_file.txt 
git reset my_file.txt 

Bước cuối cùng là tùy chọn, nó sẽ để lại các tập tin trong trạng thái trước đó (untracked)

hữu ích nếu bạn đang tạo ra một bản vá quá:

git diff --cached my_file.txt > my_file-patch.patch 
+0

Câu hỏi cho biết: "đặt cược tốt nhất của tôi để git thêm các tệp mới mà tôi đã tạo và các tệp hiện có tôi đã chỉnh sửa và sử dụng' git diff --cached'? " Vì vậy, về cơ bản bạn đã không đọc câu hỏi? Cải tiến hữu ích sẽ là 'git add -A.; git diff --cached; git reset'. – catpnosis

+0

bạn có thực sự cần phải là @catpnosis thô lỗ đó không? Bạn có nghĩ rằng tôi sẽ dành thời gian cố gắng giúp đỡ ai đó mà không cần đọc tin nhắn không ?? –

+0

Xin đừng tự mình làm. – catpnosis

0

thường là khi tôi làm việc với các nhóm vị trí từ xa, điều quan trọng đối với tôi là tôi có kiến ​​thức trước về những thay đổi được thực hiện bởi các nhóm khác trong cùng một tệp, trước khi tôi theo dõi các giai đoạn git không đúng -> dàn dựng -> com mit cho rằng tôi đã viết một kịch bản bash đó giúp tôi tránh không cần thiết xung đột quyết tâm hợp nhất với đội từ xa hoặc làm chi nhánh địa phương mới và so sánh và hợp nhất trên chi nhánh chính

#set -x 
branchname=`git branch | grep -F '*' | awk '{print $2}'` 
echo $branchname 
git fetch origin ${branchname} 
for file in `git status | grep "modified" | awk "{print $2}" ` 
do 
echo "PLEASE CHECK OUT GIT DIFF FOR "$file 
git difftool FETCH_HEAD $file ; 
done 

trong kịch bản ở trên tôi lấy chi nhánh chính từ xa (không cần chi nhánh chính của nó) để FETCH_HEAD họ tạo danh sách tệp đã sửa đổi của tôi và so sánh các tệp đã sửa đổi thành git difftool

ở đây nhiều difftool được hỗ trợ bởi git, tôi định cấu hình 'Meld Diff Viewer' để so sánh GUI tốt.

Các vấn đề liên quan