git add * (tanda bintang) vs git add. (Titik)

130

Saya baru mengenal git dan saya memiliki pertanyaan tentang menambahkan file di git. Saya telah menemukan beberapa pertanyaan stackoverflow tentang perbedaan antara git add .dan git add -a, git add --all, git add -A, dll Tapi saya sudah tidak dapat menemukan tempat yang menjelaskan apa yang git add *dilakukannya. Saya bahkan telah melihat halaman manual git add , tetapi tidak membantu. Saya telah menggunakannya sebagai pengganti git add .dan rekan kerja saya bertanya mengapa. Saya tidak punya jawaban. Saya selalu menggunakan git add *.

Apakah git add .dan git add *sama? Apakah yang satu menambahkan file yang diubah dari direktori saat ini saja, sementara yang lain menambahkan file dari direktori dan subdirektori saat ini (secara rekursif)?

Ada bagan bagus yang tercantum di salah satu pertanyaan tumpukan lainnya yang menunjukkan perbedaan antara git add -A git add .dan git add -u, tetapi tidak ada git add *.

masukkan deskripsi gambar di sini

Catatan: Saya mengerti apa artinya menggunakan asterisk sebagai wildcard (tambahkan semua file dengan ekstensi yang diberikan). Sebagai contoh, git add *.htmlakan menambahkan semua file yang memiliki .htmlekstensi (tetapi mengabaikan .css, .js, dll).

Terima kasih untuk bantuannya!

Tyler Youngblood
sumber
1
Dari mana grafik itu? Saya baru saja mencoba git add .lagi, dan file terhapus tidak ada masalah, tidak seperti Xyang disarankan di baris itu.
David
@David Gambar itu berasal dari jawaban ini dan berlaku untuk versi git yang lebih lama.
jerigen
4
Gambar sudah usang! Git 2.x berbeda: i.stack.imgur.com/KwOLu.jpg
Hannes Schneidermayer

Jawaban:

132

add *berarti menambahkan semua file di direktori saat ini, kecuali file yang namanya dimulai dengan titik. Ini adalah fungsi shell Anda dan Git hanya menerima daftar file.

add . tidak memiliki arti khusus di shell Anda, sehingga Git menambahkan seluruh direktori secara rekursif, yang hampir sama, tetapi termasuk file yang namanya dimulai dengan titik.

Denis
sumber
6
jadi git add .tambahkan semua file, folder, dan subfolder, termasuk .gitignore dan apa pun yang dimulai dengan titik, sementara git add *akan menambahkan file, folder, dan subfolder, kecuali yang dimulai dengan titik? Apakah itu akurat?
Tyler Youngblood
9
Itu memang benar. Selain itu, git add *akan tetap menambahkan file yang dimulai dengan titik jika berada dalam subdirektori.
Denis
4
git add .juga menghormati .gitignore, sedangkan git add *akan memunculkan kesalahan jika ada file non-dot yang gitignored. Jauh lebih baik untuk digunakan git add .daripada git add *.
rosuav
2
Perlu diperhatikan: jika menjalankan Git di DOS / Windows dari CMD.EXE, Git , bukan shell, yang memperluas file *. Dalam hal ini Git akan menemukan file-dot.
Torek
2
@ Thor84no: Git akan menemukan file-dot bahkan di sistem Linux, jika Anda mengutip *untuk melindunginya dari shell. Ini bukan masalah bit yang tersembunyi, hanya saja aturan yang dikompilasi Git berbeda.
torek
30

*bukan bagian dari git - ini adalah karakter pengganti yang ditafsirkan oleh shell. *memperluas ke semua file di direktori saat ini, dan hanya kemudian diteruskan ke git, yang addsemuanya. .adalah direktori saat ini itu sendiri, dan git additu akan menambahkannya dan semua file di bawahnya.

Mureinik
sumber
1
Jadi, apakah ada alasan untuk menggunakan tanda bintang? Apakah ada keuntungan untuk menggunakannya sebagai pengganti titik? Atau sebaliknya? Saya yakin saya melihatnya di tutorial. Saya tidak akan tahu untuk menggunakannya sebaliknya. Saya bukan orang yang suka menggunakan baris perintah (seperti yang sudah Anda duga).
Tyler Youngblood
5
*menghindari file tersembunyi (yaitu, file yang namanya dimulai dengan a .). Bagaimanapun, jika Anda tidak menambahkan file tertentu, saya hanya akan menggunakan git add -u(atau git add -Ajika Anda membuat file baru).
Mureinik
3
Karena Anda berdua menjawab pertanyaan saya, saya kesulitan memutuskan kepada siapa harus memberi penghargaan. Saya memilih Denis di bawah karena dia memiliki reputasi yang lebih sedikit dari Anda. Jadi kupikir memberinya cek hijau akan lebih menguntungkannya daripada menguntungkanmu. Saya harap itu masuk akal? Tapi saya sangat menghargai kedua penjelasan tersebut. Terima kasih!
Tyler Youngblood
7

Menggunakan titik . di shell biasanya berarti "direktori saat ini".

Saat Anda menggunakan tanda bintang *pada shell, fitur yang disebut file-globbingdigunakan. Misalnya pada bash fungsinya glob()melakukan hal itu. Halaman manual untuk glob ( man 7 glob) menyatakan:

DESKRIPSI

Long ago, in UNIX V6, there was a program /etc/glob that would expand 
wildcard patterns.  Soon afterward this became a shell built-in.
These days there is also a library routine glob(3) that will perform this 
function for a user program.

Pencocokan karakter pengganti

A string is a wildcard pattern  if it contains one of the characters '?', '*' or '['. 

Globbing

Globbing is the operation that expands a wildcard pattern 
into the list of pathnames matching the pattern.

Itu berarti saat Anda meneruskan argumen ke program apa pun di baris perintah yang berisi '?', '*'atau '[', pertama kali globbing memperluas pola karakter pengganti ke dalam daftar file, lalu memberikan file ini sebagai argumen untuk program itu sendiri.

Perbedaan makna antara 'git add .'dan 'git add *'dijelaskan dengan jelas oleh Denis :

git addmengharapkan daftar file yang akan ditambahkan. Dalam contoh di atas shell mengembang *atau .masing-masing dan memberikan hasilnya sebagai parameter untuk ditambahkan git. Sekarang perbedaannya adalah dengan git add .git akan meluas ke direktori saat ini sedangkan git add *memicu file globbing dan semacamnya meluas ke semua file dan direktori yang tidak dimulai dengan titik.

codingdave
sumber
5

Untuk lebih jelasnya, saya berikan jawabannya pada tabel di bawah ini:

masukkan deskripsi gambar di sini

Catatan tambahan (terinspirasi oleh komentar @ reka18):

Catatan 1. git add -A dan git add -uperintah yang dilakukan tanpa parameter tambahan akan menjadi penyempitan tambahan (subdirektori atau indikasi topeng untuk nama file) yang bekerja di kisaran seluruh direktori kerja (juga jika kita menjalankan perintah di subdirektori kerja direktori).

Catatan 2. The .dan *adalah masing-masing jalur direktori (direktori saat ini) dan wildcard, yang memperjelas jalan perintah. Misalnya, jika perintah git add .or git add *dijalankan di beberapa subdirektori dari direktori kerja, maka tindakannya hanya digunakan dalam subdirektori ini, bukan seluruh direktori kerja.

Catatan 3. The git add -Adan git add -uperintah dapat lebih disempurnakan dengan menambahkan path atau masker untuk file, misalnya, git add -A app/controllersatau git add -u app\styles\*.

simhumileco.dll
sumber
2
Jadi pada Git v2.x git add -Adan git add .identik?
reka18
Terima kasih @ reka18, untuk pertanyaan yang sangat bagus. Itu mengilhami saya untuk menyelesaikan jawaban saya ... Jawaban atas pertanyaan Anda: Jika Anda menyebutnya di direktori kerja, tidak, tetapi jika di subdirektori, maka ya ( git add -Aberlaku untuk seluruh direktori kerja dan git add .selalu direktori saat ini).
simhumileco
2
  • git add -A (--all) Menambahkan semuanya, sehingga semua yang ada di folder Anda di disk terwakili di area pementasan

  • git add . Tahapan semuanya, tetapi tidak menghapus file yang telah dihapus dari disk

  • git add * Tahapan semuanya, tetapi bukan file yang dimulai dengan titik & tidak menghapus file yang telah dihapus dari disk

  • git add -u (--update) Tahapan hanya File yang Dimodifikasi, menghapus file yang telah dihapus dari disk, tidak menambahkan yang baru

  • git add <file name 1> <file name 2> Menambahkan hanya file tertentu

Steffen
sumber