ความแตกต่างระหว่าง“ git checkout <filename>” และ“ git checkout - - <filename>”


115

http://norbauer.com/notebooks/code/notes/git-revert-reset-a-single-file

ฉันได้พบโพสต์

แต่ยังไม่รู้ว่าอะไรคือความแตกต่างระหว่าง

  1. git checkout <filename>

  2. git checkout -- <filename>

ในสถานการณ์ใดฉันควรใช้ตัวแรกและตัวที่สองตามลำดับ


1
ดูยังหมายของ Git Checkout ขีดกลางคู่

คำตอบ:


214

"ตัวเลือก" พิเศษ--หมายถึง "ใช้ทุกอาร์กิวเมนต์หลังจากจุดนี้เป็นชื่อไฟล์ไม่ว่าจะมีลักษณะอย่างไรก็ตาม" นี่ไม่ใช่ 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 เอง


12
git checkout <name> ตรวจสอบสาขา <name> git checkout - <name> ตรวจสอบเวอร์ชันดัชนีของไฟล์ <name>
dunni

3
ขอบคุณน่าเสียดายที่เอกสารคอมไพล์อธิบายเรื่องนี้ไม่ได้จริงๆ
Carlton

1
เกี่ยวกับ "Unix convention": --เนื่องจากตัวเลือกและอาร์กิวเมนต์ถูกนำไปใช้อย่างกว้างขวาง ใช้งานได้กับโปรแกรม / ยูทิลิตี้ใด ๆ ที่ใช้ POSIX getopt(3)เพื่อจัดการกับตัวเลือกบรรทัดคำสั่ง (ดูman 3 getopt) เชลล์สคริปต์ที่ใช้getopt(1)และบางโปรแกรมที่ใช้งานด้วยตนเอง แต่ไม่รับประกันว่าจะใช้งานได้ในระดับสากล
arielf

ฮะ! ฉันเพิ่งอ่านตัวอย่างย้อนกลับไปเมื่อวิธียกเลิกการเปลี่ยนแปลงการทำงานโดยลืมที่จะเห็นการประชุมนี้ในโปรแกรมบรรทัดคำสั่งอื่น ๆ โดยถือว่านั่น--หมายถึง 'ลบล้างการเปลี่ยนแปลง' a la C / C ++ - และคิดมาตั้งแต่นั้นเป็นต้นมา ใจปลิว!
underscore_d

สำหรับคนอย่างฉัน: อย่าสับสนกับชื่อ master เขาหมายถึงไฟล์ชื่อ master ไม่ใช่สาขา
HarsH

7

สิ่งที่ตามมา--จะถือว่าเป็นชื่อไฟล์ (ไม่ใช่อาร์กิวเมนต์ของโปรแกรม) นี่เป็นสิ่งสำคัญเช่นหากคุณมีชื่อไฟล์ที่ขึ้นต้นด้วยขีดกลาง

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