git add * (ดอกจัน) เทียบกับ git add (ระยะเวลา)


130

ฉันเพิ่งเริ่มใช้คอมไพล์และมีคำถามเกี่ยวกับการเพิ่มไฟล์ในคอมไพล์ ฉันได้พบคำถาม StackOverflow หลายเกี่ยวกับความแตกต่างระหว่างgit add .และgit add -a, git add --all, git add -Aฯลฯ แต่ฉันไม่สามารถที่จะหาสถานที่อธิบายถึงสิ่งที่git add *ไม่ ฉันเคยดูหน้าgit add manด้วยซ้ำ แต่ก็ไม่ได้ช่วยอะไร ฉันใช้มันแทนgit add .และเพื่อนร่วมงานของฉันถามฉันว่าทำไม ฉันไม่มีคำตอบ git add *ผมเคยใช้เพียงแค่เสมอ

มีgit add .และgit add *เดียวกันได้หรือไม่ หนึ่งเพิ่มไฟล์ที่เปลี่ยนแปลงจากไดเร็กทอรีปัจจุบันเท่านั้นในขณะที่อีกไฟล์เพิ่มไฟล์จากไดเร็กทอรีปัจจุบันและไดเร็กทอรีย่อย (เรียกซ้ำ) หรือไม่

มีแผนภูมิที่ดีที่ระบุไว้ในหนึ่งในคำถามที่สแต็คอื่น ๆ เป็นเรื่องที่แสดงให้เห็นถึงความแตกต่างระหว่างgit add -A git add .และแต่ก็ไม่ได้มีgit add -ugit add *

ใส่คำอธิบายภาพที่นี่

หมายเหตุ: ฉันเข้าใจความหมายของการใช้เครื่องหมายดอกจันเป็นสัญลักษณ์แทน (เพิ่มไฟล์ทั้งหมดที่มีนามสกุลที่กำหนด) ยกตัวอย่างเช่นgit add *.htmlจะเพิ่มไฟล์ทั้งหมดที่มี.htmlส่วนขยาย ( แต่ไม่สนใจ.css, .jsฯลฯ )

ขอบคุณสำหรับความช่วยเหลือ!


1
แผนภูมินั้นมาจากไหน? ฉันเพิ่งลองgit add .อีกครั้งและจัดเตรียมไฟล์ที่ถูกลบโดยไม่มีปัญหาซึ่งแตกต่างจากXแถวนั้นที่จะแนะนำ
David

@David ภาพนั้นมาจากคำตอบนี้และใช้กับ git เวอร์ชันเก่ากว่า
jerry

4
ภาพล้าสมัย! Git 2.x แตกต่างกัน: i.stack.imgur.com/KwOLu.jpg
Hannes Schneidermayer

คำตอบ:


132

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

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


6
ดังนั้นgit add .เพิ่มไฟล์โฟลเดอร์และโฟลเดอร์ย่อยทั้งหมดรวมถึง. gitignore และสิ่งอื่นใดที่ขึ้นต้นด้วยจุดในขณะที่git add *จะเพิ่มไฟล์โฟลเดอร์และโฟลเดอร์ย่อยใด ๆ ยกเว้นไฟล์ที่ขึ้นต้นด้วยจุด? ว่าแม่นมั้ย?
Tyler Youngblood

9
ที่ถูกต้องแน่นอน นอกจากนี้git add *ยังคงเพิ่มไฟล์ที่ขึ้นต้นด้วยจุดหากอยู่ในไดเร็กทอรีย่อย
Denis

4
git add .ยังเคารพ. gitignore ในขณะที่git add *จะทำให้เกิดข้อผิดพลาดหากไฟล์ใด ๆ ที่ไม่ใช่จุดถูก gitignored ใช้ดีgit add .กว่าgit add *.
rosuav

2
ที่น่าสังเกต: หากเรียกใช้ Git บน DOS / Windows จาก CMD.EXE มันคือGitไม่ใช่เชลล์ที่ขยายไฟล์*. ในกรณีนี้ Git จะค้นหา dot-files
torek

2
@ Thor84no: Git จะค้นหา dot-files แม้กระทั่งในระบบ Linux หากคุณอ้างถึง*เพื่อป้องกันจากเชลล์ ไม่ใช่เรื่องของบิตที่ซ่อนอยู่ แต่เป็นเพียงกฎที่คอมไพล์อินของ Git แตกต่างกัน
torek

30

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


1
ดังนั้นทุกคนจะมีเหตุผลที่จะใช้เครื่องหมายดอกจันหรือไม่? มีประโยชน์ในการใช้แทนช่วงเวลาหรือไม่? หรือในทางกลับกัน? ฉันแน่ใจว่าฉันเห็นมันในบทแนะนำ ฉันคงไม่รู้จักใช้มันเป็นอย่างอื่น ฉันไม่ใช่คนชอบใช้คำสั่งมากนัก (อย่างที่คุณเดาได้อย่างไม่ต้องสงสัย)
Tyler Youngblood

5
*หลีกเลี่ยงไฟล์ที่ซ่อนอยู่ (เช่นไฟล์ที่ชื่อขึ้นต้นด้วย a .) ไม่ว่าในกรณีใดหากคุณไม่ได้เพิ่มไฟล์ใดไฟล์หนึ่งฉันแค่ใช้git add -u(หรือgit add -Aถ้าคุณกำลังสร้างไฟล์ใหม่)
Mureinik

3
เนื่องจากคุณทั้งสองตอบคำถามของฉันฉันจึงมีปัญหาในการตัดสินใจว่าจะให้เครดิตกับใคร ฉันเลือกเดนิสด้านล่างเพราะเขามีตัวแทนน้อยกว่าคุณ ดังนั้นฉันคิดว่าการให้เช็คเขียวแก่เขาจะเป็นประโยชน์ต่อเขามากกว่าที่จะเป็นประโยชน์ต่อคุณ ฉันหวังว่ามันจะสมเหตุสมผล? แต่ฉันขอขอบคุณคำอธิบายทั้งสองอย่างมาก ขอบคุณ!
Tyler Youngblood

7

การใช้จุด. ในเชลล์มักจะหมายถึง "ไดเรกทอรีปัจจุบัน"

เมื่อคุณใช้เครื่องหมายดอกจัน*บนเชลล์คุณลักษณะที่เรียกว่าfile-globbingจะถูกใช้ เช่นเมื่อทุบตีฟังก์ชั่นglob()ก็ทำเช่นนั้น manpage สำหรับ glob ( man 7 glob) ระบุ:

รายละเอียด

Long ago, in UNIX V6, there was a program /etc/glob that would expand 
wildcard patterns.  Soon afterward this became a shell built-in.
These days there is also a library routine glob(3) that will perform this 
function for a user program.

การจับคู่สัญลักษณ์แทน

A string is a wildcard pattern  if it contains one of the characters '?', '*' or '['. 

globbing

Globbing is the operation that expands a wildcard pattern 
into the list of pathnames matching the pattern.

นั่นหมายความว่าเมื่อคุณผ่านการขัดแย้งในการเขียนโปรแกรมใด ๆ บน commandline ที่มี'?', '*'หรือ'[', globbing แรกขยายรูปแบบสัญลักษณ์แทนเข้าไปในรายชื่อของไฟล์และจากนั้นให้ไฟล์เหล่านี้เป็นอาร์กิวเมนต์โปรแกรมตัวเอง

ความแตกต่างในความหมายระหว่าง'git add .'และ'git add *'อธิบายไว้อย่างชัดเจนโดยเดนิส :

git addคาดว่าจะมีการเพิ่มรายการไฟล์ ในตัวอย่างด้านบนเชลล์จะขยาย*หรือ.ตามลำดับและให้ผลลัพธ์เป็นพารามิเตอร์เพื่อคอมไพล์เพิ่ม ตอนนี้ความแตกต่างคือเมื่อใช้git add .คอมไพล์จะขยายไปยังไดเร็กทอรีปัจจุบันในขณะที่git add *ทริกเกอร์ไฟล์ globbing และจะขยายไปยังไฟล์และไดเร็กทอรีทั้งหมดที่ไม่ได้ขึ้นต้นด้วยจุด


5

เพื่อความชัดเจนฉันใส่คำตอบไว้ในตารางด้านล่าง:

ใส่คำอธิบายภาพที่นี่

หมายเหตุเพิ่มเติม (ได้รับแรงบันดาลใจจากความคิดเห็น @ reka18):

หมายเหตุ 1. git add -Aและgit add -uคำสั่งที่ดำเนินการโดยไม่มีพารามิเตอร์เพิ่มเติมจะเป็นการปรับแต่งเพิ่มเติม (ไดเร็กทอรีย่อยหรือตัวบ่งชี้มาสก์สำหรับชื่อไฟล์) ทำงานในช่วงของไดเร็กทอรีการทำงานทั้งหมด (เช่นกันหากเรารันคำสั่งในไดเร็กทอรีย่อยที่ใช้งานได้ของไดเร็กทอรี)

หมายเหตุ 2..และ*เป็นลำดับเส้นทางไดเรกทอรี (ไดเรกทอรีปัจจุบัน) และตัวแทนซึ่งชี้แจงเส้นทางของคำสั่ง ตัวอย่างเช่นหากคำสั่งgit add .หรือgit add *ถูกเรียกใช้ในไดเร็กทอรีย่อยบางรายการของไดเร็กทอรีการทำงานการดำเนินการจะถูกใช้ภายในไดเร็กทอรีย่อยนี้เท่านั้นไม่ใช่ไดเร็กทอรีการทำงานทั้งหมด

หมายเหตุ 3.git add -Aและgit add -uคำสั่งที่สามารถกลั่นต่อไปโดยการเพิ่มเส้นทางหรือหน้ากากสำหรับไฟล์ตัวอย่างเช่นหรือgit add -A app/controllersgit add -u app\styles\*


2
เช่นเดียวกับ Git v2.x git add -Aและgit add .เหมือนกันหรือไม่?
reka18

ขอบคุณ @ reka18 สำหรับคำถามที่ดีมาก มันเป็นแรงบันดาลใจให้ฉันตอบคำถามให้สมบูรณ์ ... คำตอบสำหรับคำถามของคุณ: ถ้าคุณเรียกมันในไดเร็กทอรีการทำงานไม่ใช่ แต่ถ้าอยู่ในไดเร็กทอรีย่อยใช่ ( git add -Aใช้กับไดเร็กทอรีการทำงานทั้งหมดและgit add .ไดเร็กทอรีปัจจุบันเสมอ)
simhumileco

2
  • git add -A (- ทั้งหมด) เพิ่มทุกอย่างเพื่อให้ทุกอย่างในโฟลเดอร์ของคุณบนดิสก์แสดงในพื้นที่จัดเตรียม

  • git add . ขั้นตอนทุกอย่าง แต่ไม่ลบไฟล์ที่ถูกลบออกจากดิสก์

  • git add * ขั้นตอนทุกอย่าง แต่ไม่ใช่ไฟล์ที่ขึ้นต้นด้วยจุด & ไม่ลบไฟล์ที่ลบออกจากดิสก์

  • git add -u (- อัปเดต) ขั้นตอนเฉพาะไฟล์ที่แก้ไขลบไฟล์ที่ถูกลบออกจากดิสก์ไม่เพิ่มใหม่

  • git add <file name 1> <file name 2> เพิ่มเฉพาะบางไฟล์

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