Score:13

git add * และ git add ต่างกันอย่างไร?

ธง us

อะไรคือความแตกต่างระหว่างคำสั่ง คอมไพล์เพิ่ม * และ คอมไพล์เพิ่ม . เมื่อฉันใส่พารามิเตอร์ * และ . ตาม? รายการใดของระบบไฟล์ที่ส่งคืนในทั้งสองกรณี

in flag
eis
ดู: [stackoverflow: git add * (เครื่องหมายดอกจัน) vs git add (ระยะเวลา)](https://stackoverflow.com/questions/26042390/git-add-asterisk-vs-git-add-period)
ag flag
ขึ้นอยู่กับตัวแปลคำสั่งที่คุณใช้ในการเรียกใช้งาน git จาก
Score:32
ธง jp
Dan
  • * เป็น bash glob มันจะขยายไปยังไฟล์ทั้งหมดในไดเร็กทอรีที่คุณอยู่ ยกเว้น dotfiles (ไฟล์ที่ขึ้นต้นด้วยจุด (.)).
  • . หมายถึงไดเรกทอรีปัจจุบัน

ผลลัพธ์อาจแตกต่างกันมากขึ้นอยู่กับเนื้อหาในไดเร็กทอรีของคุณและหากคุณมี .gitignore ไฟล์.

พิจารณาว่าคุณมีไฟล์และไดเร็กทอรีต่อไปนี้ในไดเร็กทอรีของคุณ:

.dotfile-ที่ต้องกระทำ
.git/
.gitignore
บางไฟล์ที่อยู่ใน gitignore
ไฟล์อื่น ๆ

เมื่อคุณวิ่ง คอมไพล์เพิ่ม *, glob ถูกขยายก่อนที่คำสั่ง git จะทำงาน ดังนั้นสิ่งที่คำสั่ง git ได้รับมีดังนี้:

git เพิ่มไฟล์บางไฟล์ที่อยู่ใน gitignore ไฟล์อื่น ๆ

สิ่งนี้ทำให้เกิดปัญหาสี่ประการที่นี่

  1. Git จะบ่นว่า บางไฟล์ที่อยู่ใน gitignore ไม่สามารถเพิ่มได้และจะขอให้คุณเพิ่มแรง (-ฉ) อาร์กิวเมนต์ถ้าคุณต้องการเพิ่มจริงๆ
  2. ทั้งสอง .dotfile-ที่ต้องกระทำ และ .gitignore ไม่ได้เพิ่มเป็น * ไม่ขยายเป็น dotfiles
  3. หากคุณลบไฟล์ในไดเร็กทอรีที่คุณอยู่ * ไม่สามารถขยายไปยังไฟล์เหล่านั้นได้ ดังนั้นไฟล์ที่ถูกลบจะไม่ถูกจัดฉาก
  4. หากคุณเปลี่ยนชื่อไฟล์ในไดเร็กทอรีที่คุณอยู่ * ไม่สามารถขยายไปยังชื่อเก่า แต่จะขยายไปยังชื่อใหม่ ดังนั้นสิ่งที่ git จะเห็นคือคุณเพิ่มไฟล์ใหม่ และเนื่องจากชื่อเก่าไม่ได้ถูกจัดฉาก คุณจึงลงเอยด้วยไฟล์เดิมที่มีอยู่สองครั้ง โดยใช้ชื่อเก่าและชื่อใหม่

อย่างไรก็ตามการวิ่ง คอมไพล์เพิ่ม . บอกให้ git เพิ่มไดเร็กทอรีปัจจุบันที่คุณอยู่โดยไม่ระบุว่าจะเพิ่มไฟล์ใด ในกรณีนี้ git จะตรวจสอบ .gitignore ไฟล์และเพิ่มไฟล์ทั้งหมดที่ไม่ได้กล่าวถึงซ้ำ .gitignore.

สรุป:

  • คุณควรใช้ คอมไพล์เพิ่ม . ไม่ คอมไพล์เพิ่ม *.

ดียิ่งขึ้น:

  • ใช้ git เพิ่มเต็ม / ไฟล์ / เส้นทาง คุณจึงไม่เพิ่มสิ่งที่ไม่พร้อมจะเพิ่มโดยไม่ตั้งใจ

และดียิ่งขึ้น:

  • ใช้ คอมไพล์เพิ่ม -p เพื่อตรวจสอบการเปลี่ยนแปลงของคุณ และเลือกและเลือกโปรแกรมแก้ไขที่คุณต้องการเพิ่ม
in flag
ที่ดียิ่งขึ้น: `git add be/explicit` คุณไม่ควรใช้ทั้ง `git add *` หรือ `git add .` เพราะคุณควรไตร่ตรองให้มากกว่านี้เกี่ยวกับสิ่งที่คุณจะเพิ่มลงใน git
st flag
แม้ว่าโดยส่วนตัวแล้วฉันเป็นแฟนตัวยงของ `git add -p` และใช้มันตลอดเวลา แต่ก็ควรสังเกตว่ามีอันตรายใหญ่หลวงที่เกี่ยวข้องกับมัน นั่นคือคุณกำลังแสดงสถานะที่ไม่เคยมีมาก่อนในสิ่งนี้ แบบฟอร์มบนดิสก์และดังนั้นจึงไม่เคยได้รับการทดสอบ ด้วยเหตุนี้ จึงถูกแบนในคู่มือการใช้งาน Git ในบางองค์กร
John C avatar
tr flag
ฉันยังเห็นด้วยกับการใช้ `git add .` แต่จะสังเกตว่ามันเป็นไดเร็กทอรีปัจจุบันและด้านล่าง - ดังนั้นหากคุณบังเอิญอยู่ใน subdir (เช่น ที่ command-line ไม่ใช่เครื่องมือ GUI) คุณจะ' t เพิ่มการเปลี่ยนแปลงใด ๆ ในไดเร็กทอรีระดับบน ฉันมักจะทำ `git status` ต่อไป เพื่อให้แน่ใจว่าฉันจะไม่พลาดอะไรไป
David Z avatar
es flag
@JörgWMittag น่าสนใจ... แม้ว่าฉันจะเถียงว่าอันตรายจะเกิดขึ้นก็ต่อเมื่อคุณไม่กลับไปทดสอบการกระทำที่เกิดขึ้นการทำแบบทดสอบนั้นเป็นสิ่งที่สมเหตุสมผลที่จะทำและคาดหวังจากผู้คน ดังนั้นโดยส่วนตัวแล้วฉันไม่เห็นด้วยที่ควรสังเกต ฉันคิดว่ามันจะเป็นการเบี่ยงเบนความสนใจมากกว่าที่จะเพิ่มเข้าไปในคำตอบ
in flag
eis
คำตอบนี้ค่อนข้างยาวและยังทิ้งสิ่งสำคัญทั้งหมดไว้ กรณีการใช้งานที่สำคัญที่สุดสำหรับการใช้ดอทคือ 1) ไดเร็กทอรีย่อยทั้งหมด และ 2) การลบ/เปลี่ยนชื่อทั้งหมด ซึ่งไม่ได้กล่าวถึงในที่นี้ด้วยซ้ำ
jp flag
Dan
@eis คุณพูดถูกเกี่ยวกับการลบ/เปลี่ยนชื่อ ฉันจะเพิ่มรายละเอียดเกี่ยวกับสิ่งเหล่านั้น แต่สำหรับไดเร็กทอรีย่อย `git add .` และ `git add *` จะทำงานในลักษณะเดียวกันตราบใดที่ชื่อไม่มีจุด
Score:3
ธง in

สิ่งอื่นที่ไม่ได้ชี้ให้เห็นโดยคำตอบในปัจจุบันก็คือ คอมไพล์เพิ่ม * จะไม่แจ้งว่าคุณได้ลบหรือเปลี่ยนชื่อไฟล์ใด ๆ แต่ คอมไพล์เพิ่ม . จะ.

Score:2
ธง my

สรุปสั้น ๆ

คอมไพล์เพิ่ม * หมายถึง เพิ่มไฟล์ทั้งหมดในไดเร็กทอรีปัจจุบัน ยกเว้นไฟล์ที่ชื่อขึ้นต้นด้วยจุด นี่คือการทำงานของเชลล์และ Git จะรับเฉพาะรายการไฟล์เท่านั้น


คอมไพล์เพิ่ม . ไม่มีความหมายพิเศษในเชลล์ของคุณ ดังนั้น Git จึงเพิ่มไดเร็กทอรีทั้งหมดซ้ำ ซึ่งเกือบจะเหมือนกัน แต่รวมถึงไฟล์ที่ชื่อขึ้นต้นด้วยจุด


คำตอบดัดแปลงมาจาก stackoverflow

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา