git add * (dấu hoa thị) so với git add. (giai đoạn = Stage)


130

Tôi mới sử dụng git và tôi có câu hỏi về việc thêm tệp trong git. Tôi đã tìm thấy nhiều câu hỏi stackoverflow về sự khác biệt giữa git add .git add -a, git add --all, git add -A, vv Nhưng tôi đã không thể tìm thấy một nơi mà giải thích gì git add *không. Tôi thậm chí đã xem trang git add man , nhưng nó không giúp được gì. Tôi đã sử dụng nó thay cho git add .và đồng nghiệp của tôi đã hỏi tôi tại sao. Tôi không có câu trả lời. Tôi đã luôn luôn sử dụng git add *.

git add .git add *giống nhau không? Một người chỉ thêm các tệp đã thay đổi từ thư mục hiện tại, trong khi người kia thêm các tệp từ thư mục hiện tại và các thư mục con (đệ quy)?

Có một biểu đồ tuyệt vời được liệt kê trên một trong những câu hỏi ngăn xếp khác cho thấy sự khác biệt giữa git add -A git add .git add -u, nhưng nó không có git add *.

nhập mô tả hình ảnh ở đây

Lưu ý: Tôi hiểu ý nghĩa của việc sử dụng dấu hoa thị làm ký tự đại diện (thêm tất cả các tệp có phần mở rộng nhất định). Ví dụ, git add *.htmlsẽ thêm tất cả các file mà có một .htmlphần mở rộng (nhưng bỏ qua .css, .js, vv).

Cảm ơn đã giúp đỡ!


1
Biểu đồ đó từ đâu? Tôi vừa thử git add .lại và nó sắp xếp một tệp đã xóa không có vấn đề gì, không giống như Xở hàng sẽ đề xuất.
David

@David Hình ảnh đó là từ câu trả lời này và áp dụng cho các phiên bản git cũ hơn.
jerry

4
Hình ảnh lỗi thời! Git 2.x thì khác: i.stack.imgur.com/KwOLu.jpg
Hannes Schneidermayer

Câu trả lời:


132

add *có nghĩa là thêm tất cả các tệp trong thư mục hiện tại, ngoại trừ các tệp có tên bắt đầu bằng dấu chấm. Đây là chức năng shell của bạn và Git chỉ nhận được một danh sách các tệp.

add . không có ý nghĩa đặc biệt trong trình bao của bạn, và do đó Git thêm toàn bộ thư mục một cách đệ quy, gần như giống nhau, nhưng bao gồm các tệp có tên bắt đầu bằng dấu chấm.


6
do đó, git add .thêm tất cả các tệp, thư mục và thư mục con, bao gồm .gitignore và bất kỳ thứ gì khác bắt đầu bằng dấu chấm, trong khi git add *sẽ thêm bất kỳ tệp, thư mục và thư mục con nào, ngoại trừ những tệp bắt đầu bằng dấu chấm? Điều đó có chính xác không?
Tyler Youngblood

9
Điều đó thực sự là chính xác. Ngoài ra, git add *vẫn sẽ thêm các tệp bắt đầu bằng dấu chấm nếu chúng nằm trong một thư mục con.
Denis

4
git add .cũng tôn trọng .gitignore, ngược lại git add *sẽ gây ra lỗi nếu bất kỳ tệp không phải là dấu chấm nào được gitignore. Tốt hơn nhiều để sử dụng git add .hơn git add *.
rosuav

2
Cần lưu ý: nếu gọi Git trên DOS / Windows từ CMD.EXE, thì Git , không phải shell, sẽ mở rộng *. Trong trường hợp này, Git sẽ tìm các tệp chấm.
torek

2
@ Thor84no: Git sẽ tìm thấy các tệp chấm ngay cả trên hệ thống Linux, nếu bạn trích dẫn *để bảo vệ nó khỏi trình bao. Nó không phải là vấn đề của bit ẩn, chỉ là các quy tắc được biên dịch trong Git khác nhau.
torek

30

*không phải là một phần của git - nó là một ký tự đại diện được giải thích bởi shell. *mở rộng đến tất cả các tệp trong thư mục hiện tại và chỉ sau đó được chuyển tới git, addlà tất cả chúng. .là chính thư mục hiện tại và git addviệc nhập nó sẽ thêm nó và tất cả các tệp bên dưới nó.


1
Vì vậy, sẽ có mọi lý do để sử dụng dấu hoa thị? Có lợi thế nào khi sử dụng nó thay vì một khoảng thời gian? Hoặc ngược lại? Tôi chắc rằng tôi đã thấy nó trong một hướng dẫn. Tôi sẽ không biết sử dụng nó nếu không. Tôi không phải là người thích dòng lệnh (như bạn chắc chắn đã đoán).
Tyler Youngblood

5
*tránh các tệp ẩn (nghĩa là các tệp có tên bắt đầu bằng a .). Trong mọi trường hợp, nếu bạn không thêm các tệp cụ thể, tôi chỉ sử dụng git add -u(hoặc git add -Anếu bạn đang tạo các tệp mới).
Mureinik

3
Vì cả hai bạn đều trả lời câu hỏi của tôi, tôi đã gặp khó khăn khi quyết định cấp tín dụng cho ai. Tôi chọn Denis bên dưới vì anh ấy có ít rep hơn bạn. Vì vậy, tôi nghĩ rằng việc đưa cho anh ta tấm séc xanh sẽ có lợi cho anh ta hơn là có lợi cho bạn. Tôi hy vọng điều đó đúng? Nhưng tôi thực sự đánh giá cao cả hai cách giải thích. Cảm ơn!
Tyler Youngblood

7

Sử dụng dấu chấm . trong shell thường có nghĩa là "thư mục hiện tại".

Khi bạn sử dụng dấu hoa thị *trên shell, một tính năng được gọi file-globbinglà sẽ được sử dụng. Ví dụ: trên bash hàm glob()đang làm điều đó. Trang chủ cho global ( man 7 glob) cho biết:

SỰ MIÊU TẢ

Long ago, in UNIX V6, there was a program /etc/glob that would expand 
wildcard patterns.  Soon afterward this became a shell built-in.
These days there is also a library routine glob(3) that will perform this 
function for a user program.

Đối sánh ký tự đại diện

A string is a wildcard pattern  if it contains one of the characters '?', '*' or '['. 

Bóng

Globbing is the operation that expands a wildcard pattern 
into the list of pathnames matching the pattern.

Điều đó có nghĩa khi bạn vượt qua các đối số cho bất kỳ chương trình trên dòng lệnh có chứa '?', '*'hoặc '[', globbing đầu tiên mở rộng mô hình ký tự đại diện vào một danh sách các tập tin và sau đó cung cấp cho những tập tin này như một tham số cho chương trình riêng của mình.

Sự khác biệt về ý nghĩa giữa 'git add .''git add *'được Denis mô tả rõ ràng :

git addmong đợi một danh sách các tệp được thêm vào. Trong ví dụ trên, shell mở rộng *hoặc .tương ứng và cho kết quả là một tham số để thêm git. Bây giờ, sự khác biệt là với git add .git sẽ mở rộng đến thư mục hiện tại trong khi git add *kích hoạt tập tin nhấp nháy và như vậy sẽ mở rộng sang tất cả các tệp và thư mục không bắt đầu bằng dấu chấm.


5

Để rõ ràng, tôi đặt câu trả lời trong bảng dưới đây:

nhập mô tả hình ảnh ở đây

Ghi chú bổ sung (lấy cảm hứng từ nhận xét @ reka18):

Lưu ý 1. git add -Agit add -u các lệnh được thực hiện mà không có tham số bổ sung sẽ được tinh chỉnh bổ sung (chỉ báo thư mục con hoặc mặt nạ cho tên tệp) hoạt động trong phạm vi của toàn bộ thư mục làm việc (cũng như nếu chúng ta thực hiện lệnh trong thư mục con đang làm việc của thư mục).

Lưu ý 2. Các .*lần lượt là đường dẫn thư mục (thư mục hiện tại) và ký tự đại diện, làm rõ đường dẫn của lệnh. Ví dụ: nếu lệnh git add .hoặc git add *được thực thi trong một số thư mục con của thư mục đang làm việc, thì hành động của chúng chỉ được sử dụng trong thư mục con này, không phải toàn bộ thư mục đang làm việc.

Lưu ý 3. Các lệnh git add -Agit add -ucó thể được tinh chỉnh thêm bằng cách thêm một đường dẫn hoặc mặt nạ cho tệp, ví dụ, git add -A app/controllershoặc git add -u app\styles\*.


2
Vì vậy, kể từ Git v2.x git add -Agit add .giống hệt nhau?
reka18

Cảm ơn bạn @ reka18, vì một câu hỏi rất hay. Nó đã truyền cảm hứng cho tôi để hoàn thành câu trả lời của mình ... Câu trả lời cho câu hỏi của bạn: Nếu bạn gọi nó trong thư mục làm việc thì không, nhưng nếu trong thư mục con thì có ( git add -Aáp dụng cho toàn bộ thư mục làm việc và git add .luôn là thư mục hiện tại).
simhumileco

2
  • git add -A (--all) Thêm mọi thứ, để mọi thứ trong thư mục của bạn trên đĩa được thể hiện trong khu vực tổ chức

  • git add . Thực hiện mọi thứ, nhưng không xóa các tệp đã bị xóa khỏi đĩa

  • git add * Phân giai đoạn mọi thứ, trừ các tệp bắt đầu bằng dấu chấm & không xóa các tệp đã bị xóa khỏi đĩa

  • git add -u (- cập nhật) Chỉ các tệp được sửa đổi theo giai đoạn, loại bỏ các tệp đã bị xóa khỏi đĩa, không thêm mới

  • git add <file name 1> <file name 2> Chỉ thêm (các) tệp nhất định

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.