ความแตกต่างระหว่าง git switch และ git checkout <branch>


166

Git 2.23 แนะนำคำสั่งใหม่git switch- หลังจากอ่านเอกสารดูเหมือนว่าจะค่อนข้างเหมือนกับที่git checkout <branchname>ใครบางคนสามารถอธิบายความแตกต่างหรือกรณีการใช้งานได้หรือไม่?

คำสั่งใหม่สองคำสั่ง "git switch" และ "git restore" ถูกนำมาใช้เพื่อแยก "การตรวจสอบสาขาเพื่อทำงานในการพัฒนาประวัติ" และ "การตรวจสอบเส้นทางออกจากดัชนีและ / หรือ Tree-ish เพื่อทำงานในการก้าวหน้าในปัจจุบัน history "จากคำสั่ง git checkout" เดียว


2
มีบทความดีๆที่ InfoQ เกี่ยวกับหัวข้อนี้: infoq.com/news/2019/08/git-2-23-switch-restore
rsenna

คำตอบ:


180

ตามเอกสารที่คุณเชื่อมโยงไปจุดประสงค์เดียวคือเพื่อแยกและชี้แจงการใช้งานที่แตกต่างกันสองอย่างของgit checkout:

  • git switchขณะนี้สามารถใช้ในการเปลี่ยนสาขาเป็นgit checkout <branchname>ไม่
  • git restoreสามารถใช้ในการตั้งค่าไฟล์ไปแก้ไขบางอย่างเช่นgit checkout --<path_to_file>ไม่

ผู้คนสับสนกับวิธีการใช้งานต่างๆเหล่านี้git checkoutดังที่คุณเห็นจากคำถามมากมายเกี่ยวกับgit checkoutที่นี่ใน Stackoverflow ดูเหมือนว่านักพัฒนา Git จะคำนึงถึงสิ่งนี้ด้วย


32
นี่ดูเหมือนเป็นการเปลี่ยนแปลงที่ดี ทำสาขา? git checkoutสับเปลี่ยนสาขา? git checkoutรับไฟล์บางเวอร์ชันหรือไม่ git checkoutลบการเปลี่ยนแปลงในไฟล์เดียวหรือไม่ สุจริตฉันสงสัยเท่าใดของเวิร์กโฟลว์คอมไพล์ปกติสามารถทำได้ด้วยธงต่างๆเพื่อgit checkout git checkout
Captain Man

5
ตอนนี้ความคิดที่git checkoutไม่จำเป็นในทางเทคนิคแล้วหรือยัง? หรือยังคงใช้งานบางอย่างอยู่เช่นตรวจสอบการคอมมิตที่ไม่ใช่หัวสาขา (ย้ายไปที่โหมด "หัวแยก")
PieterNuyts

5
@Mike คุณจะพูดได้อย่างไรว่าการชำระเงินไม่ได้ทำให้กิ่งก้านหนึ่งประโยคหลังจากที่คุณพูดว่าการชำระเงินทำให้สาขา ไม่สำคัญว่าการทำงานภายในของ-bแฟล็ก มันยังคงทำกิ่งไม้
Captain Man

5
@CaptainMan การcheckout ดำเนินการไม่ได้สร้างสาขา แต่สามารถเปลี่ยนเป็นสาขาที่มีอยู่แล้วเท่านั้น -bตัวเลือกไปที่checkout คำสั่งภายในดำเนินการgit branchก่อนที่มันจะไม่จริงการชำระเงิน นี้เป็นเช่นเดียวกันgit pullเป็นทางลัดสำหรับ+git fetch git merge
Mike

7
หมายเหตุที่เป็นประโยชน์: สำหรับผู้ที่เคยใช้git checkout -b <branch name>คุณสามารถใช้git switch -c <branch name>เพื่อให้ได้ผลเช่นเดียวกัน
Xeuron

73

git checkout เป็นมีดสวิสที่มีการใช้งานหลายอย่างที่ไม่เกี่ยวข้องกัน

หากคุณแก้ไขไฟล์ แต่ยังไม่ได้จัดเตรียมการเปลี่ยนแปลงgit checkout <filename>จะย้อนกลับการแก้ไข ... เป็นวิธีที่ง่ายและรวดเร็วในการยกเลิกการเปลี่ยนแปลงไฟล์ คุณยังคงอยู่ในสาขาเดิม

git checkout <branchname> (ตามที่คุณสังเกตเห็น) สลับสาขา

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

การมีเป็นสองคำสั่งนั้นชัดเจนกว่า


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

@AgentM ใช่ถูกต้อง หากสาขาและไฟล์มีชื่อเดียวกันการทำgit checkout <name>จะให้ความสำคัญกับสาขาแทนไฟล์
Kartik Soneji

3

switchมีข้อ จำกัด บางประการ: ในขณะนี้คุณสามารถเปลี่ยนจากการกระทำใด ๆ เป็น<branch name>อย่างไรก็ตามเป็นไปไม่ได้ที่จะเปลี่ยนจาก <branch name>การกระทำใด ๆ ที่มีสถานะเป็นHEAD ที่แยกออกมา ดังนั้นคุณต้องใช้git checkout 5efb(โดยที่ 5efb เป็นตัวอย่างของการอ้างอิงแฮชเพื่อกระทำโดยพลการ)


3
ฉันขอยืนยันว่านี่เป็นคุณสมบัติที่แท้จริงไม่ใช่ข้อบกพร่อง (ข้อ จำกัด ) switchถูกสร้างขึ้นเพื่อจุดประสงค์เดียวในการเปลี่ยนสาขาและเมื่อคุณทำเช่นนั้นคุณต้องการอยู่ที่ HEAD ของสาขานั้น checkoutเป็นการดำเนินการทั่วไปมากขึ้นซึ่งนำสำเนาการทำงานของคุณไปสอดคล้องกับสถานะที่กำหนดในประวัติ (= กระทำ) เนื่องจากชื่อสาขาใด ๆ เป็นนามแฝงสำหรับการคอมมิต HEAD ของสาขานั้นในทางเทคนิคการตรวจสอบสาขาจึงไม่แตกต่างจากการตรวจสอบคอมมิตอื่น ๆ
Mike

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