Câu trả lời:
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 -A
giai đ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 -u
giai đoạn sửa đổi và xóa, không có tập tin mới
Chi tiết:
git add -A
tươ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 -u
xem 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
git add -A -p
khô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)
git add -A :/
hoặcgit add -A .
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.
git add -u
hoặ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 -u
thành hai lệnh riêng biệt add -u1
và add-u2
theo đó 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
Đây là một bảng để hiểu nhanh:
Phiên bản Git 1.x :
Phiên bản Git 2.x :
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:
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.
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 -A
sẽ giai đoạn nó, git add .
sẽ không.
git add .
tương đương với git add -A .
, tương đương vớigit add "*"
Với Git 2.0, git add -A
là 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 -A
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 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 add
lệ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 -A
và git add -u
)
Bởi vì git add -A
hoặc git add -u
sẽ 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.
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 .
Mọi thứ đã thay đổi với Git 2.0 ( 2014-05-28 ):
-A
bây giờ là mặc định--ignore-removal
.git add -u
và git add -A
trong 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 các tập tin mới / sửa đổi / bị xóa trong thư mục hiện tạigit add --ignore-removal .
thêm tập tin mới / sửa đổi trong thư mục hiện tạigit add -u .
thêm các tập tin sửa đổi / xóa trong thư mục hiện tạiMột câu trả lời nhanh hơn được chắt lọc:
git add -A
git add .
git add -u
git add :/
+git add -u :/
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 -A
và git 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 -A
sẽ thêm tất cả các tệp từ toàn bộ thư mục làm việc và git 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ả.
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':
-A
cũ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 -A
sẽ tìm thấy nó và thêm nó.Pathspec như sau.
git add -A .
git add -u .
Tóm lại, chính sách của tôi là:
git status
..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.Cả hai git add .
và git add -A
sẽ 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 -A
cá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 -A
chắ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.
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, -A
tù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ế độ --interactive
hoặc -p
được sử dụng thì nó git add
sẽ hoạt động như thể -u
cờ update ( ) đã được sử dụng và không thêm các tệp mới.
git add *
?