จะกลับไปใช้การคอมมิทล่าสุดได้อย่างไรหลังจากตรวจสอบการคอมมิชชันก่อนหน้า


476

บางครั้งฉันตรวจสอบรหัสรุ่นก่อนหน้าเพื่อตรวจสอบหรือทดสอบ ฉันได้เห็นคำแนะนำเกี่ยวกับสิ่งที่ต้องทำถ้าฉันต้องการแก้ไขข้อผูกพันก่อนหน้านี้ - แต่สมมติว่าฉันไม่ทำการเปลี่ยนแปลงใด ๆ หลังจากทำเสร็จgit checkout HEAD^แล้วฉันจะกลับไปที่ปลายกิ่งได้อย่างไร .. git logไม่แสดงให้ฉันเห็นถึงความมุ่งมั่นล่าสุดของ SHA อีกต่อไป


11
เกี่ยวกับgit logประโยคคำถามของคุณคุณสามารถเรียกใช้git log --all(หรือเป็นประโยชน์มากขึ้นgit log --oneline --graph --all)
Wildcard

คำตอบ:


605

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

git checkout branchname

นอกจากนี้คุณยังสามารถใช้git reflogเพื่อดูว่าคนอื่น ๆ ยอมรับหัวของคุณ (หรือผู้อ้างอิงคนอื่น ๆ ) ได้ชี้ไปที่ใดในอดีต


แก้ไขเพื่อเพิ่ม:

ใน Git เวอร์ชันใหม่ถ้าคุณวิ่งgit checkoutหรือมีอะไรอย่างอื่นมาขยับHEADครั้งเดียวคุณก็ทำได้

git checkout -

เพื่อสลับกลับไปที่ใดก็ตามที่เป็นก่อนเช็คเอาต์สุดท้าย สิ่งนี้ได้รับแรงบันดาลใจจากการเปรียบเทียบกับสำนวนของเชลล์cd -เพื่อกลับไปยังไดเรกทอรีการทำงานใด ๆ ที่เคยมีมาก่อน


27
ฉันต้องการพูดถึงว่าตัวอย่างทั่วไปจะเป็น "นายชำระเงิน git" ปัญหาอย่างหนึ่งที่ฉันได้เรียนรู้ที่จะใช้คอมไพล์คือไม่รู้ว่าคำหลักใดที่เจาะจง (เช่น "ปรมาจารย์") ฉันสามารถแทนที่คำที่มีตัวยึดตำแหน่งเช่น "branchname" ได้
AbePralle

3
masterไม่ใช่คำหลักประเภทใด ๆ อย่างแท้จริงวิธีHEADคือ มันเป็นเพียงชื่อสาขาเริ่มต้นในพื้นที่เก็บข้อมูลใหม่ คุณสามารถเรียกใช้git branchเพื่อรับรายการของสาขาในที่เก็บของคุณและgit tag -lสำหรับรายการของแท็ก ในทำนองเดียวกันoriginเป็นชื่อเริ่มต้นของระยะไกลที่เก็บจากโคลน แต่ไม่มีอะไรพิเศษเกี่ยวกับมัน
Phil Miller

3
หากยังไม่ชัดเจนgit reflogให้รายการแฮชที่คุณสามารถgit checkout [commit-hash]ใช้ได้
jbnunn

ฉันลบไฟล์แล้วลองคำสั่ง แต่ก็ไม่ได้รีเซ็ตอย่างสมบูรณ์ ก่อนอื่นมันไม่เกิดขึ้นซ้ำ จากนั้นเมื่อฉันลองทำสิ่งนี้กับไฟล์ที่ฉันลบไปแล้วคอมไพล์ก็บอกฉันว่า HEAD ถูกถอดออก จะทำอย่างไร?
Daniel S.

1
@DanielS: คำถามและคำตอบของฉันเกี่ยวกับการผูกมัดขณะที่คุณกำลังพูดถึงไฟล์ Git ปฏิบัติต่อพวกเขาค่อนข้างต่างกัน
Phil Miller

27

git หลักการชำระเงิน

master คือคำแนะนำหรือการกระทำครั้งสุดท้าย gitkจะแสดงให้คุณเห็นเฉพาะที่คุณอยู่ในต้นไม้ในเวลานั้น การอ้างอิง gitจะแสดงการคอมมิททั้งหมด แต่ในกรณีนี้คุณแค่ต้องการทิปดังนั้นมาสเตอร์เช็คเอาต์ git


1
นี้. หรือgit checkout branchname
อเล็กซ์

19

มาถึงคำถามนี้ในตอนนี้และมีบางอย่างที่จะเพิ่ม

หากต้องการไปที่การคอมมิทล่าสุด:

git checkout $(git log --branches -1 --pretty=format:"%H")

คำอธิบาย:

git log --branchesแสดง log of commits จากทุกสาขาในท้องถิ่น
-1เพื่อ จำกัด หนึ่งกระทำ→
--pretty=format:"%H"รูปแบบการคอมมิชชันล่าสุดเพื่อแสดงเฉพาะการ
git checkout $(...)ใช้แฮชเอาท์พุทของ subshell เป็นอาร์กิวเมนต์สำหรับเช็คเอาท์

บันทึก:

ซึ่งจะส่งผลให้เกิดการแยกส่วนหัว (เนื่องจากเราชำระเงินโดยตรงกับการส่ง) สามารถหลีกเลี่ยงได้โดยการแยกชื่อสาขาโดยใช้คำsedอธิบายด้านล่าง


หากต้องการไปที่สาขาของการกระทำล่าสุด:

git checkout $(git log --branches -1 --pretty=format:'%D' | sed 's/.*, //g')

คำอธิบาย:

git log --branchesแสดง log of commits จากทุกสาขาในท้องถิ่น
-1เพื่อ จำกัด หนึ่งกระทำ→
--pretty=format:"%D"รูปแบบการคอมมิชชันล่าสุดเพื่อแสดงเฉพาะชื่อ ref
| sed 's/.*, //g'ไม่สนใจทั้งหมด แต่สุดท้ายของ refs (*) หลายอัน
git checkout $(...)ใช้เอาต์พุตของ subshell เป็นอาร์กิวเมนต์สำหรับเช็คเอาท์

*) HEAD และ remote branch มีการระบุไว้เป็นอันดับแรกสาขาในพื้นที่จะแสดงรายการตามลำดับตัวอักษรจากมากไปน้อยดังนั้นส่วนที่เหลือจะเป็นชื่อสาขาตามลำดับตัวอักษร

บันทึก:

นี่จะใช้เฉพาะชื่อสาขา (ตัวอักษร) ก่อนหากมีหลายชื่อสำหรับการส่ง


อย่างไรก็ตามฉันคิดว่าทางออกที่ดีที่สุดคือการแสดงชื่อผู้อ้างอิงล่าสุดเพื่อทราบว่าจะต้องเช็คเอาต์ที่ใด:

git log --branches -1 --pretty=format:'%D'

เช่นสร้างนามแฝงgit topสำหรับคำสั่งนั้น


1
อย่างใดฉัน goofed คำสั่งที่สอง ... แก้ไขมันตอนนี้จะตรวจสอบคุณอย่างถูกต้อง ot สาขาของการกระทำล่าสุด
816-8055

นามแฝง Bash / zsh สำหรับคำสั่งให้ส่งกลับไปที่หัวalias git-head='git checkout $(git log --branches -1 --pretty=format:"%D" | sed "s/.*, //g")'
Hi-Angel

9

ดู GUI กราฟิก ... gitkมันแสดงให้เห็นถึงความมุ่งมั่นทั้งหมด บางครั้งการทำงานแบบกราฟิกจะง่ายกว่า ... ^^


ใช่นี่เป็นวิธีที่ฉันเคยทำมาแล้วในอดีต - แต่ฉันไม่มี GUI ให้บริการในตอนนี้
Leo Alekseyev


4

แสดงทุกสาขาและส่ง
บันทึกคอมไพล์ - สาขา - ออนไลน์

แสดง
บันทึกการคอมมิทล่าสุด - สาขา -1 - ออนไลน์

แสดงก่อนที่จะ
คอมมิตบันทึก git --branches -2 - ออนไลน์


คำสั่งแรกจะส่งรหัสใดเป็นระยะในขณะนี้หรือฉันอ่านผิด
Lazerbeak12345


0

หากคุณมีสาขาที่แตกต่างจากต้นแบบวิธีง่ายๆในการตรวจสอบสาขานั้นคือจากนั้นตรวจสอบต้นแบบ Voila คุณกลับมาที่ปลายสุดของอาจารย์แล้ว อาจมีวิธีที่ชาญฉลาดกว่า ...


0

git pull origin branchnameคุณก็สามารถทำได้ มันจะดึงข้อมูลการส่งล่าสุดอีกครั้ง


ฉันไม่แนะนำสิ่งนี้หากคุณไม่ต้องการดึงขึ้นจากต้นน้ำ หนึ่งควรจัดการกับความขัดแย้งผสานเฉพาะเมื่อพวกเขาพร้อมที่จะ
Lazerbeak12345

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

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