คำสั่งที่ดูเหมือนจะเป็นเหมือนกับ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 -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
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 --all
git 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 *
ล่ะ?