http://norbauer.com/notebooks/code/notes/git-revert-reset-a-single-file
ฉันได้พบโพสต์
แต่ยังไม่รู้ว่าอะไรคือความแตกต่างระหว่าง
git checkout <filename>git checkout -- <filename>
ในสถานการณ์ใดฉันควรใช้ตัวแรกและตัวที่สองตามลำดับ
http://norbauer.com/notebooks/code/notes/git-revert-reset-a-single-file
ฉันได้พบโพสต์
แต่ยังไม่รู้ว่าอะไรคือความแตกต่างระหว่าง
git checkout <filename>
git checkout -- <filename>
ในสถานการณ์ใดฉันควรใช้ตัวแรกและตัวที่สองตามลำดับ
คำตอบ:
"ตัวเลือก" พิเศษ--หมายถึง "ใช้ทุกอาร์กิวเมนต์หลังจากจุดนี้เป็นชื่อไฟล์ไม่ว่าจะมีลักษณะอย่างไรก็ตาม" นี่ไม่ใช่ Git โดยเฉพาะ แต่เป็นแบบแผนบรรทัดคำสั่งทั่วไปของ Unix โดยปกติคุณใช้เพื่อชี้แจงว่าอาร์กิวเมนต์เป็นชื่อไฟล์แทนที่จะเป็นตัวเลือกเช่น
rm -f # does nothing
rm -- -f # deletes a file named "-f"
git checkout1ยัง--หมายความว่าอาร์กิวเมนต์ที่ตามมาไม่ใช่พารามิเตอร์ "treeish" ที่เป็นทางเลือกซึ่งระบุว่าคุณต้องการคอมมิตใด
ดังนั้นในบริบทนี้จึงปลอดภัยที่จะใช้--เสมอ แต่คุณต้องใช้เมื่อไฟล์ที่คุณต้องการเปลี่ยนกลับมีชื่อที่ขึ้นต้นด้วย-หรือเหมือนกับชื่อของสาขา ตัวอย่างบางส่วนสำหรับการแยกย่อยสาขา / ไฟล์:
git checkout README # would normally discard uncommitted changes
# to the _file_ "README"
git checkout master # would normally switch the working copy to
# the _branch_ "master"
git checkout -- master # discard uncommitted changes to the _file_ "master"
และตัวเลือก / ไฟล์ disambiguation:
git checkout -p -- README # interactively discard uncommitted changes
# to the file "README"
git checkout -- -p README # unconditionally discard all uncommitted
# changes to the files "-p" and "README"
ผมไม่แน่ใจว่าสิ่งที่คุณทำถ้าคุณมีสาขา-ชื่อซึ่งเริ่มต้นด้วย บางทีอย่าทำอย่างนั้นตั้งแต่แรก
1ในโหมดนี้ "checkout" สามารถทำอย่างอื่นได้หลายอย่างเช่นกัน ฉันไม่เคยเข้าใจว่าเหตุใด git จึงเลือกใช้ "ทิ้งการเปลี่ยนแปลงที่ไม่ได้ผูกมัด" เป็นโหมดของคำสั่งย่อย "checkout" แทนที่จะ "ย้อนกลับ" เหมือน VCSes อื่น ๆ ส่วนใหญ่หรือ "รีเซ็ต" ซึ่งฉันคิดว่าอาจเหมาะสมกว่าในเงื่อนไขของ git เอง
--เนื่องจากตัวเลือกและอาร์กิวเมนต์ถูกนำไปใช้อย่างกว้างขวาง ใช้งานได้กับโปรแกรม / ยูทิลิตี้ใด ๆ ที่ใช้ POSIX getopt(3)เพื่อจัดการกับตัวเลือกบรรทัดคำสั่ง (ดูman 3 getopt) เชลล์สคริปต์ที่ใช้getopt(1)และบางโปรแกรมที่ใช้งานด้วยตนเอง แต่ไม่รับประกันว่าจะใช้งานได้ในระดับสากล
--หมายถึง 'ลบล้างการเปลี่ยนแปลง' a la C / C ++ - และคิดมาตั้งแต่นั้นเป็นต้นมา ใจปลิว!
สิ่งที่ตามมา--จะถือว่าเป็นชื่อไฟล์ (ไม่ใช่อาร์กิวเมนต์ของโปรแกรม) นี่เป็นสิ่งสำคัญเช่นหากคุณมีชื่อไฟล์ที่ขึ้นต้นด้วยขีดกลาง