Câu hỏi Sự khác biệt giữa "git add -A" và "git add."


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


2398
2018-02-21 06:51


gốc




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


Dành cho Phiên bản Git 2.x, xem câu trả lời bên dưới.


Tóm lược:

  • git add -A giai đoạn Tất cả các

  • git add . giai đoạn mới và sửa đổi, mà không bị xóa

  • git add -u các giai đoạn được sửa đổi và xóa, không có mới


Chi tiết:

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

Điểm quan trọng về git add . là nó nhìn vào cây đang hoạt động 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 -u nhìn vào tất cả đã theo dõi các tệp và các giai đoạn 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ỉ giai đoạn thay đổi các tập tin đã 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 với một cái gì đó như thế này (lưu ý rằng cho Git phiên bản 2.x đầu ra của bạn cho git add .  git status  sẽ khác nhau):

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

3658
2018-02-21 09:00



Làm thế nào về sự khác biệt giữa git add *? - Jared
@ Jared, thêm lời giải thích dấu hoa thị để trả lời câu hỏi của bạn - Geo
Để đơn giản, vui lòng xóa mọi thứ phía trên phần tóm tắt trong câu trả lời này. Nếu không, hãy di chuyển bản tóm tắt lên trên cùng. - maliayas
Để 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ố thứ hai là đườ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
@CharlesBailey, Git thực sự yêu làm cho mọi thứ phức tạp không có lý do chính đáng. Có cái nào không thực trường hợp sử dụng theo đó ai đó sẽ cần git add -u hoặc là git add . và bằng cách làm điều đó nó làm cho cuộc sống của mình dễ dàng hơn ngay cả sau khi tính thêm thuế tinh thần bổ sung để đả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 -u thành hai lệnh riêng biệt add -u1 và add-u2 theo đó, một tác phẩm cho các tệp bắt đầu bằng các chữ số và một cho các tệp bắt đầu bằng số không - Pacerier


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

Phiên bản Git 1.x: enter image description here

Phiên bản Git 2.x: enter image description here

Cờ dạng 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:


648
2017-09-25 12:45



Cảm ơn vì bảng. Có cách nào để chỉ thêm các tệp đã được sửa đổi hay không. Không có tệp mới hoặc tệp đã xóa - Gokul N K
@Gokul: Theo bài này, bạn có thể 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, chứ không phải các tệp mới hoặc các tệp đã xóa. - Ville
Điều này không hoàn toàn đúng, như git add . chỉ thêm các tệp mới trên đường dẫn hiện tại. I E. nếu bạn có một thư mục mới ../foo, git add -A sẽ giai đoạn nó, git add . sẽ không. - 0sh
Vì thế, git add . tương đương với git add -A ., tương đương với git add "*" - flow2k


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

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

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

git add giố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 thư mục có tên ":"!
Xem cam kết 29abb33 (25 tháng 10 năm 2015) bởi 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 bên trong cây đang hoạt động), bạn phải sử dụng '.'trong cái khác git add cũng như các lệnh.

Điêu đo co nghia la:

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

(Lưu ý thêm '.'cho git add -A và git add -u)

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

Những lệnh đó sẽ hoạt động trên toàn bộ cây trong Git 2.0 để phù hợp với "git commit -a"và các lệnh khác.   Bởi vì sẽ không có cơ chế để tạo ra "git add -u"cư xử 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) cập nhật chỉ mục chỉ cho các đường dẫn trong thư mục con hiện tại để bắt đầu đào tạo ngón tay của chúng để nói rõ ràng"git add -u ."khi họ có nghĩa là nó trước khi Git 2.0 đến.

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


136
2018-04-23 06:32



Cảm ơn các chi tiết về .. Đưa chúng vào biên soạn của tôi về add trên RU.SO. - Nick Volynkin
@NickVolynkin Thật tuyệt vời! 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 sự nhầm lẫn và mâu thuẫn. Có 26 bảng chữ cái và chúng đã có để sử dụng lại cờ đã được sử dụng. - Pacerier


Vì vậy, từ hướng dẫn của Charles ở trên, sau khi kiểm tra sự hiểu biết được đề xuất của tôi sẽ như sau:

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

Liên kết này cũng có thể hữu ích để hiểu được tình huống nào 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.


126
2018-06-01 09:27



điều này không còn đúng trong 2.0. thêm vào . bằng cách 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


Đến bữa tiệc muộn nhưng câu hỏi này cũng xứng đáng được trả lời nhanh hơn.

git add -A 

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

git add . 

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

git add -u 

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


27
2018-04-06 12:56



Xin chào, điều gì sẽ xảy ra nếu bạn chỉ muốn chỉnh sửa các tệp đã được sửa đổi? Bạn làm điều đó như thế nào? - TheGrapeBeyond
Xin chào, câu hỏi hay. Không có một lá cờ dễ dàng cho điều đó theo như tôi biết .. git diff-files -z --diff-filter = M -name-only | xargs -0 git thêm từ -> stackoverflow.com/questions/14368093/… - K. Kilian Lindberg
Thực ra nó là git add :/ + git add -u :/ - Nick Volynkin


Mọi thứ đã thay đổi với Git 2.0:

  • -A bây giờ là mặc định
  • hành vi cũ hiện có sẵn với --ignore-removal
  • git add -u và git add -A trong một 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 . và git add -A . thêm tập tin mới / sửa đổi / 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, hãy thêm tất cả các tệp trong dự án bất kể thư mục hiện tại

23
2017-10-13 15:29



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 vào'. '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


Cuối cùng tôi nghĩ rằng tôi nhận được điều này, rất cám ơn tất cả các bạn. 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)

Giới hạn 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 không nhìn thấy, các tệp được bắt đầu bằng dấu chấm, (dấu chấm) sẽ không bao giờ được Git tự động nhận ra. Họ thậm chí không bao giờ được liệt kê là 'không được theo dõi'.
  • Các thư mục trống không bao giờ được git thêm vào. Họ thậm chí không bao giờ được liệt kê là 'không được theo dõi'. (Cách giải quyết là thêm tệp trống, có thể ẩn, vào tệp được theo dõi.)
  • Trạng thái Git sẽ không hiển thị thông tin thư mục con, tức là các tệp không được 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 gian đó, git xem xét toàn bộ thư mục nằm ngoài phạm vi, a la 'trống'. Nó trống trong các mục được theo dõi.
  • Chỉ định tệp filespec = '.' (dấu chấm) hoặc thư mục hiện tại, không đệ quy trừ khi -A cũng được chỉ định. Dot đề cập nghiêm ngặt đến thư mục hiện tại - nó bỏ qua các đường dẫn 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 giới hạn như sau.

  • -u = --update = tập con để theo dõi tệp => Thêm = Không; Thay đổi = Có; Xóa = Có. => iff mục được theo dõi.
  • -A = --all (không có -a, cung cấp lỗi cú pháp) = superset của tất cả các tập tin không theo dõi / theo dõi, trừ khi trong Git <2.0, trong đó nếu dot filespec được đưa ra, thì chỉ có thư mục cụ thể đó được xem xét. => iff mục được nhận diện, git add -A sẽ tìm và thêm nó vào.

Pathspec như sau.

  • Trong Git <2.0, đối với hai bộ giới hạn (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),
  • Tuy nhiên, trong phiên bản 2.0, thao tác có thể bị hạn chế đối với đường dẫn hiện tại: chỉ cần thêm hậu tố chấm rõ ràng (cũng có giá trị trong Git <= 1.9);

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ỳ hunks / tập tin được thêm vào được tính trong trạng thái git.
  • 1A.Nếu bất kỳ mục nào bị thiếu, do tệp / thư mục vô hình, hãy thêm chúng một cách riêng biệt.
  • 2.Có một gitignore tốt để các tập tin thông thường chỉ quan tâm là untracked và / hoặc không được công nhận.
  • 3.Từ cấp cao nhất của repo, "git add -A" để thêm tất cả các mục. Điều này làm việc trong tất cả các phiên bản của git.
  • 4. Loại bỏ bất kỳ mục mong muốn nào khỏi chỉ mục nếu muốn.
  • 6.Nếu có lỗi lớn, hãy 'git reset' để xóa chỉ mục hoàn toàn.

11
2018-04-06 02:03





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

git add -A thêm tệp vào chỉ mục từ tất cả các thư mục trong cây đang hoạt động.

P.S .: thông tin liên quan đến Git 2.0.


7
2018-06-03 19:12