“Git add -A” ve “git add” arasındaki fark.


2918

Komut git add [--all|-A]ile aynı görünüyor git add .. Bu doğru mu? Değilse, nasıl farklıdırlar?

Yanıtlar:


4240

Bu cevap yalnızca Git sürüm 1.x için geçerlidir . Git sürüm 2.x için diğer yanıtlara bakın.


Özet:

  • git add -Atüm değişiklikleri aşamalandırır

  • git add .silmeden yeni dosyalar ve değişiklikler yapar

  • git add -uyeni dosyalar olmadan değişiklik ve silme işlemleri yapar


Detay:

git add -Aeşittir git add .; git add -u.

Önemli git add .olan, çalışma ağacına bakması ve değiştirilmeleri veya yeni olmaları ve yoksayılmaları durumunda aşamalı değişikliklere tüm bu yolları eklemesidir.

git add -uhalihazırda izlenen tüm dosyalara bakar ve farklıysa veya kaldırılmışsa bu dosyalardaki değişiklikleri aşamalandırır. Herhangi bir yeni dosya eklemez, sadece önceden izlenen dosyalarda değişiklik yapar.

git add -A her ikisini de yapmak için kullanışlı bir kısayoldur.

Farklılıkları böyle bir şeyle test edebilirsiniz (Git sürüm 2.x için çıktınızın farklı git add . git status olacağını unutmayın ):

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

41
Arasındaki fark nasıl git add *?
Jared

3
çok kötü git add -A -pbeklendiği gibi çalışmaz (izlenmeyen dosyalar hakkında etkileşimli olarak sorun)
Erik Kaplun

2
Lütfen cevabı güncelleyin. Olması gereken: git add -A :/veyagit add -A .
Gabriel Llamas

5
Bilgi için GYTE yeni sürümlerinde git add -uhaline gelmiştir git add -u :/ikinci parametre, bir yol olmaktan belirli dizinleri-u izin ile, :/bütün ağaç işler.
Brizee

15
@CharlesBailey, Git gerçekten iyi bir sebep olmadan işleri karmaşık hale getirmeyi çok seviyor . Bir var mı gerçek Birinin özellikle gerekir sayede kullanım durumu git add -uveya git add .ve hatta hiçbir senkron sorunları var olduklarından emin olmak üzere ilave ekstra zihinsel vergi hesaplandıktan sonra daha kolay hayatını yapar yaparak? Git değil Furthur bölünmüş yapar Acaba neden add -uiki ayrı komutlar içine add -u1ve add-u2dosyalar için sayede bir eser olmayan rakamlar ile başlayan dosyalar için diğer rakamlar ile başlayan ve
Pacerier

946

İşte hızlı anlama için bir tablo:

Git Sürüm 1.x :

Resim açıklamasını buraya girin

Git Sürüm 2.x :

Resim açıklamasını buraya girin

Uzun biçimli bayraklar:

  • git add -A eşittir git add --all
  • git add -u eşittir git add --update

Daha fazla okuma:


1
Masa için teţekkürler. Yalnızca değiştirilen dosyaları eklemenin bir yolu var mı? Yeni dosya veya silinmiş dosya yok
Gokul NK

3
@Gokul: Bu gönderiye göre , git diff-files -z --diff-filter=M --name-only | xargs -0 git addyalnızca değiştirilmiş dosyaları eklemek için kullanabilirsiniz , ancak yeni dosyaları veya silme işlemlerini eklemek için kullanabilirsiniz .
Ville

93
git add .Yalnızca geçerli yolda olan yeni dosyaları eklediğinden , bu tamamen doğru değildir . Yani yeni bir dizininiz varsa ../foo, git add -Aonu dizileyecek, git add .olmayacak.
Milo Wielondek

2
Yani, git add .eşdeğer git add -A ., eşdeğergit add "*"
flow2k

Hala git add "*" hakkında kafam karıştı, lütfen biraz daha detaylandırabilir misiniz?
HS Umer farooq

176

İle Git 2.0, git add -Avarsayılan değer: git add .eşittirgit add -A . .

git add <path>git add -A <path>artık " " ile aynıdır , böylece " git add dir/" dizinden kaldırdığınız yolları fark eder ve kaldırmayı kaydeder.
Git'in eski sürümlerinde " git add <path>" kaldırma işlemleri yoksayıldı.

Gerçekten isterseniz, git add --ignore-removal <path>yalnızca eklenen veya değiştirilen yolları eklemek için " " diyebilirsiniz <path>.

git add -Agibidir git add :/( top git repo klasöründen her şeyi ekleyin ).
Git 2.7'nin (Kasım 2015) " :" adlı bir klasör eklemenize izin vereceğini unutmayın !
Bkz 29abb33 taahhüt tarafından (25 Eki 2015) Junio C Hamano ( gitster) .


Not o git 2.0 (Q1 veya Q2 2014) başlayarak bahsederken, git add .(çalışma ağacındaki akım yolu) kullanarak, 'kullanmalıdır .diğerinde' git addde komutları.

Bunun anlamı:

" git add -A ." Eşdeğerdir " git add .; git add -u ."

(Ekstra ' .' git add -Ave için not edin git add -u)

Çünkü git add -Aveya sadece geçerli yolda değil git add -u, tüm çalışma ağacında çalışır (yalnızca git 2.0'dan başlayarak) .

Bu komutlar Git 2.0'daki tüm ağaçta " git commit -a" ve diğer komutlarla uyumluluk için çalışacaktır . " git add -u" Gibi davranma " " gibi davranmak için herhangi bir mekanizma olmayacağından git add -u ., " git add -u" (pathspec olmadan) dizini yalnızca geçerli alt dizindeki yollar için parmaklarını açıkça " git add -u ."Git 2.0 gelmeden bunu kastettiklerinde.

Bu komutlar bir pathspec olmadan çalıştırıldığında ve geçerli dizinin dışında yerel değişiklikleriniz olduğunda bir uyarı verilir , çünkü Git 2.0'daki davranış böyle bir durumda bugünün sürümünden farklı olacaktır.


3
@NickVolynkin Harika! Uluslararası SO topluluğunun amaçlandığı gibi çalıştığını görmekten memnunum. Referans için: ru.stackoverflow.com/a/431840
VonC

@VonC, Nice, Git millet aslında güncellemelerinin "işleri daha tutarlı hale getireceğini" söylemek için yanaklara sahipti. Yaptıkları daha karışıklık ve tutarsızlıklar yarattı. 26 alfabe var ve zaten kullanılmış bir bayrağı yeniden kullanmak zorunda kaldılar.
Pacerier

136

Gönderen Charles'ın talimatlar , aşağıdaki gibi olacaktır Önerdiğim anlayış test ettikten sonra:

# 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

Bu blog gönderisi, bu komutların hangi durumda uygulanabileceğini anlamak için de yararlı olabilir: Silinen Dosyaları Git Çalışma Dizininizden Kaldırma .


6
bu artık 2.0'da geçerli değil. Ekle . aynı yol için -A eklemeye eşittir, tek fark, ağacın diğer yollarında yeni dosyalar varsa
Claudiu Creanga

41

Git 2.0 ( 2014-05-28 ) ile durum değişti :

  • -A şimdi varsayılan
  • Eski davranış ile artık kullanılabilir --ignore-removal.
  • git add -uve git add -Akomut satırında yolları olmayan bir alt dizinde tüm ağaç üzerinde çalışır.

Yani Git 2 için cevap:

  • git add .ve git add -A .geçerli dizine yeni / değiştirilmiş / silinmiş dosyaları ekleyin
  • git add --ignore-removal . geçerli dizine yeni / değiştirilmiş dosyalar ekler
  • git add -u . geçerli dizine değiştirilmiş / silinmiş dosyaları ekler
  • Nokta olmadan, geçerli dizine bakmaksızın projedeki tüm dosyaları ekleyin.

4
Bunun doğru olduğunu düşünmüyorum. Git v2.10.windows.2 'git add' döndürür 'Hiçbir şey belirtilmedi, hiçbir şey eklenmedi'. 'git add -A' değiştirilen tüm dosyaları ekler. Bu, '-A'nın varsayılan olmadığını gösterir.
Neutrino

34

Daha damıtılmış hızlı bir cevap:

Her ikisini de yapar ( git add --all ile aynı )

git add -A

Yeni + değiştirilmiş dosyaları hazırlar

git add .

Değiştirilmiş aşamalar + silinmiş dosyalar

git add -u

5
Merhaba, ya sadece değiştirilmiş dosyaları sahne almak istersen? Bunu nasıl yaptın?
TheGrapeBeyond

2
Merhaba, güzel soru. Bildiğim kadarıyla kolay bir bayrak yok .. git diff-files -z --diff-filter = M - sadece isim | xargs -0 git add from -> stackoverflow.com/questions/14368093/…
K.Kilian Lindberg

2
Aslında git add :/+git add -u :/
Nick Volynkin

27

In Git 2.x :

  • Eğer doğrudan yer alıyorsa çalışma dizinine sonra git add -Ave git add .fark etmeden işe.

  • Eğer herhangi alt dizininde ise çalışma dizini , git add -Atüm gelen tüm dosyaları katacak çalışma dizininin ve git add .senin dosya katacak geçerli dizinde .

Ve hepsi bu.


12

Umarım bu daha fazla netlik katabilir.

!The syntax is
git add <limiters> <pathspec>
! Aka
git add (nil/-u/-A) (nil/./pathspec)

Sınırlayıcılar -u veya -A veya sıfır olabilir.

Pathspec bir dosya yolu veya nokta olabilir, '.' geçerli dizini belirtmek için.

Git'in nasıl eklediğine dair önemli arka plan bilgisi:

  • Görünmez dosyalar, nokta ile işaretlenmiş olan dosyalar (dotfiles) Git tarafından asla otomatik olarak tanınmaz. Asla 'izlenmemiş' olarak listelenmezler.
  • Boş klasörler asla Git tarafından eklenmez. Asla 'izlenmemiş' olarak listelenmezler. (Geçici bir çözüm, izlenen dosyalara görünmez olan boş bir dosya eklemektir.)
  • Git durumu, alt klasördeki en az bir dosya izlenmediği sürece alt klasör bilgilerini, yani izlenmeyen dosyaları görüntülemez. Bu zamandan önce Git, tüm klasörü kapsam dışı, boş bir 'olarak değerlendirir. İzlenen öğeler boş.
  • Bir filespec = 'belirtme.' (nokta) veya geçerli dizin -Ade belirtilmedikçe özyinelemeli değildir . Dot kesinlikle geçerli dizini ifade eder - yukarıda ve aşağıda bulunan yolları atlar.

Şimdi, bu bilgi göz önüne alındığında, yukarıdaki cevapları uygulayabiliriz.

Sınırlayıcılar aşağıdaki gibidir.

  • -u= --update= izlenen dosyalara alt küme => Ekle = Hayır; Değiştir = Evet; Sil = Evet. => Eğer öğe izlenir.
  • -A= --all(böyle bir -asözdizimi hatası vermez) = izlenmemiş / izlenen dosyaların üst kümesi, 2.0'dan önceki Git'te değilse, burada dot filespec verilirse, yalnızca o klasör dikkate alınır. => Eğer madde tanınır, git add -Aonu bulur ve ekler.

Pathspec aşağıdaki gibidir.

  • Git'ten önceki 2.0 sürümünde, iki sınırlayıcı (güncelleme ve tümü) için, yeni varsayılan geçerli yol (Git 1.9 veya öncesi) yerine tüm çalışma ağacında çalışmaktır,
  • Ancak, v2.0 sürümünde, işlem geçerli yolla sınırlandırılabilir: sadece açık nokta sonekini eklemeniz yeterlidir (Git 1.9 veya önceki sürümlerde de geçerlidir);

git add -A .

git add -u .

Sonuç olarak, politikam:

  1. Eklenecek tüm parçaların / dosyaların hesaplandığından emin olun git status.
  2. Görünmeyen dosyalar / klasörler nedeniyle eksik öğeler varsa, bunları ayrı olarak ekleyin.
  3. İyi eğlenceler .gitignoreNormalde yalnızca ilgili dosyaların izlenememesi ve / veya tanınmaması dosyaya sahip olun.
  4. Deponun en üst seviyesinden tüm öğeleri eklemek için "git add -A". Bu, Git'in tüm sürümlerinde çalışır.
  5. İstenirse, istenen öğeleri dizinden kaldırın.
  6. Büyük bir hata varsa, dizini tamamen silmek için 'git reset' yapın.

12

git add .eşittir, git add -A .dosyaları yalnızca geçerli ve alt klasörlerden dizine ekler.

git add -A çalışma ağacındaki tüm klasörlerden dizine dosya ekler.

PS: bilgi Git 2.0 (2014-05-28) ile ilgilidir .


9

Hem git add .vegit add -A Git yeni sürümlerinde tüm yeni, değiştirilmiş ve silinen dosyaları sahnelenecek.

Aradaki fark, git add -Açalışan Git deponuza ait olan "daha yüksek, geçerli ve alt dizinler" içindeki dosyaları aşamalandırmasıdır. Ancak git add .yalnızca geçerli dizindeki dosyaları ve onu izleyen alt dizinleri aşamalar ( değil dışarıdaki dosyaları , daha yüksek dizinleri).

İşte bir örnek:

/my-repo
  .git/
  subfolder/
    nested-file.txt
  rootfile.txt

Geçerli çalışma dizini ise /my-repove siz do rm rootfile.txtardından cd subfolder, ardından git add ., o zaman olacak değil silinen dosyayı sahne. Ancak git add -Akomutun nereden gerçekleştirildiği önemli değil, yapmak kesinlikle bu değişikliği gerçekleştirecektir.


3

-A seçenek, çalışma ağacıyla eşleşmesi için dizin girdilerini ekler, değiştirir ve kaldırır.

Git 2'de -Aseçenek artık varsayılan.

Bir zaman .dizine o sınırlar güncelleme kapsamını eklenir Eğer gereği, şu anda Git belgelerinde

<pathspec>-A seçeneği kullanıldığında hayır verilirse, tüm çalışma ağacındaki tüm dosyalar güncellenir (Git'in eski sürümleri, güncelleştirmeyi geçerli dizine ve alt dizinlerine sınırlamak için kullanılır).

Ekleyeceğim bir şey, --interactiveveya -pmodu kullanılıyorsa git add, update ( -u) bayrağı kullanılmış gibi davranacak ve yeni dosyalar eklemeyecek olmasıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.