Sự khác biệt giữa Add git add -A cộng và thêm git add.


2918

Lệnh git add [--all|-A]dường như giống hệt với git add .. Điều này có đúng không? Nếu không, chúng khác nhau như thế nào?

Câu trả lời:


4241

Câu trả lời này chỉ áp dụng cho Git phiên bản 1.x . Đối với phiên bản Git 2.x, xem các câu trả lời khác.


Tóm lược:

  • git add -Agiai đoạn tất cả thay đổi

  • git add .giai đoạn tập tin mới và sửa đổi, mà không cần xóa

  • git add -ugiai đoạn sửa đổi và xóa, không có tập tin mới


Chi tiết:

git add -Atương đương với git add .; git add -u.

Điểm quan trọng git add .là nó nhìn vào cây làm việc và thêm tất cả các đường dẫn đó vào các thay đổi theo giai đoạn nếu chúng được thay đổi hoặc là mới và không bị bỏ qua, nó không thực hiện bất kỳ hành động 'rm' nào.

git add -uxem xét tất cả các tệp đã được theo dõi và thực hiện các thay đổi đối với các tệp đó nếu chúng khác nhau hoặc nếu chúng đã bị xóa. Nó không thêm bất kỳ tập tin mới, nó chỉ thay đổi các tập tin đã được theo dõi.

git add -A là một phím tắt tiện dụng để làm cả hai.

Bạn có thể kiểm tra sự khác biệt bằng một cái gì đó như thế này (lưu ý rằng đối với phiên bản Git 2.x, kết quả đầu ra của bạn git add . git status sẽ khác):

git init
echo Change me > change-me
echo Delete me > delete-me
git add change-me delete-me
git commit -m initial

echo OK >> change-me
rm delete-me
echo Add me > add-me

git status
# Changed but not updated:
#   modified:   change-me
#   deleted:    delete-me
# Untracked files:
#   add-me

git add .
git status

# Changes to be committed:
#   new file:   add-me
#   modified:   change-me
# Changed but not updated:
#   deleted:    delete-me

git reset

git add -u
git status

# Changes to be committed:
#   modified:   change-me
#   deleted:    delete-me
# Untracked files:
#   add-me

git reset

git add -A
git status

# Changes to be committed:
#   new file:   add-me
#   modified:   change-me
#   deleted:    delete-me

41
Làm thế nào về sự khác biệt giữa git add *?
Jared

3
quá tệ git add -A -pkhông hoạt động như người ta mong đợi (hỏi tương tác về các tệp không bị theo dõi)
Erik Kaplun

2
Hãy cập nhật câu trả lời. Nó phải là: git add -A :/hoặcgit add -A .
Gabriel Llamas

5
Để biết thông tin, trong các phiên bản mới hơn của git git add -uđã trở thành git add -u :/với tham số sau là một đường dẫn, cho phép bạn -u một số thư mục nhất định, :/xử lý toàn bộ cây.
Brizee

15
@CharlesBailey, Git thực sự thích làm cho mọi thứ trở nên phức tạp mà không có lý do chính đáng. Có một trường hợp sử dụng thực sự theo đó ai đó sẽ đặc biệt cần git add -uhoặc git add .bằng cách đó làm cho cuộc sống của anh ta dễ dàng hơn ngay cả sau khi tính thêm thuế tinh thần để đảm bảo rằng không có vấn đề đồng bộ hóa? Tôi tự hỏi tại sao Git không phân chia add -uthành hai lệnh riêng biệt add -u1add-u2theo đó một lệnh hoạt động cho các tệp bắt đầu bằng chữ số và lệnh còn lại cho các tệp bắt đầu bằng số không
Pacerier

946

Đây là một bảng để hiểu nhanh:

Phiên bản Git 1.x :

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

Phiên bản Git 2.x :

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

Cờ dài:

  • git add -A tương đương với git add --all
  • git add -u tương đương với git add --update

Đọc thêm:


1
Cảm ơn vì bàn. Có cách nào để chỉ thêm các tệp đã được sửa đổi. Không có tệp mới hoặc tệp bị xóa
Gokul NK

3
@Gokul: Theo bài đăng này , bạn có thể sử dụng git diff-files -z --diff-filter=M --name-only | xargs -0 git addđể chỉ thêm các tệp đã sửa đổi, nhưng không phải là các tệp mới hoặc xóa.
Ville

93
Điều này không hoàn toàn đúng, vì git add .chỉ thêm các tệp mới trên đường dẫn hiện tại. Tức là nếu bạn có một thư mục mới ../foo, git add -Asẽ giai đoạn nó, git add .sẽ không.
Milo Wielondek 6/07/2015

2
Vì vậy, git add .tương đương với git add -A ., tương đương vớigit add "*"
Flow2k

Tôi vẫn còn nhầm lẫn về git add "*", bạn có thể vui lòng giải thích thêm chút nữa không?
HS Umer farooq

176

Với Git 2.0, git add -Alà mặc định: git add .bằnggit add -A . .

git add <path>giống như " git add -A <path>" bây giờ, do đó " git add dir/" sẽ thông báo các đường dẫn bạn đã xóa khỏi thư mục và ghi lại việc xóa.
Trong các phiên bản cũ hơn của Git, " git add <path>" bỏ qua.

Bạn có thể nói " git add --ignore-removal <path>" để chỉ thêm các đường dẫn được thêm hoặc sửa đổi <path>, nếu bạn thực sự muốn.

git add -Agiống như git add :/( thêm mọi thứ từ thư mục git repo hàng đầu ).
Lưu ý rằng git 2.7 (tháng 11 năm 2015) sẽ cho phép bạn thêm một thư mục có tên " :"!
Xem cam kết 29abb33 (ngày 25 tháng 10 năm 2015) của Junio ​​C Hamano ( gitster) .


Lưu ý rằng bắt đầu git 2.0 (Q1 hoặc Q2 2014) , khi nói về git add .(đường dẫn hiện tại trong cây làm việc), bạn cũng phải sử dụng ' .' trong các git addlệnh khác .

Điều đó có nghĩa là:

" git add -A ." tương đương với " git add .; git add -u ."

(Lưu ý thêm ' .' cho git add -Agit add -u)

Bởi vì git add -Ahoặc git add -usẽ hoạt động (chỉ bắt đầu git 2.0) trên toàn bộ cây làm việc , và không chỉ trên đường dẫn hiện tại.

Các lệnh đó sẽ hoạt động trên toàn bộ cây trong Git 2.0 để thống nhất với " git commit -a" và các lệnh khác . Bởi vì sẽ không có cơ chế để làm cho " git add -u" hoạt động như thể " git add -u .", điều quan trọng đối với những người đã quen với " git add -u" (không có pathspec) chỉ cập nhật chỉ mục cho các đường dẫn trong thư mục con hiện tại để bắt đầu huấn luyện ngón tay của họ để nói rõ ràng " git add -u ."Khi họ có ý đó trước khi Git 2.0 xuất hiện.

Một cảnh báo được đưa ra khi các lệnh này được chạy mà không có pathspec và khi bạn có các thay đổi cục bộ bên ngoài thư mục hiện tại , vì hành vi trong Git 2.0 sẽ khác với phiên bản ngày nay trong tình huống như vậy.


3
@NickVolynkin Thật tuyệt! Vui mừng khi thấy cộng đồng quốc tế của SO làm việc như dự định. Để tham khảo: ru.stackoverflow.com/a/431840
VonC

@VonC, Nice, những người Git thực sự có má để nói rằng bản cập nhật của họ sẽ "làm cho mọi thứ phù hợp hơn". Những gì họ đã làm được tạo ra nhiều nhầm lẫn và mâu thuẫn. Có 26 bảng chữ cái và họ phải sử dụng lại một lá cờ đã được sử dụng.
Pacerier

136

Từ hướng dẫn của Charles , sau khi thử nghiệm, sự hiểu biết được đề xuất của tôi sẽ như sau:

# For the next commit
$ git add .   # Add only files created/modified to the index and not those deleted
$ git add -u  # Add only files deleted/modified to the index and not those created
$ git add -A  # Do both operations at once, add to all files to the index

Bài đăng trên blog này cũng có thể hữu ích để hiểu trong tình huống nào các lệnh đó có thể được áp dụng: Xóa các tệp đã xóa khỏi Thư mục làm việc Git của bạn .


6
Điều này không còn đúng trong 2.0. thêm vào . Bằng với thêm -A cho cùng một đường dẫn, sự khác biệt duy nhất là nếu có các tệp mới trong các đường dẫn khác của cây
Claudiu Creanga

41

Mọi thứ đã thay đổi với Git 2.0 ( 2014-05-28 ):

  • -A bây giờ là mặc định
  • Các hành vi cũ bây giờ có sẵn với --ignore-removal.
  • git add -ugit add -Atrong thư mục con không có đường dẫn trên dòng lệnh hoạt động trên toàn bộ cây.

Vì vậy, đối với Git 2, câu trả lời là:

  • git add .git add -A .thêm các tập tin mới / sửa đổi / bị xóa trong thư mục hiện tại
  • git add --ignore-removal . thêm tập tin mới / sửa đổi trong thư mục hiện tại
  • git add -u . thêm các tập tin sửa đổi / xóa trong thư mục hiện tại
  • Không có dấu chấm, thêm tất cả các tệp trong dự án bất kể thư mục hiện tại.

4
Tôi không nghĩ rằng điều này là chính xác. Sử dụng git v2.10.windows.2 'git add' trả về 'Không có gì được chỉ định, không có gì được thêm'. 'git add -A' thêm tất cả các tệp đã thay đổi. Điều này cho thấy '-A' không phải là mặc định.
Neutrino

34

Một câu trả lời nhanh hơn được chắt lọc:

Có cả hai bên dưới (giống như git add --all )

git add -A

Các giai đoạn tập tin mới + sửa đổi

git add .

Các giai đoạn sửa đổi + xóa các tập tin

git add -u

5
Xin chào, nếu bạn chỉ muốn giai đoạn chỉ sửa đổi các tập tin? Bạn làm điều đó như thế nào?
TheGrapeBeyond

2
Xin chào, câu hỏi hay. Theo tôi biết thì không có cờ dễ dàng như vậy .. git diff-files -z --diff-filter = M --name-only | xargs -0 git thêm từ -> stackoverflow.com/questions/14368093/iêu
K. Kilian Lindberg

2
Trên thực tế, đó là git add :/+git add -u :/
Nick Volynkin 24/07/2015

27

Trong Git 2.x :

  • Nếu bạn được đặt trực tiếp tại thư mục làm việc , sau đó git add -Agit add .làm việc mà không có sự khác biệt.

  • Nếu bạn đang ở trong bất kỳ thư mục con nào của thư mục làm việc , git add -Asẽ thêm tất cả các tệp từ toàn bộ thư mục làm việcgit add .sẽ thêm các tệp từ thư mục hiện tại của bạn .

Và đó là tất cả.


12

Tôi hy vọng điều này có thể thêm một số rõ ràng hơn.

!The syntax is
git add <limiters> <pathspec>
! Aka
git add (nil/-u/-A) (nil/./pathspec)

Bộ hạn chế có thể là -u hoặc -A hoặc nil.

Pathspec có thể là một filepath hoặc dấu chấm, '.' để chỉ ra thư mục hiện tại.

Kiến thức nền tảng quan trọng về cách Git 'thêm':

  • Các tệp vô hình, những tệp có tiền tố có dấu chấm, (dotfiles) không bao giờ được Git tự động nhận ra. Chúng thậm chí không bao giờ được liệt kê là "không bị theo dõi".
  • Thư mục trống không bao giờ được thêm bởi Git. Chúng thậm chí không bao giờ được liệt kê là "không bị theo dõi". (Cách giải quyết là thêm một tệp trống, có thể là vô hình, vào các tệp được theo dõi.)
  • Trạng thái Git sẽ không hiển thị thông tin thư mục con, nghĩa là các tệp không bị theo dõi, trừ khi ít nhất một tệp trong thư mục con đó được theo dõi. Trước thời điểm đó, Git xem xét toàn bộ thư mục ngoài phạm vi, là một 'trống rỗng'. Nó là trống rỗng của các mục theo dõi.
  • Chỉ định tệp filespec = '.' (dấu chấm), hoặc thư mục hiện tại, không được đệ quy trừ khi -Acũng được chỉ định. Dot đề cập đúng đến thư mục hiện tại - nó bỏ qua các đường dẫn được tìm thấy ở trên và bên dưới.

Bây giờ, với kiến ​​thức đó, chúng ta có thể áp dụng các câu trả lời ở trên.

Các bộ hạn chế như sau.

  • -u= --update= tập hợp con cho các tệp được theo dõi => Thêm = Không; Thay đổi = Có; Xóa = Có. => nếu mục được theo dõi.
  • -A= --all(không có -a, điều này gây ra lỗi cú pháp) = superset của tất cả các tệp không được theo dõi / theo dõi, trừ khi trong Git trước 2.0, trong đó nếu tệp dotp được đưa ra, thì chỉ xem xét thư mục cụ thể đó. => nếu mục được nhận dạng, git add -Asẽ tìm thấy nó và thêm nó.

Pathspec như sau.

  • Trong Git trước 2.0, đối với hai bộ hạn chế (cập nhật và tất cả), mặc định mới là hoạt động trên toàn bộ cây làm việc, thay vì đường dẫn hiện tại (Git 1.9 trở về trước),
  • Tuy nhiên, trong v2.0, thao tác có thể được giới hạn trong đường dẫn hiện tại: chỉ cần thêm hậu tố dấu chấm rõ ràng (cũng hợp lệ trong Git 1.9 trở về trước);

git add -A .

git add -u .

Tóm lại, chính sách của tôi là:

  1. Đảm bảo bất kỳ hunk / tập tin được thêm vào được tính vào git status.
  2. Nếu bất kỳ mục nào bị thiếu, do các tệp / thư mục vô hình, hãy thêm chúng một cách riêng biệt.
  3. Có tốt .gitignore tệp để thông thường chỉ các tệp quan tâm không bị theo dõi và / hoặc không được nhận dạng.
  4. Từ cấp cao nhất của kho lưu trữ, "git add -A" để thêm tất cả các mục. Điều này hoạt động trong tất cả các phiên bản của Git.
  5. Loại bỏ bất kỳ mục mong muốn từ chỉ mục nếu muốn.
  6. Nếu có một lỗi lớn, hãy thực hiện 'git reset' để xóa hoàn toàn chỉ mục.

12

git add . bằng git add -A . thêm các tệp vào chỉ mục từ các thư mục hiện tại và trẻ em.

git add -A thêm tập tin vào chỉ mục từ tất cả các thư mục trong cây làm việc.

PS: thông tin liên quan đến Git 2.0 (2014-05-28).


9

Cả hai git add .git add -Asẽ giai đoạn tất cả các tệp mới, sửa đổi và xóa trong các phiên bản mới hơn của Git.

Sự khác biệt là git add -Acác tập tin giai đoạn trong "cao hơn, hiện tại và thư mục con" thuộc về kho Git đang hoạt động của bạn. Nhưng thực hiện một git add .tập tin giai đoạn duy nhất trong thư mục hiện tại và thư mục con theo sau nó ( không phải các tập tin nằm bên ngoài, tức là các thư mục cao hơn).

Đây là một ví dụ:

/my-repo
  .git/
  subfolder/
    nested-file.txt
  rootfile.txt

Nếu thư mục làm việc hiện tại của bạn là /my-repo, và bạn làm rm rootfile.txt, sau đó cd subfolder, theo sau git add ., thì nó sẽ không xử lý tệp bị xóa. Nhưng làm git add -Achắc chắn sẽ tạo ra sự thay đổi này bất kể bạn thực hiện lệnh từ đâu.


3

Các -A tùy chọn bổ sung, sửa đổi, và loại bỏ các mục chỉ số để phù hợp với cây làm việc.

Trong Git 2, -Atùy chọn này là mặc định.

Khi một .bổ sung được giới hạn phạm vi cập nhật cho thư mục bạn hiện đang ở, theo tài liệu Git

Nếu không <pathspec>được đưa ra khi tùy chọn -A được sử dụng, tất cả các tệp trong toàn bộ cây làm việc sẽ được cập nhật (các phiên bản cũ của Git được sử dụng để giới hạn cập nhật vào thư mục hiện tại và các thư mục con của nó).

Một điều mà tôi muốn thêm là nếu chế độ --interactivehoặc -pđược sử dụng thì nó git addsẽ hoạt động như thể -ucờ update ( ) đã được sử dụng và không thêm các tệp mớ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.