มีวิธีการชำระเงินสาขาก่อนหน้านี้หรือไม่?


705

ฉันต้องการเรียงลำดับของcd -git ถ้าผมอยู่ในสาขาmasterและฉันเช็คเอาfooฉันจะรักจะสามารถพิมพ์สิ่งที่ต้องการgit checkout -ที่จะกลับไปและสามารถที่จะพิมพ์อีกครั้งเพื่อกลับไปmasterfoo

มีอะไรแบบนี้อยู่อีกไหม? มันจะยากที่จะใช้?


2
ฉันต้องการพิมพ์ลูกศรขึ้นเพื่อค้นหาคำสั่ง git checkout ของฉันก่อนหน้านี้: p
Kit Ho

11
ที่เกี่ยวข้องกับการย้ายมือของคุณออกจากตำแหน่งบ้านพิมพ์ gc- เป็นวิธีที่เร็วขึ้นแล้วกดขึ้นจนกว่าคุณจะพบสิ่งที่คุณกำลังมองหา
แมตต์บริกส์

@MattBriggs คุณพิมพ์จริงgc-หรือว่าชวเลขสำหรับgit checkout -
jewbix.cube

2
@ jewbix.cube คุณต้องเรียนรู้เกี่ยวกับนามแฝงทั้งสำหรับเชลล์ของคุณและสำหรับคอมไพล์
Gauthier

@ KitHo: ฉันพบว่าตัวเองต้องการที่จะทำอย่างต่อเนื่อง แต่คำสั่งที่ฉันต้องการอาจไม่ได้มีอยู่ในประวัติศาสตร์ถ้าเช่นฉันเพิ่งสร้างสาขา
M_M

คำตอบ:


1230

จากบันทึกประจำรุ่นสำหรับ 1.6.2

@{-1}เป็นวิธีการอ้างอิงถึงสาขาล่าสุดที่คุณอยู่
การยอมรับนี้ไม่เพียง แต่คาดว่าจะมีชื่อวัตถุ แต่ที่ใดก็ตามที่คาดว่าจะมีชื่อสาขาและทำหน้าที่เสมือนว่าคุณพิมพ์ชื่อสาขา
เช่นgit branch --track mybranch @{-1}, git merge @{-1}และ
git rev-parse --symbolic-full-name @{-1}จะทำงานได้ตามที่คาดไว้

และ

git checkout -git checkout @{-1}เป็นชวเลข


47
ว้าวฉันน่าจะลองแค่นี้แหละ! คิดว่า - เป็น shell-ism และถ้าการทำงานเป็นคอมไพล์มันจะเป็นอะไรที่แตกต่าง
Matt Briggs

9
วิธีนี้ใช้ไม่ได้ผลเมื่อคุณชำระเงิน SHA ครั้งที่สองซึ่งในกรณีที่ @ {- 1} ชี้ไปยังจุดที่คุณอยู่ก่อนที่จะทำการชำระเงินครั้งแรก ..
user716468

1
ฉันกำลังใช้ ZSH และฉันต้องใส่เครื่องหมาย @ {- 1} ในเครื่องหมายคำพูด มิฉะนั้น git สำลัก:error: pathspec '@-' did not match any file(s) known to git. error: pathspec '@1' did not match any file(s) known to git.
เมอร์ฟี Randle

15
นี่อาจเป็นครั้งแรกที่คำตอบ SO ทำให้ฉันยิ้มอย่างไม่สามารถควบคุมได้ คิดว่านี่จะยากกว่านี้มาก!
โอเว่น

25
ความรุ่งโรจน์พิเศษสำหรับการเรียนการสอนที่ใช้: แสดงสิ่งอำนวยความสะดวกทั่วไปจากนั้นพูดถึงชวเลขย่อที่มีขนาดกะทัดรัด แต่ทั่วไปน้อยกว่า! …ฉันมักจะใช้@{u}ซึ่งเป็นสาขาต้นน้ำของสาขาปัจจุบัน มันมีประโยชน์อย่างมากสำหรับgit log @{u}..รายการที่แสดงการส่งข้อมูลที่ยังไม่ได้ดึง และการสนทนาgit log ..@{u}ซึ่งเป็นเพียงการกระทำในท้องถิ่นที่ยังไม่ได้ผลักดัน
Benjohn

208

วิธีที่ง่ายที่สุดในการทำเช่นนี้ในปัจจุบันคือ:

git checkout -

... ซึ่งเป็นนามแฝงของ:

git checkout @{-1}

git checkout ลบ

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


3
สมบูรณ์ ฉันกำลังค้นหาสิ่งที่วิธีการคอมไพล์ทำเช่นนี้ดังนั้นฉันสามารถสร้างนามแฝงที่แน่นอนนี้ ดีใจที่ได้เห็นมันมีอยู่จริง
Tabitha

3
มีวิธีในการแสดงรายการสาขาก่อนหน้าโดยไม่ตรวจสอบหรือไม่
Erotemic

7
@Erotemic using bash -for i in{1..10}; do git rev-parse --symbolic-full-name @{-$i}; done
Bonsaigin

น่าทึ่งที่ได้เห็น 'การชำระเงินคอมไพล์ -' เป็นชื่อแทน! นั่นคือ ux ที่ฉันกำลังมองหา :)
James Tayler

ใน @Erotemic PowerShell git reflog | ? { $_ -match ': checkout: moving from (.*) to (.*)'} | % { $Matches[1] } มันจะเป็น ในทุบตีคุณต้องเขียนสิ่งที่เทียบเท่า (รับ reflog และกรองไปยังบรรทัดที่มีสตริง ": checkout:" แล้วแยกชื่อสาขา) นี่คือสิ่งที่git ทำ
Mariusz Pawelski

28

ในฐานะที่เป็น @Karl ชี้ให้เห็นและจากgit checkoutคู่มือ:

เป็นกรณีพิเศษไวยากรณ์ "@ {- N}" สำหรับสาขา N-th ที่ผ่านมาตรวจสอบสาขา (แทนที่จะแยกออก) คุณสามารถระบุ - ซึ่งมีความหมายเหมือนกันกับ "@ {- 1}"

ดังนั้นทั้งสองgit checkout -และgit checkout @{-1}จะทำงานในกรณีนี้

ใกล้เคียงที่สุดฉันเชื่อว่าใช้ git reflogและแยกวิเคราะห์ล่าสุดmoving from branch1 to branch2และgit checkout branch1


11

เพียงเพิ่มรายละเอียดเพิ่มเติมลงในคำตอบก่อนหน้าเพื่อทำความเข้าใจกลไกการgit checkout @{-N}ทำงาน มันจะอ้างอิงการตรวจสอบประวัติเช็คเอาต์ดังนั้นหากคุณต้องการใช้สิ่งที่คล้ายกันด้วยตัวคุณเองคุณควรแยกวิเคราะห์ผลลัพธ์ของการgit reflogค้นหาcheckout:บรรทัด คุณสามารถตรวจสอบการดำเนินการในแหล่งคอมไพล์โดยเฉพาะฟังก์ชั่นsha1_name.cinterpret_nth_prior_checkout



10

รุ่น Git 2.23แนะนำgit switchคำสั่งที่คุณสามารถใช้ทำ (และอื่น ๆ ) การอ้างอิงเอกสารอย่างเป็นทางการ:

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

ในกรณีเฉพาะของคุณคุณสามารถออกgit switch -เพื่อกลับไปที่สาขาที่คุณเคยไป คุณสามารถดำเนินการคำสั่งเดียวกันอีกครั้งเพื่อกลับไปที่สาขาแรก

PS มันไม่ใช่ว่าคุณไม่ได้รู้อยู่แล้วว่าวิธีการทำที่ (ผมหมายถึงจะได้รับ 7 ปีนับตั้งแต่ที่คุณถามคำถามนี้) แต่คำสั่งนี้จะน้อยลงทำให้เกิดความสับสนและเป็นมิตรกับผู้เริ่มต้นในขณะที่มันอยู่ร่วมกันความสับสนgit checkoutที่เกิดขึ้นเมื่อมีการใช้


5

ฉันมาถึงคำถามนี้ด้วยความคิดเดียวกันกับที่จะเช็คเอาท์สาขาก่อนหน้าของฉัน ฉันใช้ohmyzMacใน คำสั่งด้านล่างช่วยฉัน

$ gco -
$ git checkout -

เพียงแค่หัวขึ้นที่ ohmyz นั้นช้ามากเมื่อเทียบกับตัวจัดการแพ็คเกจ zsh อื่น ๆ ฉันจะแนะนำการดูที่แอนติเจนหรือzplug
spex

2
ในกรณีที่มันไม่ชัดเจนงานนี้เพราะOh My zsh ของ Git ปลั๊กอินกำหนดเป็นวิธีที่สั้นของการเขียนgco git checkoutดังนั้นสายเพียงgco - git checkout -
Rory O'Kane

offcourse เพื่อนของฉัน git checkout -ไม่มีความจำเป็นที่จะอธิบายมัน สำหรับการปรับปรุงล้มเหลว
Venkat.R

1

ทางออกที่นิยมที่สุดคือ:

git checkout @{-N}

โดยที่ N - นับจำนวนสาขาที่จะย้ายกลับไปที่ประวัติการชำระเงิน


1

นี่คือตัวชี้ไปยังส่วนต่าง ๆ ของเอกสารของ Git ที่อธิบายgit checkout -และgit checkout @{-1}คำตอบที่ได้จากคำตอบอื่น ๆ :

  • เมื่อระบุการแก้ไข Git สำหรับคำสั่งใด ๆ@{-<n>}เช่น@{-1}หมายถึง“ สาขาที่n / กระทำการชำระเงินก่อนที่จะมีในปัจจุบัน” เอกสารสำหรับgit checkout <branch>ย้ำ:“ คุณสามารถใช้@{-N}ไวยากรณ์เพื่ออ้างถึงสาขาที่ N-th ล่าสุด / กระทำการชำระเงินโดยใช้git checkoutการดำเนินการ”

  • สำหรับ<branch>อาร์กิวเมนต์ของgit checkout “ คุณอาจระบุ ' -' ซึ่งมีความหมายเหมือนกันกับ ' @{-1}'

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