"गिट ऐड-ए" और "गिट ऐड" के बीच अंतर।


2917

आदेश के git add [--all|-A]समान प्रतीत होता है git add .। क्या ये सही है? यदि नहीं, तो वे कैसे भिन्न हैं?

जवाबों:


4240

यह उत्तर केवल Git संस्करण 1.x पर लागू होता है । Git संस्करण 2.x के लिए, अन्य उत्तर देखें।


सारांश:

  • git add -Aसभी परिवर्तन चरण

  • git add .हटाए बिना , नई फ़ाइलों और संशोधनों को चरणबद्ध करता है

  • git add -uनई फ़ाइलों के बिना , संशोधनों और विलोपन को चरणबद्ध करता है


विवरण:

git add -Aके बराबर है git add .; git add -u

इसके बारे git add .में महत्वपूर्ण बात यह है कि यह काम करने वाले पेड़ को देखता है और उन सभी परिवर्तनों को चरणबद्ध परिवर्तनों में जोड़ता है यदि वे या तो बदले हुए हैं या नए हैं और उन्हें नजरअंदाज नहीं किया गया है, तो यह किसी भी 'आरएम' क्रिया को मंचित नहीं करता है।

git add -uपहले से ही ट्रैक की गई सभी फ़ाइलों को देखता है और यदि वे अलग हैं या यदि उन्हें हटा दिया गया है तो उन फ़ाइलों में परिवर्तन को चरणबद्ध करता है। यह किसी भी नई फाइल को नहीं जोड़ता है, यह केवल पहले से ही ट्रैक की गई फ़ाइलों में परिवर्तन करता है।

git add -A उन दोनों को करने के लिए एक आसान शॉर्टकट है।

आप कुछ इस तरह से मतभेदों का परीक्षण कर सकते हैं (ध्यान दें कि Git संस्करण 2.x के लिए आपका आउटपुट अलग git add . git status होगा ):

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
कैसे अंतर के बारे में git add *?
जारेड

3
बहुत बुरा git add -A -pकाम नहीं करता है क्योंकि कोई भी उम्मीद नहीं करेगा (अनटैक की गई फ़ाइलों के बारे में पूछें)
एरिक कपलुन

2
कृपया जवाब अपडेट करें। यह होना चाहिए: git add -A :/याgit add -A .
गेब्रियल ललामास

5
जानकारी के लिए, git के नए संस्करणों में बाद वाला पैरामीटर एक पथ git add -uबन गया git add -u :/है, जिससे आपको कुछ निर्देशिकाओं के लिए, :/पूरे पेड़ को संभालने की अनुमति मिलती है ।
बृहस्पति

15
@CharlesBailey, Git वास्तव में बिना किसी अच्छे कारण के चीजों को जटिल बनाना पसंद करते हैं। क्या कोई वास्तविक उपयोग मामला है जिससे किसी को विशेष रूप से git add -uया की आवश्यकता होगीgit add . ऐसा करने से अतिरिक्त मानसिक कर के लिए लेखांकन के बाद भी उसका जीवन आसान हो जाता है ताकि यह सुनिश्चित हो सके कि कोई सिंक समस्याएं नहीं हैं? मुझे आश्चर्य है कि Git add -uदो अलग-अलग कमांडों में विभाजित नहीं होता है add -u1और add-u2जिससे एक फाइलों के लिए काम करता है जो अंकों के साथ शुरू होता है और दूसरा गैर-अंकों से शुरू होने वाली फाइलों के लिए
Pacerier

946

यहाँ त्वरित समझ के लिए एक तालिका है:

Git संस्करण 1.x :

यहां छवि विवरण दर्ज करें

Git संस्करण 2.x :

यहां छवि विवरण दर्ज करें

लंबे रूप के झंडे:

  • git add -A के बराबर है git add --all
  • git add -u के बराबर है git add --update

आगे की पढाई:


1
मेज के लिए धन्यवाद। क्या केवल संशोधित की गई फ़ाइलों को जोड़ने का एक तरीका है। कोई नई फ़ाइल या हटाई गई फ़ाइलें नहीं
गोकुल एनके

3
@ गोकुल: इस पोस्ट के अनुसार , आप git diff-files -z --diff-filter=M --name-only | xargs -0 git addकेवल संशोधित फ़ाइलों को जोड़ने के लिए उपयोग कर सकते हैं , लेकिन नई फाइलें या डिलीट नहीं।
विले

93
यह पूरी तरह से सच नहीं है, क्योंकि git add .केवल नई फाइलें जोड़ता है जो वर्तमान पथ पर हैं। यानी यदि आपके पास एक नई निर्देशिका है ../foo, git add -Aतो इसे चरणबद्ध करेंगे, git add .नहीं करेंगे।
मिलो विलोन्डेक

2
तो, git add .समतुल्य है git add -A ., जो कि बराबर हैgit add "*"
flow2k

मैं अभी भी git add "*" के बारे में भ्रमित हूं, क्या आप इसे थोड़ा और विस्तृत कर सकते हैं?
एचएस उमेर फ़ारूक़

176

Git 2.0 केgit add -Agit add .git add -A . साथ , डिफ़ॉल्ट है: बराबर है

git add <path>" git add -A <path>" अब के समान है , ताकि " git add dir/" निर्देशिका से हटाए गए रास्तों को नोटिस करेगा और हटाने को रिकॉर्ड करेगा।
Git के पुराने संस्करणों में, " git add <path>" ने निष्कासन को अनदेखा कर दिया है।

यदि आप वास्तव में चाहते हैं तो आप git add --ignore-removal <path>केवल जोड़े गए या संशोधित मार्गों को जोड़ने के लिए " " कह सकते हैं <path>

git add -Aकी तरह है git add :/( शीर्ष गिट रेपो फ़ोल्डर से सब कुछ जोड़ें )।
ध्यान दें कि git 2.7 (Nov. 2015) आपको " :" नाम के एक फ़ोल्डर को जोड़ने की अनुमति देगा !
देखें 29abb33 प्रतिबद्ध (25 अक्टू 2015) द्वारा Junio सी Hamano ( gitster)


ध्यान दें कि git 2.0 (Q1 या Q2 2014) शुरू करते समय git add ., काम करने वाले पेड़ के भीतर (वर्तमान पथ के बारे में ) बात करते समय , आपको .अन्य git addकमांड में भी ' ' का उपयोग करना चाहिए ।

इसका मत:

"" git add -A ."के बराबर है git add .; git add -u ."

(नोट के लिए अतिरिक्त ' .' git add -Aऔर git add -u)

क्योंकि git add -Aया पूरे काम करने वाले पेड़git add -u पर ही (जीआईटी 2.0 शुरू करने) संचालित होता है , न कि केवल वर्तमान पथ पर।

वे कमांड Git 2.0 में पूरे पेड़ पर " git commit -a" और अन्य कमांड के साथ संगति के लिए काम करेंगे । क्योंकि " git add -u" के रूप में व्यवहार करें " " बनाने के लिए कोई तंत्र नहीं होगा git add -u ., यह उन लोगों के लिए महत्वपूर्ण है जो git add -u"(बिना pathspec) के लिए उपयोग किए जाते हैं" केवल स्पष्ट रूप से कहने के लिए अपनी उंगलियों का प्रशिक्षण शुरू करने के लिए वर्तमान उपनिर्देशिका में पथों के लिए सूचकांक को अद्यतन करना।git add -u . "जब वे इसका मतलब Git 2.0 के आने से पहले।

एक चेतावनी तब जारी की जाती है जब ये कमांड बिना किसी पाथस्पेक्ट के चलते हैं और जब आपके पास वर्तमान निर्देशिका के बाहर स्थानीय परिवर्तन होते हैं , क्योंकि ऐसी स्थिति में Git 2.0 का व्यवहार आज के संस्करण से अलग होगा।


3
@NickVolynkin यह बहुत अच्छा है! एसओ के अंतर्राष्ट्रीय समुदाय को इरादा के रूप में देखने के लिए खुशी है। संदर्भ के लिए: ru.stackoverflow.com/a/431840
VonC

@VonC, नीस, Git के लोगों को वास्तव में यह कहने का गाल था कि उनका अपडेट "चीजों को अधिक सुसंगत बना देगा"। उन्होंने जो किया था वह अधिक भ्रम और विसंगतियां पैदा करता है। 26 अक्षर हैं और उन्हें पहले से उपयोग किए गए एक ध्वज का पुन: उपयोग करना था
पैसिफायर

136

से चार्ल्स 'निर्देश , मेरे प्रस्तावित समझ का परीक्षण इस प्रकार किया जाएगा के बाद:

# 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

यह ब्लॉग पोस्ट यह समझने में भी सहायक हो सकती है कि उन स्थितियों को किस स्थिति में लागू किया जा सकता है: हटाए गए फ़ाइलों को आपके गिट वर्किंग डायरेक्टरी से हटाना


6
यह अब 2.0 में सच नहीं है। जोड़ते हैं। एक ही पथ के लिए जोड़ने के लिए बराबर है, केवल अंतर यह है कि पेड़ के अन्य रास्तों में नई फाइलें हैं
क्लाउडीयू क्रेंगना

41

जीआईटी 2.0 ( 2014-05-28 ) के साथ चीजें बदल गईं :

  • -A अब डिफ़ॉल्ट है
  • पुराना व्यवहार अब उपलब्ध है --ignore-removal
  • git add -uऔर git add -Aकमांड लाइन पर पथों के बिना एक उपनिर्देशिका पूरे पेड़ पर काम करती है।

तो Git 2 के लिए इसका उत्तर है:

  • git add .और git add -A .वर्तमान निर्देशिका में नई / संशोधित / हटाई गई फ़ाइलें जोड़ें
  • git add --ignore-removal . वर्तमान निर्देशिका में नई / संशोधित फाइलें जोड़ता है
  • git add -u . वर्तमान निर्देशिका में संशोधित / हटाए गए फ़ाइलों को जोड़ता है
  • डॉट के बिना, परियोजना में वर्तमान निर्देशिका की परवाह किए बिना सभी फाइलें जोड़ें।

4
मुझे नहीं लगता कि यह सही है। Git v2.10.windows.2 का उपयोग कर 'git ऐड' रिटर्न 'कुछ भी निर्दिष्ट नहीं, कुछ भी नहीं जोड़ा गया'। 'git add -A' सभी परिवर्तित फ़ाइलों को जोड़ता है। जो सुझाव देता है कि '-A' डिफ़ॉल्ट नहीं है।
न्यूट्रिनो

34

एक अधिक आसुत त्वरित उत्तर:

क्या दोनों नीचे हैं ( git add --all के समान )

git add -A

नई + संशोधित फ़ाइलें स्टेज करता है

git add .

चरणों संशोधित + हटाए गए फ़ाइलें

git add -u

5
हैलो, क्या होगा यदि आप केवल संशोधित फ़ाइलों को चरणबद्ध करना चाहते थे? आप वह कैसे करेंगें?
theGrapeBeyond

2
नमस्कार, अच्छा सवाल है। जहाँ तक मुझे पता है उसके लिए एक आसान झंडा नहीं है .. git diff-files -z --diff-filter = M --name-only | xargs -0 git add से -> stackoverflow.com/questions/14368093/…
K. Kilian Lindberg

2
वास्तव में यह है git add :/ +git add -u :/
निक वोल्किन

27

में Git 2.x :

  • आप सीधे पर स्थित हैं, तो कार्यशील निर्देशिका , तो git add -Aऔर git add .अंतर के बिना काम करते हैं।

  • यदि आप किसी भी उपनिर्देशिका में हैं कार्यशील निर्देशिका के , git add -Aतो संपूर्ण कार्यशील निर्देशिका से सभी फ़ाइलें git add .जोड़ देंगे , और आपकी वर्तमान निर्देशिका से फ़ाइलें जोड़ देंगे ।

और बस यही।


12

मुझे उम्मीद है कि इससे कुछ और स्पष्टता आ सकती है।

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

लिमर्स -यू या -ए या नील हो सकता है।

Pathspec एक फ़ाइलपथ या बिंदु हो सकता है, '।' वर्तमान निर्देशिका को इंगित करने के लिए।

Git 'कैसे जोड़ता है' के बारे में महत्वपूर्ण पृष्ठभूमि ज्ञान:

  • अदृश्य फाइलें, जो एक डॉट के साथ उपसर्ग करती हैं, (डॉटफ़ाइल्स) कभी भी गिट द्वारा मान्यता प्राप्त नहीं होती हैं। उन्हें कभी भी 'अनट्रैक' के रूप में सूचीबद्ध नहीं किया गया है।
  • खाली फ़ोल्डर Git द्वारा कभी नहीं जोड़े जाते हैं। उन्हें कभी भी 'अनट्रैक' के रूप में सूचीबद्ध नहीं किया गया है। (ट्रैक किए गए फ़ाइलों के लिए एक रिक्त फ़ाइल, संभवतः अदृश्य को जोड़ने के लिए एक वर्कअराउंड है।)
  • जब तक सबफ़ोल्डर को ट्रैक नहीं किया जाता है, तब तक गिट स्थिति, सबफ़ोल्डर जानकारी को प्रदर्शित नहीं करेगी, जो कि अनट्रैक की गई फ़ाइलें हैं। ऐसे समय से पहले, Git पूरे फ़ोल्डर को दायरे से बाहर मानता है, एक ला 'खाली'। यह ट्रैक की गई वस्तुओं का खाली होना है।
  • एक फ़ाइल को निर्दिष्ट करना = '।' (डॉट), या वर्तमान निर्देशिका, पुनरावर्ती नहीं -Aहै जब तक कि यह भी निर्दिष्ट नहीं किया जाता है। डॉट वर्तमान निर्देशिका के लिए कड़ाई से संदर्भित करता है - यह ऊपर और नीचे पाए गए मार्गों को छोड़ देता है।

अब, उस ज्ञान को देखते हुए, हम उपरोक्त उत्तर लागू कर सकते हैं।

सीमाएँ इस प्रकार हैं।

  • -u= --update= ट्रैक की गई फ़ाइलों के लिए सबसेट => जोड़ें = नहीं; परिवर्तन = हाँ; हटाना = हाँ। => यदि आइटम को ट्रैक किया जाता है।
  • -A= --all(ऐसा नहीं है -a, जो सिंटैक्स त्रुटि देता है) = सभी अनट्रैक / ट्रैक की गई फ़ाइलों का सुपरसेट, जब तक कि 2.0 से पहले गिट में, जिसमें अगर डॉट फिल्स्पेक दिया जाता है, तो केवल उस विशेष फ़ोल्डर को माना जाता है। => यदि आइटम पहचाना जाता है, git add -Aतो उसे ढूंढकर जोड़ देगा।

पैथस्पेक इस प्रकार है।

  • दो सीमाओं (अपडेट और सभी) के लिए 2.0 से पहले Git में, नया डिफ़ॉल्ट वर्तमान पथ (Git 1.9 या पूर्व) के बजाय पूरे कार्यशील पेड़ पर काम करना है,
  • हालाँकि, v2.0 में, ऑपरेशन को वर्तमान पथ तक सीमित किया जा सकता है: बस स्पष्ट डॉट प्रत्यय जोड़ें (जो कि Git 1.9 या पूर्व में भी मान्य है);

git add -A .

git add -u .

अंत में, मेरी नीति है:

  1. सुनिश्चित करें कि जोड़े जाने वाली किसी भी प्रकार की फाइल / फाइलों का हिसाब दिया जाए git status
  2. यदि कोई आइटम गायब हैं, तो अदृश्य फ़ाइलों / फ़ोल्डरों के कारण, उन्हें अलग से जोड़ें।
  3. अच्छा है .gitignore फाइल रखें ताकि आम तौर पर केवल ब्याज की फाइलें ही बिना पढ़े और / या बिना मान्यता प्राप्त हों।
  4. भंडार के शीर्ष स्तर से, "git add -A" सभी आइटम जोड़ने के लिए। यह Git के सभी संस्करणों में काम करता है।
  5. यदि वांछित हो, तो सूचकांक से किसी भी वांछित आइटम को हटा दें।
  6. यदि एक बड़ा बग है, तो सूचकांक को पूरी तरह से खाली करने के लिए 'git रीसेट' करें।

12

git add .बराबरी git add -A .केवल वर्तमान और बच्चों के फ़ोल्डर से सूचकांक में फाइलें जोड़ता है।

git add -A कार्यशील ट्री में सभी फ़ोल्डरों से इंडेक्स में फाइलें जोड़ता है।

पुनश्च: जानकारी Git 2.0 (2014-05-28) से संबंधित है ।


9

दोनों git add .औरgit add -A Git के नए संस्करण में सभी नए, संशोधित और नष्ट कर दिया फ़ाइलों को मंच होगा।

अंतर यह है कि git add -Aचरणों की फाइलें "उच्च, वर्तमान और उपनिर्देशिका" में हैं जो आपके काम करने वाले गिट रिपॉजिटरी से संबंधित हैं। लेकिन git add .वर्तमान निर्देशिका और उपनिर्देशिकाओं में केवल चरणों की फ़ाइलों का पालन करना ( नहीं) कि बाहर पड़ी फाइलें, अर्थात् उच्च निर्देशिकाएं)।

यहाँ एक उदाहरण है:

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

यदि आपकी वर्तमान वर्किंग डायरेक्टरी है /my-repo, और आप करते हैं rm rootfile.txt, तो उसके cd subfolderबाद डिलीट की गई फाइल को स्टेज नहींgit add . करेंगे । लेकिन कर निश्चित रूप से इस परिवर्तन को कोई फर्क नहीं पड़ता कि आप कहाँ से कमांड करते हैं।git add -A


3

-Aविकल्प कहते हैं, संशोधित करता है और काम कर पेड़ से मिलान करने के सूचकांक प्रविष्टियों को हटा।

गिट 2 में -A विकल्प अब डिफ़ॉल्ट है।

जब एक .जोड़ा जाता है जो आपके द्वारा वर्तमान में Git प्रलेखन के अनुसार, उस निर्देशिका के अद्यतन के दायरे को सीमित करता है

यदि नही <pathspec>-एक विकल्प का उपयोग किए जाने पर दिया जाता है, तो पूरे काम करने वाले पेड़ की सभी फाइलें अपडेट की जाती हैं (Git के पुराने संस्करण वर्तमान निर्देशिका और उसके उपनिर्देशिकाओं में अद्यतन को सीमित करने के लिए उपयोग किए जाते हैं)।

एक चीज जो मैं जोड़ूंगा वह यह है कि यदि --interactiveया -pमोड का उपयोग किया जाता है तो git addव्यवहार करेंगे जैसे कि अपडेट ( -u) ध्वज का उपयोग किया गया था और नई फाइलें नहीं जोड़ रहा था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.