จะกลับไปใช้ Git รุ่นล่าสุดได้อย่างไร


303

ฉันเพิ่งย้ายจาก SVN ไป Git และสับสนเล็กน้อยเกี่ยวกับบางสิ่งบางอย่าง ฉันต้องการเรียกใช้สคริปต์เวอร์ชันก่อนหน้าผ่านตัวดีบักดังนั้นฉันจึงทำgit checkout <previous version hash>และทำสิ่งที่ฉันต้องทำ

ตอนนี้ฉันต้องการกลับไปเป็นเวอร์ชั่นใหม่ล่าสุด แต่ฉันไม่รู้แฮชสำหรับมัน เมื่อฉันพิมพ์git logฉันไม่เห็นมัน

ฉันจะทำสิ่งนี้ได้อย่างไร นอกจากนี้ยังมีวิธีที่ง่ายกว่าในการเปลี่ยนรุ่นต่าง ๆ โดยการพิมพ์แฮช - เช่น "ย้อนกลับสองรุ่น" หรือ "ไปตามลำดับเหตุการณ์ล่าสุด"

คำตอบ:


371

git checkout masterควรทำเคล็ดลับ หากต้องการย้อนกลับสองเวอร์ชันคุณสามารถพูดได้ว่าชอบgit checkout HEAD~2แต่ควรสร้างสาขาชั่วคราวตามเวลานั้นgit checkout -b temp_branch HEAD~2


7
เย็น! git checkout masterเป็นวิธีที่ฉันเปลี่ยนกลับจากสาขา นั่นหมายความว่าเมื่อฉันตรวจสอบรุ่นก่อนหน้าฉันกำลังสร้างสาขาเป็นหลัก
นาธานลอง

4
@ นาธาน: ในคอมไพล์สาขาส่วนใหญ่เป็นตัวชี้แบบเคลื่อนย้ายได้ไปสู่การแก้ไขบางอย่าง ดังนั้นแนวคิดคุณจะสร้างสาขา แต่ไม่ใช่ในแง่ที่คอมไพล์คิดถึงสาขา
DLH

2
ดังนั้นในกรณีที่ง่ายที่สุดที่ฉันได้รับการเปลี่ยนแปลงเชิงเส้นเมื่อฉันเช็คเอาต์การแก้ไขก่อนหน้าฉันกำลังย้ายตัวชี้ HEAD ที่นั่นซึ่งหมายความว่าgit logจะแสดงสัมพันธ์กับจุดนั้น? และเมื่อฉันชำระเงินหลักฉันจะย้ายตัวชี้ไปยังสาขาหลักเวอร์ชันล่าสุดหรือไม่
นาธานลอง

7
@Nathan: แน่นอน HEAD เป็นสิ่งที่เรียกว่าการอ้างอิงเชิงสัญลักษณ์โดยทั่วไปแล้วตัวชี้ไปยังการอ้างอิงอื่น (สาขาที่เช็คเอาท์ในปัจจุบัน) git checkoutเป็นวิธีในการเคลื่อนย้าย HEAD ไปรอบ ๆ เมื่อคุณถอด HEAD ออกคุณทำให้มันชี้ไปที่การมอบให้ เมื่อคุณเช็คเอาต์มาสเตอร์อีกครั้งมันจะชี้ไปที่มาสเตอร์ (และหลายคำสั่งเช่นgit logใช้ช่วงการแก้ไขจริงซึ่งเป็นค่าเริ่มต้นที่ HEAD)
Cascabel

3
Yep - HEAD เป็น "สรรพนาม" ที่ใช้เพื่ออ้างถึง "รุ่นของรหัสที่อยู่ในไดเรกทอรีทำงาน" นอกจากนี้ยังเป็นสรรพนามสำหรับ "ผู้ปกครองของสิ่งที่คุณกระทำต่อไป"
Ana Betts

54

เมื่อคุณชำระเงินให้กับการกระทำที่เฉพาะเจาะจงคอมไพล์สร้างสาขาเดี่ยว ดังนั้นถ้าคุณโทร:

$ git branch 

คุณจะเห็นสิ่งที่ชอบ:

* (detached from 3i4j25)
  master
  other_branch

หากต้องการกลับมาที่หัวหน้าสาขาคุณเพียงต้องการเช็คเอาต์ที่สาขาหลักของคุณอีกครั้ง:

$ git checkout master

คำสั่งนี้จะลบสาขาที่แยกออกโดยอัตโนมัติ

ถ้าgit checkoutไม่ทำงานคุณอาจมีไฟล์ที่แก้ไขที่ขัดแย้งกันระหว่างสาขา เพื่อป้องกันไม่ให้คุณสูญเสียรหัส git คุณต้องจัดการกับไฟล์เหล่านี้ คุณมีสามตัวเลือก:

  1. ซ่อนการแก้ไขของคุณ (คุณสามารถกลับมาดูภายหลัง):

    $ git stash
    
  2. ยกเลิกการเปลี่ยนแปลงที่รีเซ็ตโดยแยกสาขา:

    $ git reset --hard
    
  3. สร้างสาขาใหม่ด้วยการแก้ไขก่อนหน้าและยอมรับ:

    $ git checkout -b my_new_branch
    $ git add my_file.ext
    $ git commit -m "My cool msg"
    

หลังจากนี้คุณสามารถกลับไปที่สาขาหลักของคุณ (เวอร์ชันล่าสุด):

$ git checkout master

36

นี่เป็นการหลอกลวงสำหรับฉัน (ฉันยังอยู่ในสาขาหลัก):

git reset --hard origin/master

34
รีเซ็ต - ยากเกินไปและแสดงให้เห็นว่าคุณไม่ได้ตระหนักถึงการดัดแปลงที่คุณทำ ซึ่งอาจส่งผลให้สูญเสียรหัส
Thomio

1
ในกรณีของฉันฉันต้องการกำจัดการเปลี่ยนแปลงที่ไม่ได้ตั้งใจโดยไม่ตั้งใจ ฉันรู้ว่าอาจมีวิธีการอื่นเพื่อให้บรรลุ ฉันเห็นด้วยถ้าคุณไม่ต้องการที่จะสูญเสียการเปลี่ยนแปลงที่ไม่ได้ตั้งใจซึ่งเป็นการสูญเสียข้อมูล
Csaba ถึง

8

หากต้องการกลับไปใช้รุ่นล่าสุด:

git checkout <branch-name> 

ตัวอย่างเช่นgit checkout masterหรือgit checkout dev


7

คุณสามารถตรวจสอบโดยใช้ชื่อสาขาสำหรับสิ่งหนึ่ง

ฉันรู้ว่ามีหลายวิธีที่จะย้าย HEAD ไปรอบ ๆ แต่ฉันจะปล่อยให้ผู้เชี่ยวชาญ git แจกแจง

ฉันแค่อยากจะแนะนำgitk --all- ฉันพบว่ามันมีประโยชน์อย่างมากเมื่อเริ่มต้นด้วยคอมไพล์


7

ฉันเพียงแค่จุดเริ่มต้นที่จะขุดลึกลงไปในคอมไพล์จึงไม่แน่ใจว่าถ้าผมเข้าใจอย่างถูกต้อง แต่ผมคิดว่าคำตอบที่ถูกต้องให้กับคำถามของ OP คือการที่คุณสามารถทำงานกับกำหนดรูปแบบเช่นนี้git log --all git log --all --pretty=format:'%h: %s %d'นี่เป็นการทำเครื่องหมายรุ่นที่เช็คเอาท์ปัจจุบันเป็น(HEAD)และคุณสามารถคว้าอันถัดไปจากรายการ

BTW เพิ่มนามแฝงเช่นนี้ให้.gitconfigกับรูปแบบที่ดีขึ้นเล็กน้อยและคุณสามารถเรียกใช้git hist --all:

  hist = log --pretty=format:\"%h %ai | %s%d [%an]\" --graph

เกี่ยวกับเวอร์ชันสัมพัทธ์ฉันพบโพสต์นี้แต่มันพูดถึงเฉพาะเวอร์ชั่นที่เก่ากว่าคงไม่มีอะไรที่จะอ้างถึงเวอร์ชันที่ใหม่กว่า


6

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

git checkout -

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


ไม่จำเป็นว่าสาขาจะชี้ HEAD ไปยังที่ที่มันชี้ไปก่อนหน้า หากคุณไม่git checkout hash2หลังgit checkout hash1, จะนำคุณกลับไปgit checkout - hash1
Mikhail Vasin

3

เมื่อคุณกลับไปเป็นรุ่นก่อนหน้า

$ git checkout HEAD~2
Previous HEAD position was 363a8d7... Fixed a bug #32

คุณสามารถดูบันทึกคุณสมบัติของคุณ (แฮ) ด้วยคำสั่งนี้แม้ในสถานการณ์นี้

$ git log master --oneline -5
4b5f9c2 Fixed a bug #34
9820632 Fixed a bug #33
...

master สามารถถูกแทนที่ด้วยชื่อสาขาอื่น

จากนั้นชำระเงินคุณจะสามารถกลับไปที่คุณลักษณะดังกล่าวได้

$ git checkout 4b5f9c2
HEAD is now at 4b5f9c2... Fixed a bug #34

1

ด้วย Git 2.23+ (สิงหาคม 2019) แนวทางปฏิบัติที่ดีที่สุดคือการใช้git switchแทนคำสั่งที่สับสนgit checkout

หากต้องการสร้างสาขาใหม่โดยอิงจากเวอร์ชันเก่ากว่า:

git switch -c temp_branch HEAD~2

หากต้องการกลับไปที่สาขาหลักปัจจุบัน:

git switch master

0

ทางออกที่หรูหราและเรียบง่ายคือการใช้งาน

git stash

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

git stash apply

ฉันรู้ว่ามันเก่ามาก แต่ฉันต้องแสดงความคิดเห็นเกี่ยวกับเรื่องนี้ (เนื่องจากฉันคิดว่าไม่ควรใช้วิธีแก้ปัญหานี้) - ฉันจะไม่ใช้วิธีแก้ปัญหานี้เพราะมันไม่ได้แก้ปัญหานี้ แต่เป็นปัญหาที่แตกต่างกัน ด้วยโซลูชันที่ซ่อนนี้ทุกครั้งที่คุณต้องการเช็คเอาต์ไปยังการยืนยันก่อนหน้าคุณจริง ๆ แล้ว "บันทึก" ข้อมูลซึ่งไม่จำเป็นมากสำหรับกรณีนี้ วิธีที่ถูกต้องและสวยงามมากขึ้นคือ (ตามที่ระบุไว้ก่อนหน้า) เพียงชำระเงิน <branch>
Maayao
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.