ฉันพยายามที่จะเรียนรู้วิธีการที่จะเรียกคืนหรือไฟล์ย้อนกลับและโครงการไปยังรัฐก่อนและไม่เข้าใจความแตกต่างระหว่างgit revert
, และcheckout
reset
เหตุใดจึงมี 3 คำสั่งต่างกันสำหรับวัตถุประสงค์เดียวกันและเมื่อมีคนควรเลือกคำสั่งอื่น
ฉันพยายามที่จะเรียนรู้วิธีการที่จะเรียกคืนหรือไฟล์ย้อนกลับและโครงการไปยังรัฐก่อนและไม่เข้าใจความแตกต่างระหว่างgit revert
, และcheckout
reset
เหตุใดจึงมี 3 คำสั่งต่างกันสำหรับวัตถุประสงค์เดียวกันและเมื่อมีคนควรเลือกคำสั่งอื่น
คำตอบ:
คำสั่งทั้งสามนี้มีจุดประสงค์ที่แตกต่างกันโดยสิ้นเชิง พวกเขาไม่ได้คล้ายกันจากระยะไกล
git revert
คำสั่งนี้สร้างการคอมมิชชันใหม่ที่เลิกทำการเปลี่ยนแปลงจากการคอมมิชชันก่อนหน้า คำสั่งนี้จะเพิ่มประวัติใหม่ให้กับโครงการ (ไม่ได้แก้ไขประวัติที่มีอยู่)
git checkout
คำสั่งนี้เช็กเอาต์เนื้อหาจากที่เก็บและวางไว้ในแผนผังการทำงานของคุณ นอกจากนี้ยังสามารถมีผลกระทบอื่น ๆ ขึ้นอยู่กับวิธีการเรียกใช้คำสั่ง ตัวอย่างเช่นมันสามารถเปลี่ยนสาขาที่คุณกำลังทำงานอยู่ คำสั่งนี้จะไม่ทำการเปลี่ยนแปลงใด ๆ ในประวัติศาสตร์
git reset
คำสั่งนี้ซับซ้อนกว่าเล็กน้อย จริงๆแล้วมันมีสองสิ่งที่แตกต่างกันขึ้นอยู่กับว่ามันถูกเรียกใช้อย่างไร มันปรับเปลี่ยนดัชนี (ที่เรียกว่า "พื้นที่การแสดงละคร") หรือเปลี่ยนแปลงที่กระทำการกระทำส่วนหัวสาขากำลังชี้ไปที่ คำสั่งนี้อาจแก้ไขประวัติที่มีอยู่ (โดยการเปลี่ยนการกระทำที่อ้างอิงสาขา)
หากมีการกระทำที่เกิดขึ้นในประวัติศาสตร์ของโครงการและคุณตัดสินใจในภายหลังว่าการกระทำนั้นผิดและไม่ควรทำสิ่งนั้นgit revert
เป็นเครื่องมือสำหรับงาน มันจะยกเลิกการเปลี่ยนแปลงที่นำเสนอโดยการกระทำที่ไม่ดีบันทึก "เลิกทำ" ในประวัติศาสตร์
หากคุณได้แก้ไขไฟล์ในแผนผังการทำงานของคุณ แต่ยังไม่ได้ยืนยันการเปลี่ยนแปลงคุณสามารถใช้git checkout
เพื่อชำระเงินสำเนาไฟล์สดจากที่เก็บ
หากคุณได้กระทำ แต่ไม่ได้แชร์กับใครและคุณตัดสินใจว่าคุณไม่ต้องการคุณสามารถใช้git reset
เพื่อเขียนประวัติใหม่เพื่อให้ดูเหมือนกับว่าคุณไม่เคยทำสิ่งนั้น
นี่เป็นเพียงบางส่วนของสถานการณ์การใช้งานที่เป็นไปได้ มีคำสั่งอื่น ๆ ที่อาจเป็นประโยชน์ในบางสถานการณ์และคำสั่งสามข้อข้างต้นก็มีประโยชน์อื่นเช่นกัน
git reset
และgit checkout
สามารถทำสิ่งเดียวที่แน่นอน การบอกว่าพวกเขา "ไม่เหมือนกันจากระยะไกล" ไม่ใช่แค่พูดเกินจริงมากเกินไป: มันไม่ใช่เรื่องจริงจากระยะไกล คำสั่งทั้งสองนี้สามารถทำสิ่งต่าง ๆ มากมายซึ่งบางคำซ้อนทับกันอย่างสมบูรณ์ ตัวอย่าง: git reset --hard
และgit checkout -- .
จะทำสิ่งเดียวกันแน่นอน และการพูดอย่างมีเหตุผลgit reset --hard <path>
และgit checkout <path>
ควรทำสิ่งเดียวกัน - git แต่ป้องกันคุณจากการทำเช่นนั้น ความสับสนของสองคำสั่งนี้ง่ายมาก
git reset --hard <path>
เช่นคุณสามารถgit checkout <path>
แม่นยำเพราะทั้งสองคำสั่งทำบางสิ่งบางอย่างสมบูรณ์ที่แตกต่างกัน git reset
บอกให้ Git ย้าย HEAD ไปที่การคอมมิชชันอื่น git checkout
ในทางกลับกันไม่ขอให้ Git ทำอะไรกับ HEAD เลย มันออกจาก HEAD เพียงอย่างเดียวและเพียงตรวจสอบไฟล์ ใช่คุณสามารถสร้างมันได้ในแบบที่พวกเขามีเอฟเฟกต์ที่คล้ายกัน แต่สิ่งที่พวกเขาทำจริงต่างกันโดยสิ้นเชิง
สมมติว่าคุณมีความมุ่งมั่น:
C
B
A
git revert B
B
จะสร้างกระทำที่เลิกทำการเปลี่ยนแปลงใน
git revert A
จะสร้างการกระทำที่เลิกทำการเปลี่ยนแปลงA
แต่จะไม่แตะต้องการเปลี่ยนแปลงB
โปรดทราบว่าหากการเปลี่ยนแปลงB
ขึ้นอยู่กับการเปลี่ยนแปลงA
การเปลี่ยนกลับA
จะไม่สามารถทำได้
git reset --soft A
จะเปลี่ยนประวัติการกระทำและที่เก็บ; C
การแสดงละครและไดเรกทอรีการทำงานจะยังคงอยู่ในสถานะของ
git reset --mixed A
จะเปลี่ยนประวัติการกระทำที่เก็บและการจัดเตรียม; C
ไดเรกทอรีการทำงานจะยังคงอยู่ในสถานะของ
git reset --hard A
จะเปลี่ยนประวัติการกระทำที่เก็บข้อมูลการจัดเตรียมและไดเรกทอรีการทำงาน; คุณจะกลับไปสู่สถานะA
สมบูรณ์
git revert
ใช้เพื่อเลิกทำการคอมมิชชันก่อนหน้า ในคอมไพล์คุณไม่สามารถแก้ไขหรือลบการกระทำก่อนหน้านี้ (อันที่จริงคุณสามารถ แต่อาจทำให้เกิดปัญหา) ดังนั้นแทนที่จะแก้ไขการกระทำก่อนหน้านี้ย้อนกลับแนะนำการกระทำใหม่ที่กลับรายการก่อนหน้านี้git reset
ใช้เพื่อเลิกทำการเปลี่ยนแปลงในไดเร็กทอรีการทำงานของคุณที่ยังไม่ได้ทำการเขียนgit checkout
ใช้เพื่อคัดลอกไฟล์จากการคอมมิตอื่นไปยังแผนผังการทำงานปัจจุบันของคุณ มันไม่ได้กระทำไฟล์โดยอัตโนมัติgit reset --soft
รีเซ็ต HEAD เท่านั้นgit reset --hard
รีเซ็ต HEAD และไดเรกทอรีการทำงานของคุณ
git checkout
ปรับเปลี่ยนแผนผังการทำงานของคุณgit reset
ปรับเปลี่ยนการอ้างอิงสาขาที่คุณกำลังจะชี้ไปที่git revert
เพิ่มการเปลี่ยนแปลงการเลิกคอมมิทgit reset
ไม่เพียงแค่แก้ไขการคอมมิชชันที่ชี้ไปยังมันยังใช้เพื่อ unstage ไฟล์จากดัชนีและสามารถแก้ไขสำเนาการทำงานด้วยgit reset --mixed
(ค่าเริ่มต้น)
รีเซ็ต - ในระดับกระทำการรีเซ็ตเป็นวิธีการย้ายปลายของสาขาไปยังการกระทำที่แตกต่าง สามารถใช้เพื่อลบการผูกมัดจากสาขาปัจจุบัน
ย้อนกลับ - ย้อนกลับยกเลิกการกระทำโดยการสร้างการกระทำใหม่ นี่เป็นวิธีที่ปลอดภัยในการเลิกทำการเปลี่ยนแปลงเนื่องจากไม่มีโอกาสเขียนประวัติการกระทำซ้ำ ตรงกันข้ามสิ่งนี้ด้วยการรีเซ็ต git ซึ่งจะเปลี่ยนแปลงประวัติการกระทำที่มีอยู่ ด้วยเหตุผลนี้จึงควรใช้การย้อนกลับ git เพื่อเลิกทำการเปลี่ยนแปลงในสาขาสาธารณะและควรรีเซ็ต git เพื่อการยกเลิกการเปลี่ยนแปลงในสาขาส่วนตัว
คุณสามารถดูได้ที่ลิงค์นี้ - รีเซ็ตชำระเงินและย้อนกลับ
หากคุณทำลายต้นไม้ แต่ไม่ยอมรับรหัสคุณสามารถใช้ git reset
git checkout
และถ้าคุณเพียงต้องการที่จะเรียกคืนไฟล์เดียวคุณสามารถใช้
git revert HEAD
หากคุณยากจนต้นไม้และมุ่งมั่นที่รหัสที่คุณสามารถใช้
http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html