ความแตกต่างระหว่าง“ git เพิ่ม -A” และ“ git เพิ่ม”


2918

คำสั่งที่ดูเหมือนจะเป็นเหมือนกับgit add [--all|-A] git add .ถูกต้องหรือไม่ ถ้าไม่พวกเขาต่างกันอย่างไร

คำตอบ:


4240

คำตอบนี้ใช้ได้กับGit เวอร์ชัน 1.xเท่านั้น สำหรับ Git เวอร์ชั่น 2.x ดูคำตอบอื่น ๆ


สรุป:

  • git add -Aขั้นตอนการเปลี่ยนแปลงทั้งหมด

  • git add .แยกไฟล์และการดัดแปลงใหม่โดยไม่ต้องลบออก

  • git add -uขั้นตอนการแก้ไขและการลบโดยไม่มีไฟล์ใหม่


รายละเอียด:

git add -Agit 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 *ล่ะ?
Jared

3
เลวร้ายเกินไปgit add -A -pไม่ทำงานอย่างที่คาดหวัง (ถามแบบโต้ตอบเกี่ยวกับไฟล์ที่ไม่ได้ติดตาม)
Erik Kaplun

2
โปรดอัปเดตคำตอบ มันควรจะเป็น: git add -A :/หรือgit add -A .
กาเบรียล Llamas

5
สำหรับข้อมูลในรุ่นที่ใหม่กว่าของ git git add -uได้กลายเป็นgit add -u :/กับพารามิเตอร์หลังเป็นเส้นทางที่ช่วยให้คุณ -u ไดเรกทอรีบางอย่าง:/จัดการต้นไม้ทั้งหมด
Brizee

15
@ CharlesBailey, Git รักที่จะทำสิ่งที่ซับซ้อนโดยไม่มีเหตุผลที่ดี มีกรณีการใช้งานจริงที่ใครบางคนต้องการโดยเฉพาะgit add -uหรือgit add .โดยการทำมันทำให้ชีวิตของเขาง่ายขึ้นแม้หลังจากการบัญชีสำหรับการเพิ่มภาษีจิตพิเศษเพื่อให้แน่ใจว่าไม่มีปัญหาการซิงค์? ผมสงสัยว่าทำไม Git ไม่แยกไม่ Furthur 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
ขอบคุณสำหรับตาราง มีวิธีเพิ่มเฉพาะไฟล์ที่ถูกแก้ไขหรือไม่ ไม่มีไฟล์ใหม่หรือไฟล์ที่ถูกลบ
Gokul NK

3
@Gokul: ตามโพสต์นี้คุณสามารถใช้git diff-files -z --diff-filter=M --name-only | xargs -0 git addเพื่อเพิ่มเฉพาะไฟล์ที่แก้ไข แต่ไม่สามารถลบไฟล์ใหม่หรือลบได้
วิลล์

93
สิ่งนี้ไม่เป็นความจริงเลยgit add .เพียงเพิ่มไฟล์ใหม่ที่อยู่บนเส้นทางปัจจุบันเท่านั้น เช่นถ้าคุณมีไดเรกทอรีใหม่../foo, git add -Aจะเวทีมันgit add .จะไม่
Milo Wielondek

2
ดังนั้นจึงgit add .เทียบเท่ากับgit add -A .ซึ่งเทียบเท่ากับgit add "*"
flow2k

ฉันยังสับสนเกี่ยวกับ git add "*" คุณช่วยอธิบายเพิ่มเติมหน่อยได้ไหม?
HS Umer farooq

176

ด้วยGit 2.0 git add -Aเป็นค่าเริ่มต้น:git 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 :/( เพิ่มทุกอย่างจากโฟลเดอร์ repo git ด้านบน )
โปรดทราบว่า git 2.7 (พฤศจิกายน 2558) จะช่วยให้คุณเพิ่มโฟลเดอร์ชื่อ " :"!
ดูกระทำ 29abb33 (25 ตุลาคม 2015) โดยJunio C 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จะทำงาน (เริ่มต้น git 2.0 เท่านั้น) บนแผนผังการทำงานทั้งหมดและไม่ใช่เฉพาะในเส้นทางปัจจุบัน

คำสั่งเหล่านั้นจะทำงานบนต้นไม้ทั้งใน Git 2.0 เพื่อความมั่นคงด้วย " git commit -a" และคำสั่งอื่น เนื่องจากจะไม่มีกลไกในการทำให้ " git add -u" ประพฤติราวกับว่า " git add -u ." มันเป็นสิ่งสำคัญสำหรับผู้ที่เคยชินกับ " git add -u" (โดยไม่มี pathspec) อัปเดตดัชนีเฉพาะเส้นทางในไดเรกทอรีย่อยปัจจุบันเพื่อเริ่มฝึกนิ้วมือของตนเพื่อพูดอย่างชัดเจน " git add -u ."เมื่อพวกเขาหมายถึงมันก่อนที่ Git 2.0 จะมา

มีการออกคำเตือนเมื่อคำสั่งเหล่านี้รันโดยไม่มี pathspec และเมื่อคุณมีการเปลี่ยนแปลงในท้องถิ่นนอกไดเรกทอรีปัจจุบันเนื่องจากพฤติกรรมใน Git 2.0 จะแตกต่างจากเวอร์ชันปัจจุบันในสถานการณ์เช่นนี้


3
@NickVolynkin เยี่ยมมาก! ดีใจที่ได้เห็นชุมชนนานาชาติของ SO ทำงานตามที่ตั้งใจไว้ สำหรับการอ้างอิง: ru.stackoverflow.com/a/431840
VonC

@VonC, Nice, กลุ่ม Git มีแก้มที่จะพูดว่าการอัพเดทของพวกเขาจะ "ทำให้ทุกอย่างสอดคล้องกันมากขึ้น" สิ่งที่พวกเขาทำคือสร้างความสับสนและความไม่สอดคล้องกันมากขึ้น มีตัวอักษร 26 ตัวและพวกเขาต้องนำธงที่ใช้แล้วไปใช้ซ้ำ
Pacerier

136

จากคำแนะนำของ Charlesหลังจากทดสอบความเข้าใจที่เสนอมาแล้วจะเป็นดังนี้:

# 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

โพสต์บล็อกนี้อาจมีประโยชน์ที่จะเข้าใจในสถานการณ์ที่อาจใช้คำสั่งเหล่านั้น: การลบไฟล์ที่ถูกลบออกจาก Git Working Directory ของคุณ


6
นี่ไม่เป็นความจริงอีกต่อไปใน 2.0 เพิ่ม เท่ากับการเพิ่ม -A สำหรับเส้นทางเดียวกันความแตกต่างเพียงอย่างเดียวคือถ้ามีไฟล์ใหม่ในเส้นทางอื่น ๆ ของต้นไม้
Claudiu Creanga

41

สิ่งต่าง ๆ เปลี่ยนไปด้วย Git 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 add' return 'ไม่ระบุอะไรเลยไม่มีอะไรเพิ่ม' 'git add -A' เพิ่มไฟล์ที่เปลี่ยนแปลงทั้งหมด สิ่งที่แนะนำ '-A' ไม่ใช่ค่าเริ่มต้น
ตริโน

34

คำตอบด่วนที่กลั่นได้มากขึ้น:

ทำทั้งสองด้านล่าง (เช่นเดียวกับคอมไพล์เพิ่ม - ทั้งหมด )

git add -A

สเตจไฟล์ใหม่ + ที่แก้ไข

git add .

ขั้นตอนแก้ไข + ลบไฟล์

git add -u

5
สวัสดีเกิดอะไรขึ้นถ้าคุณแค่อยากจะแสดงเฉพาะไฟล์ที่ถูกดัดแปลงเท่านั้น คุณจะทำอย่างไร
TheGrapeBeyond

2
สวัสดีคำถามที่ดี ไม่มีการตั้งค่าสถานะง่าย ๆ สำหรับสิ่งนั้นเท่าที่ฉันรู้ .. git diff-files -z --diff-filter = M - ชื่อ - เท่านั้น | xargs -0 git เพิ่มจาก -> stackoverflow.com/questions/14368093/…
K. Kilian Lindberg

2
อันที่จริงมันgit add :/+git add -u :/
Nick Volynkin

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)

ตัว จำกัด อาจเป็น -u หรือ -A หรือไม่มี

Pathspec อาจเป็น filepath หรือ dot, '.' เพื่อระบุไดเรกทอรีปัจจุบัน

ความรู้พื้นฐานที่สำคัญเกี่ยวกับวิธีที่ Git 'เพิ่ม':

  • ไฟล์ที่มองไม่เห็น Git ที่นำหน้าด้วยจุด (dotfiles) จะไม่รู้จักโดยอัตโนมัติ พวกเขาจะไม่ถูกระบุว่าเป็น 'ไม่ได้ติดตาม'
  • Git จะไม่เพิ่มโฟลเดอร์ว่างเปล่า พวกเขาจะไม่ถูกระบุว่าเป็น 'ไม่ได้ติดตาม' (วิธีแก้ปัญหาคือการเพิ่มไฟล์เปล่าอาจมองไม่เห็นลงในไฟล์ที่ถูกติดตาม)
  • สถานะ Git จะไม่แสดงข้อมูลโฟลเดอร์ย่อยนั่นคือไฟล์ที่ไม่ได้ติดตามยกเว้นไฟล์ที่ถูกติดตามอย่างน้อยหนึ่งไฟล์ในโฟลเดอร์ย่อยนั้น ก่อนหน้านี้ Git จะพิจารณาว่าโฟลเดอร์ทั้งหมดอยู่นอกขอบเขตซึ่งเป็น 'ว่าง' ไม่มีรายการที่ติดตาม
  • การระบุ filespec = '.' (จุด) หรือไดเรกทอรีปัจจุบันจะไม่เกิดซ้ำจนกว่า-Aจะมีการระบุ Dot อ้างถึงไดเรกทอรีปัจจุบันอย่างเคร่งครัด - ไม่ใช้พา ธ ที่พบด้านบนและด้านล่าง

ตอนนี้เนื่องจากความรู้นั้นเราสามารถใช้คำตอบข้างต้น

ขีด จำกัด มีดังนี้

  • -u= --update= เซ็ตย่อยไปยังไฟล์ที่ถูกติดตาม => เพิ่ม = ไม่; เปลี่ยน = ใช่; ลบ = ใช่ => หากรายการนั้นถูกติดตาม
  • -A= --all(ไม่มีเช่น-aนั้นซึ่งให้ข้อผิดพลาดทางไวยากรณ์) = superset ของไฟล์ที่ไม่ได้ติดตาม / ติดตามทั้งหมดยกเว้นใน Git ก่อน 2.0 ซึ่งจะมีการกำหนดจุด filespec ให้พิจารณาเฉพาะโฟลเดอร์นั้นเท่านั้น => หากรายการนั้นได้รับการยอมรับgit add -Aจะค้นหาและเพิ่มรายการนั้น

pathspec มีดังนี้

  • ใน Git ก่อน 2.0 สำหรับตัว จำกัด สองตัว (อัปเดตและทั้งหมด) ค่าเริ่มต้นใหม่คือการใช้งานบนแผนผังการทำงานทั้งหมดแทนเส้นทางปัจจุบัน (Git 1.9 หรือเก่ากว่า)
  • อย่างไรก็ตามใน v2.0 การดำเนินการสามารถถูก จำกัด ให้กับเส้นทางปัจจุบัน: เพียงเพิ่มจุดต่อท้ายที่ชัดเจน (ซึ่งยังใช้ได้ใน Git 1.9 หรือเก่ากว่า);

git add -A .

git add -u .

สรุปแล้วนโยบายของฉันคือ:

  1. ตรวจสอบให้แน่ใจ hunks ใด ๆ / git statusไฟล์ที่จะเพิ่มที่แสดงอยู่ใน
  2. หากรายการใดขาดหายไปเนื่องจากไฟล์ / โฟลเดอร์ที่มองไม่เห็นให้เพิ่มแยกต่างหาก
  3. ขอให้มีความสุข .gitignoreไฟล์เพื่อให้ปกติไฟล์ที่น่าสนใจเท่านั้นที่ไม่ได้ติดตามและ / หรือไม่รู้จัก
  4. จากระดับบนสุดของที่เก็บ "git add -A" เพื่อเพิ่มรายการทั้งหมด ใช้ได้กับ Git ทุกรุ่น
  5. ลบรายการที่ต้องการออกจากดัชนีหากต้องการ
  6. หากมีข้อผิดพลาดใหญ่ให้ทำ 'รีเซ็ต git' เพื่อล้างดัชนีทั้งหมด

12

git add . เท่ากับ git add -A .เพิ่มไฟล์ไปยังดัชนีเฉพาะจากโฟลเดอร์ปัจจุบันและโฟลเดอร์ลูก

git add -A เพิ่มไฟล์เพื่อจัดทำดัชนีจากโฟลเดอร์ทั้งหมดในแผนผังการทำงาน

PS: ข้อมูลเกี่ยวข้องกับGit 2.0 (2014-05-28)


9

ทั้งgit add .และgit add -Aจะทำขั้นตอนไฟล์ใหม่แก้ไขและลบทั้งหมดใน Git เวอร์ชันที่ใหม่กว่า

ความแตกต่างก็คือgit add -Aไฟล์จะเรียงลำดับใน "สูงกว่าปัจจุบันและไดเรกทอรีย่อย" ที่เป็นของที่เก็บ Git ที่ทำงานอยู่ แต่การทำ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ตัวเลือกเพิ่ม, ปรับเปลี่ยนและลบรายการดัชนีเพื่อให้ตรงกับต้นทำงาน

ใน Git 2 -Aตัวเลือกนี้เป็นค่าเริ่มต้น

เมื่อมีการ.เพิ่มที่ จำกัด ขอบเขตของการปรับปรุงไปยังไดเรกทอรีที่คุณอยู่ในปัจจุบันตามเอกสาร Git

หากไม่<pathspec>ได้รับเมื่อใช้ตัวเลือก -A ไฟล์ทั้งหมดในแผนผังการทำงานทั้งหมดจะได้รับการอัปเดต (Git เวอร์ชันเก่าที่ใช้เพื่อ จำกัด การอัปเดตไปยังไดเรกทอรีปัจจุบันและไดเรกทอรีย่อย)

สิ่งหนึ่งที่ฉันจะเพิ่มคือถ้าหากมีการใช้โหมด--interactiveหรือ-pแล้วgit addจะทำงานราวกับว่ามีการใช้-uธงupdate ( ) และไม่เพิ่มไฟล์ใหม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.