Perbedaan antara "git add -A" dan "git add."

2918

Perintah itu git add [--all|-A]tampaknya identik dengan git add .. Apakah ini benar? Jika tidak, apa bedanya?

cmcginty
sumber

Jawaban:

4242

Jawaban ini hanya berlaku untuk Git versi 1.x . Untuk Git versi 2.x, lihat jawaban lain.


Ringkasan:

  • git add -Atahap semua perubahan

  • git add .tahap file baru dan modifikasi, tanpa penghapusan

  • git add -utahap modifikasi dan penghapusan, tanpa file baru


Detail:

git add -Asetara 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 -umelihat 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
CB Bailey
sumber
41
Bagaimana dengan perbedaan antara git add *?
Jared
3
terlalu buruk git add -A -ptidak berfungsi seperti yang diharapkan (tanyakan secara interaktif tentang file yang tidak terlacak)
Erik Kaplun
2
Harap perbarui jawabannya. Seharusnya: git add -A :/ataugit add -A .
Gabriel Llamas
5
Sebagai informasi, dalam versi git yang lebih baru git add -utelah menjadi git add -u :/dengan parameter terakhir menjadi path, memungkinkan Anda untuk -u direktori tertentu, :/menangani seluruh pohon.
Brizee
15
@CharlesBailey, Git sangat suka membuat hal-hal rumit tanpa alasan. Apakah ada kasus penggunaan nyata di mana seseorang akan secara khusus membutuhkan git add -uatau 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 -umenjadi dua perintah terpisah add -u1dan di add-u2mana satu bekerja untuk file yang dimulai dengan angka dan yang lainnya untuk file yang dimulai dengan non-angka
Pacerier
946

Ini adalah tabel untuk pemahaman cepat:

Versi Git 1.x :

Masukkan deskripsi gambar di sini

Git Versi 2.x :

Masukkan deskripsi gambar di sini

Bendera bentuk panjang:

  • git add -A setara dengan git add --all
  • git add -u setara dengan git add --update

Bacaan lebih lanjut:

Pengembang
sumber
1
Terima kasih untuk tabelnya. Apakah ada cara untuk menambahkan hanya file yang sudah dimodifikasi. Tidak ada file baru atau file yang dihapus
Gokul NK
3
@ Gokul: Menurut pos ini , Anda dapat menggunakan git diff-files -z --diff-filter=M --name-only | xargs -0 git adduntuk hanya menambahkan file yang dimodifikasi, tetapi tidak pada file baru atau penghapusan.
Ville
93
Ini tidak sepenuhnya benar, karena git add .hanya menambahkan file baru yang ada di jalur saat ini. Yaitu jika Anda memiliki direktori baru ../foo, git add -Aakan panggung itu, git add .tidak akan.
Milo Wielondek
2
Jadi, git add .sama dengan git add -A ., yang setara dengangit add "*"
flow2k
Saya masih bingung tentang git add "*", bisakah Anda menjelaskannya sedikit lagi?
HS Umer farooq
176

Dengan Git 2.0, git add -Adefault: 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 -Aseperti 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 addperintah lain juga.

Itu berarti:

" git add -A ." setara dengan " git add .; git add -u ."

(Catat ekstra ' .' untuk git add -Adangit add -u )

Karena git add -Aatau git add -uakan 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.

VONC
sumber
3
@NickVolynkin Bagus sekali! Senang melihat komunitas internasional SO bekerja sebagaimana dimaksud. Untuk referensi: ru.stackoverflow.com/a/431840
VonC
@VonC, Bagus, orang-orang Git sebenarnya punya pipi untuk mengatakan pembaruan mereka akan "membuat semuanya lebih konsisten". Apa yang mereka lakukan adalah menciptakan lebih banyak kebingungan dan ketidakkonsistenan. Ada 26 huruf dan mereka harus menggunakan kembali bendera yang sudah digunakan.
Pacerier
136

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 .

Richard
sumber
6
ini tidak lagi benar di 2.0. Menambahkan . sama dengan menambahkan -A untuk jalur yang sama, satu-satunya perbedaan adalah jika ada file baru di jalur lain dari pohon itu
Claudiu Creanga
41

Berbagai hal berubah dengan Git 2.0 ( 2014-05-28 ):

  • -A sekarang default
  • Perilaku lama sekarang tersedia dengan --ignore-removal.
  • git add -udan git add -Adalam 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 ini
  • git add --ignore-removal . menambahkan file baru / yang dimodifikasi di direktori saat ini
  • git add -u . menambahkan file yang dimodifikasi / dihapus dalam direktori saat ini
  • Tanpa titik, tambahkan semua file dalam proyek terlepas dari direktori saat ini.
0xF
sumber
4
Saya pikir ini tidak benar. Menggunakan git v2.10.windows.2 'git add' mengembalikan 'Tidak ada yang ditentukan, tidak ada yang ditambahkan'. 'git add -A' menambahkan semua file yang diubah. Yang menunjukkan '-A' bukan default.
Neutrino
34

Jawaban cepat yang lebih disaring:

Apakah keduanya di bawah ini (sama seperti git add --all )

git add -A

Tahapan + file baru yang dimodifikasi

git add .

Tahapan dimodifikasi + dihapus file

git add -u
K. Kilian Lindberg
sumber
5
Halo, bagaimana jika Anda hanya ingin memformat file yang dimodifikasi saja? Bagaimana Anda akan melakukannya?
TheGrapeBeyond
2
Halo, pertanyaan yang bagus. Tidak ada flag yang mudah untuk itu sejauh yang saya tahu .. git diff-files -z --diff-filter = M --name-only | xargs -0 git add from -> stackoverflow.com/questions/14368093/...
K. Kilian Lindberg
2
Sebenarnya ini git add :/+git add -u :/
Nick Volynkin
27

Di Git 2.x :

  • Jika Anda berlokasi langsung di direktori kerja , maka git add -Adan git add .bekerja tanpa perbedaan.

  • Jika Anda berada di subdirektori dari direktori kerja , git add -Aakan menambahkan semua file dari seluruh direktori kerja , dan git add .akan menambahkan file dari direktori Anda saat ini .

Dan itu saja.

simhumileco
sumber
12

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':

  • File yang tak terlihat, file yang diawali dengan titik, (titik file) tidak pernah secara otomatis dikenali oleh Git. Mereka bahkan tidak pernah terdaftar sebagai 'tidak terlacak'.
  • Folder kosong tidak pernah ditambahkan oleh Git. Mereka bahkan tidak pernah terdaftar sebagai 'tidak terlacak'. (Solusinya adalah menambahkan file kosong, mungkin tidak terlihat, ke file yang dilacak.)
  • Status Git tidak akan menampilkan informasi subfolder, yaitu file yang tidak dilacak, kecuali setidaknya satu file dalam subfolder dilacak. Sebelum waktu seperti itu, Git menganggap seluruh folder di luar ruang lingkup, ala 'kosong'. Itu kosong dari item yang dilacak.
  • Menentukan filespec = '.' (titik), atau direktori saat ini, tidak bersifat rekursif kecuali jika -Ajuga 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 -Aakan menemukannya dan menambahkannya.

Pathspec adalah sebagai berikut.

  • Di Git sebelum 2.0, untuk dua pembatas (pembaruan dan semua), default baru adalah untuk beroperasi di seluruh pohon kerja, alih-alih jalur saat ini (Git 1.9 atau sebelumnya),
  • Namun, dalam v2.0, operasi dapat dibatasi ke jalur saat ini: cukup tambahkan sufiks titik eksplisit (yang juga berlaku di Git 1.9 atau sebelumnya);

git add -A .

git add -u .

Kesimpulannya, kebijakan saya adalah:

  1. Pastikan semua bakhil / file yang akan ditambahkan dicatat di git status.
  2. Jika ada barang yang hilang, karena file / folder tidak terlihat, tambahkan secara terpisah.
  3. Selamat menunaikan .gitignore file yang sehingga biasanya hanya file yang menarik yang tidak terlacak dan / atau tidak dikenali.
  4. Dari tingkat atas repositori, "git add -A" untuk menambahkan semua item. Ini berfungsi di semua versi Git.
  5. Hapus item yang diinginkan dari indeks jika diinginkan.
  6. Jika ada bug besar, lakukan 'git reset' untuk menghapus seluruh indeks.
AnneTheAgile
sumber
12

git add .sama dengan git add -A .menambahkan file ke indeks hanya dari folder saat ini dan anak-anak.

git add -A menambahkan file ke indeks dari semua folder di pohon kerja.

PS: informasi berhubungan dengan Git 2.0 (2014-05-28).

Alex78191
sumber
9

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 -Afile 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 -Atentu akan melakukan perubahan ini di mana pun Anda melakukan perintah.

sbr_amd
sumber
3

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 --interactiveatau -pdigunakan maka git addakan berperilaku seolah-olah -ubendera pembaruan ( ) digunakan dan tidak menambahkan file baru.

Yehuda Schwartz
sumber