คำสั่งที่ดูเหมือนจะเป็นเหมือนกับgit add [--all|-A] git add .ถูกต้องหรือไม่ ถ้าไม่พวกเขาต่างกันอย่างไร
คำสั่งที่ดูเหมือนจะเป็นเหมือนกับgit add [--all|-A] git add .ถูกต้องหรือไม่ ถ้าไม่พวกเขาต่างกันอย่างไร
คำตอบ:
คำตอบนี้ใช้ได้กับ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
git add -A -pไม่ทำงานอย่างที่คาดหวัง (ถามแบบโต้ตอบเกี่ยวกับไฟล์ที่ไม่ได้ติดตาม)
git add -A :/หรือgit add -A .
git add -uได้กลายเป็นgit add -u :/กับพารามิเตอร์หลังเป็นเส้นทางที่ช่วยให้คุณ -u ไดเรกทอรีบางอย่าง:/จัดการต้นไม้ทั้งหมด
git add -uหรือgit add .โดยการทำมันทำให้ชีวิตของเขาง่ายขึ้นแม้หลังจากการบัญชีสำหรับการเพิ่มภาษีจิตพิเศษเพื่อให้แน่ใจว่าไม่มีปัญหาการซิงค์? ผมสงสัยว่าทำไม Git ไม่แยกไม่ Furthur add -uเป็นสองแยกออกคำสั่งadd -u1และadd-u2โดยหนึ่งงานสำหรับไฟล์ที่ขึ้นต้นด้วยเลขและอื่น ๆ สำหรับไฟล์ที่เริ่มต้นด้วยไม่ใช่เลข-
นี่คือตารางสำหรับความเข้าใจอย่างรวดเร็ว:
Git เวอร์ชั่น 1.x :

Git เวอร์ชั่น 2.x :

ธงแบบยาว:
git add -A เทียบเท่ากับ git add --allgit add -u เทียบเท่ากับ git add --updateอ่านเพิ่มเติม:
git add .เพียงเพิ่มไฟล์ใหม่ที่อยู่บนเส้นทางปัจจุบันเท่านั้น เช่นถ้าคุณมีไดเรกทอรีใหม่../foo, git add -Aจะเวทีมันgit add .จะไม่
git add .เทียบเท่ากับgit add -A .ซึ่งเทียบเท่ากับgit add "*"
ด้วย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 จะแตกต่างจากเวอร์ชันปัจจุบันในสถานการณ์เช่นนี้
จากคำแนะนำของ 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 ของคุณ
สิ่งต่าง ๆ เปลี่ยนไปด้วย 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 . เพิ่มไฟล์ที่ถูกแก้ไข / ลบในไดเรกทอรีปัจจุบันคำตอบด่วนที่กลั่นได้มากขึ้น:
git add -A
git add .
git add -u
git add :/+git add -u :/
ในGit 2.x :
หากคุณกำลังอยู่ตรงที่ไดเรกทอรีการทำงานแล้วgit add -Aและgit add .ทำงานได้โดยไม่ต้องแตกต่าง
ถ้าคุณอยู่ในไดเรกทอรีย่อยของใด ๆไดเรกทอรีการทำงาน , git add -Aจะเพิ่มไฟล์ทั้งหมดจากทั้งไดเรกทอรีการทำงานและgit add .จะเพิ่มไฟล์จากไดเรกทอรีปัจจุบัน
และนั่นคือทั้งหมดที่
ฉันหวังว่านี่อาจเพิ่มความชัดเจนมากขึ้น
!The syntax is
git add <limiters> <pathspec>
! Aka
git add (nil/-u/-A) (nil/./pathspec)
ตัว จำกัด อาจเป็น -u หรือ -A หรือไม่มี
Pathspec อาจเป็น filepath หรือ dot, '.' เพื่อระบุไดเรกทอรีปัจจุบัน
ความรู้พื้นฐานที่สำคัญเกี่ยวกับวิธีที่ Git 'เพิ่ม':
-Aจะมีการระบุ Dot อ้างถึงไดเรกทอรีปัจจุบันอย่างเคร่งครัด - ไม่ใช้พา ธ ที่พบด้านบนและด้านล่างตอนนี้เนื่องจากความรู้นั้นเราสามารถใช้คำตอบข้างต้น
ขีด จำกัด มีดังนี้
-u= --update= เซ็ตย่อยไปยังไฟล์ที่ถูกติดตาม => เพิ่ม = ไม่; เปลี่ยน = ใช่; ลบ = ใช่ => หากรายการนั้นถูกติดตาม-A= --all(ไม่มีเช่น-aนั้นซึ่งให้ข้อผิดพลาดทางไวยากรณ์) = superset ของไฟล์ที่ไม่ได้ติดตาม / ติดตามทั้งหมดยกเว้นใน Git ก่อน 2.0 ซึ่งจะมีการกำหนดจุด filespec ให้พิจารณาเฉพาะโฟลเดอร์นั้นเท่านั้น => หากรายการนั้นได้รับการยอมรับgit add -Aจะค้นหาและเพิ่มรายการนั้นpathspec มีดังนี้
git add -A .
git add -u .
สรุปแล้วนโยบายของฉันคือ:
git statusไฟล์ที่จะเพิ่มที่แสดงอยู่ใน.gitignoreไฟล์เพื่อให้ปกติไฟล์ที่น่าสนใจเท่านั้นที่ไม่ได้ติดตามและ / หรือไม่รู้จักgit add . เท่ากับ git add -A .เพิ่มไฟล์ไปยังดัชนีเฉพาะจากโฟลเดอร์ปัจจุบันและโฟลเดอร์ลูก
git add -A เพิ่มไฟล์เพื่อจัดทำดัชนีจากโฟลเดอร์ทั้งหมดในแผนผังการทำงาน
PS: ข้อมูลเกี่ยวข้องกับGit 2.0 (2014-05-28)
ทั้ง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นี้จะทำให้การเปลี่ยนแปลงนี้ไม่ว่าคุณจะทำตามคำสั่งจากที่ไหน
-Aตัวเลือกเพิ่ม, ปรับเปลี่ยนและลบรายการดัชนีเพื่อให้ตรงกับต้นทำงาน
ใน Git 2 -Aตัวเลือกนี้เป็นค่าเริ่มต้น
เมื่อมีการ.เพิ่มที่ จำกัด ขอบเขตของการปรับปรุงไปยังไดเรกทอรีที่คุณอยู่ในปัจจุบันตามเอกสาร Git
หากไม่
<pathspec>ได้รับเมื่อใช้ตัวเลือก -A ไฟล์ทั้งหมดในแผนผังการทำงานทั้งหมดจะได้รับการอัปเดต (Git เวอร์ชันเก่าที่ใช้เพื่อ จำกัด การอัปเดตไปยังไดเรกทอรีปัจจุบันและไดเรกทอรีย่อย)
สิ่งหนึ่งที่ฉันจะเพิ่มคือถ้าหากมีการใช้โหมด--interactiveหรือ-pแล้วgit addจะทำงานราวกับว่ามีการใช้-uธงupdate ( ) และไม่เพิ่มไฟล์ใหม่
git add *ล่ะ?