Jawaban:
Jawaban ini hanya berlaku untuk Git versi 1.x . Untuk Git versi 2.x, lihat jawaban lain.
Ringkasan:
git add -A
tahap semua perubahan
git add .
tahap file baru dan modifikasi, tanpa penghapusan
git add -u
tahap modifikasi dan penghapusan, tanpa file baru
Detail:
git add -A
setara dengan git add .; git add -u
.
Poin penting tentang git add .
ini adalah bahwa ia melihat pohon yang bekerja dan menambahkan semua jalan ke perubahan bertahap jika mereka baik diubah atau baru dan tidak diabaikan, itu tidak melakukan tindakan 'rm'.
git add -u
melihat semua file yang sudah dilacak dan melakukan tahapan perubahan pada file-file tersebut jika berbeda atau telah dihapus. Itu tidak menambahkan file baru, itu hanya tahap perubahan ke file yang sudah dilacak.
git add -A
adalah jalan pintas yang berguna untuk melakukan keduanya.
Anda dapat menguji perbedaan dengan sesuatu seperti ini (perhatikan bahwa untuk Git versi 2.x hasil keluaran Anda git add .
git status
akan berbeda):
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
tidak berfungsi seperti yang diharapkan (tanyakan secara interaktif tentang file yang tidak terlacak)
git add -A :/
ataugit add -A .
git add -u
telah menjadi git add -u :/
dengan parameter terakhir menjadi path, memungkinkan Anda untuk -u direktori tertentu, :/
menangani seluruh pohon.
git add -u
atau git add .
dan dengan melakukan itu membuat hidupnya lebih mudah bahkan setelah memperhitungkan pajak ekstra mental ditambahkan untuk memastikan bahwa tidak ada masalah sinkronisasi? Saya bertanya-tanya mengapa Git tidak memecah add -u
menjadi dua perintah terpisah add -u1
dan di add-u2
mana satu bekerja untuk file yang dimulai dengan angka dan yang lainnya untuk file yang dimulai dengan non-angka
Ini adalah tabel untuk pemahaman cepat:
Versi Git 1.x :
Git Versi 2.x :
Bendera bentuk panjang:
git add -A
setara dengan git add --all
git add -u
setara dengan git add --update
Bacaan lebih lanjut:
git add .
hanya menambahkan file baru yang ada di jalur saat ini. Yaitu jika Anda memiliki direktori baru ../foo
, git add -A
akan panggung itu, git add .
tidak akan.
git add .
sama dengan git add -A .
, yang setara dengangit add "*"
Dengan Git 2.0, git add -A
default: git add .
sama dengangit add -A .
.
git add <path>
sama dengan "git add -A <path>
" sekarang, sehingga "git add dir/
" akan melihat jalur yang Anda hapus dari direktori dan merekam penghapusan.
Dalam versi Git yang lebih lama, "git add <path>
" penghapusan yang diabaikan.Anda dapat mengatakan "
git add --ignore-removal <path>
" untuk menambahkan hanya jalur yang ditambahkan atau diubah<path>
, jika Anda benar-benar menginginkannya.
git add -A
seperti git add :/
( tambahkan semuanya dari folder top git repo ).
Perhatikan bahwa git 2.7 (November 2015) akan memungkinkan Anda untuk menambahkan folder bernama " :
"!
Lihat komit 29abb33 (25 Okt 2015) oleh Junio C Hamano ( gitster
) .
Perhatikan bahwa mulai git 2.0 (Q1 atau Q2 2014) , ketika berbicara tentang git add .
(jalur saat ini di dalam pohon kerja), Anda harus menggunakan ' .
' di git add
perintah lain juga.
Itu berarti:
"
git add -A .
" setara dengan "git add .; git add -u .
"
(Catat ekstra ' .
' untuk git add -A
dangit add -u
)
Karena git add -A
atau git add -u
akan beroperasi (mulai git 2.0 saja) di seluruh pohon kerja , dan bukan hanya di jalur saat ini.
Perintah-perintah itu akan beroperasi pada seluruh pohon di Git 2.0 untuk konsistensi dengan "
git commit -a
" dan perintah lain . Karena tidak akan ada mekanisme untuk membuat "git add -u
" berperilaku seolah-olah "git add -u .
", penting bagi mereka yang terbiasa "git add -u
" (tanpa pathspec) memperbarui indeks hanya untuk jalur di subdirektori saat ini untuk mulai melatih jari mereka untuk secara eksplisit mengatakan "git add -u .
"Ketika mereka bersungguh-sungguh sebelum Git 2.0 datang.Peringatan dikeluarkan ketika perintah ini dijalankan tanpa pathspec dan ketika Anda memiliki perubahan lokal di luar direktori saat ini , karena perilaku di Git 2.0 akan berbeda dari versi hari ini dalam situasi seperti itu.
Dari instruksi Charles , setelah menguji pengertian yang saya ajukan adalah sebagai berikut:
# 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
Posting blog ini mungkin juga membantu untuk memahami dalam situasi apa perintah-perintah itu dapat diterapkan: Menghapus File yang Dihapus dari Direktori Kerja Git Anda .
Berbagai hal berubah dengan Git 2.0 ( 2014-05-28 ):
-A
sekarang default--ignore-removal
.git add -u
dan git add -A
dalam subdirektori tanpa jalur pada baris perintah beroperasi di seluruh pohon.Jadi untuk Git 2 jawabannya adalah:
git add .
dan git add -A .
menambahkan file baru / yang dimodifikasi / dihapus dalam direktori saat inigit add --ignore-removal .
menambahkan file baru / yang dimodifikasi di direktori saat inigit add -u .
menambahkan file yang dimodifikasi / dihapus dalam direktori saat iniJawaban cepat yang lebih disaring:
git add -A
git add .
git add -u
git add :/
+git add -u :/
Di Git 2.x :
Jika Anda berlokasi langsung di direktori kerja , maka git add -A
dan git add .
bekerja tanpa perbedaan.
Jika Anda berada di subdirektori dari direktori kerja , git add -A
akan menambahkan semua file dari seluruh direktori kerja , dan git add .
akan menambahkan file dari direktori Anda saat ini .
Dan itu saja.
Saya harap ini dapat menambah kejelasan.
!The syntax is
git add <limiters> <pathspec>
! Aka
git add (nil/-u/-A) (nil/./pathspec)
Limiters mungkin -u atau -A atau nihil.
Pathspec mungkin berupa file path atau titik, '.' untuk menunjukkan direktori saat ini.
Pengetahuan latar belakang penting tentang bagaimana Git 'menambahkan':
-A
juga ditentukan. Dot hanya merujuk ke direktori saat ini - ia menghilangkan jalur yang ditemukan di atas dan di bawah.Sekarang, mengingat pengetahuan itu, kita dapat menerapkan jawaban di atas.
Limiters adalah sebagai berikut.
-u
= --update
= subset ke file yang dilacak => Tambah = Tidak; Ubah = Ya; Hapus = Ya. => jika item dilacak.-A
= --all
(tidak ada yang -a
, yang memberikan kesalahan sintaksis) = superset dari semua file yang tidak dilacak / dilacak, kecuali dalam Git sebelum 2.0, di mana jika dot filespec diberikan, maka hanya folder tertentu yang dipertimbangkan. => jika item dikenali, git add -A
akan menemukannya dan menambahkannya.Pathspec adalah sebagai berikut.
git add -A .
git add -u .
Kesimpulannya, kebijakan saya adalah:
git status
..gitignore
file yang sehingga biasanya hanya file yang menarik yang tidak terlacak dan / atau tidak dikenali.Keduanya git add .
dangit add -A
akan menampilkan semua file baru, yang dimodifikasi dan dihapus dalam versi Git yang lebih baru.
Perbedaannya adalah bahwa git add -A
file tahap dalam "lebih tinggi, saat ini dan subdirektori" milik repositori Git Anda yang berfungsi. Tetapi melakukan git add .
hanya tahapan file dalam direktori saat ini dan subdirektori mengikutinya ( tidak file yang berada di luar, yaitu direktori yang lebih tinggi).
Ini sebuah contoh:
/my-repo
.git/
subfolder/
nested-file.txt
rootfile.txt
Jika direktori kerja Anda saat ini adalah /my-repo
, dan Anda melakukannya rm rootfile.txt
, kemudian cd subfolder
, diikuti oleh git add .
, maka itu tidak akan mem-stage file yang dihapus. Tetapi melakukan git add -A
tentu akan melakukan perubahan ini di mana pun Anda melakukan perintah.
Itu -A
pilihan menambahkan, memodifikasi, dan menghapus entri indeks untuk mencocokkan pohon bekerja.
Dalam Git 2, -A
opsi sekarang menjadi default.
Ketika a .
ditambahkan yang membatasi ruang lingkup pembaruan ke direktori Anda saat ini, sesuai dengan dokumentasi Git
Jika tidak
<pathspec>
diberikan ketika opsi -A digunakan, semua file di seluruh pohon kerja diperbarui (Git versi lama digunakan untuk membatasi pembaruan ke direktori saat ini dan subdirektori).
Satu hal yang akan saya tambahkan adalah bahwa jika mode --interactive
atau -p
digunakan maka git add
akan berperilaku seolah-olah -u
bendera pembaruan ( ) digunakan dan tidak menambahkan file baru.
git add *
?