Git:“ ปัจจุบันยังไม่มีสาขาใด ๆ ” มีวิธีง่าย ๆ ในการกลับไปที่สาขาในขณะที่รักษาการเปลี่ยนแปลงหรือไม่


201

ดังนั้นฉันจึงทำงานบางอย่างในที่เก็บและเมื่อฉันกำลังจะยอมรับฉันตระหนักว่าฉันไม่ได้อยู่ที่สาขาใดเลย

สิ่งนี้เกิดขึ้นมากมายเมื่อทำงานกับ submodules และฉันสามารถแก้ไขได้ แต่กระบวนการนี้น่าเบื่อและฉันคิดว่าต้องมีวิธีที่ง่ายกว่าในการทำเช่นนี้

มีวิธีง่าย ๆ ในการกลับไปที่สาขาในขณะที่รักษาการเปลี่ยนแปลงหรือไม่

คำตอบ:


213

หากคุณยังไม่ได้ทำ:

git stash
git checkout some-branch
git stash pop

หากคุณมีความมุ่งมั่นและไม่ได้เปลี่ยนแปลงอะไรตั้งแต่:

git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}

หากคุณมีความมุ่งมั่นและทำงานพิเศษแล้ว:

git stash
git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}
git stash pop

16
อันนี้ไม่ได้ช่วยถ้าคุณได้มุ่งมั่นแล้ว ไม่มี downvote เหมือนที่ไม่ได้ระบุไว้ในคำถาม
Dean Rather

24
หากคุณได้ทำไปแล้ว: จดแฮชของการคอมมิทที่คุณทำ (ใช้git showหรือgit rev-parse HEAD) ให้เปลี่ยนไปที่สาขาแล้วgit cherry-pickตามด้วยแฮชการคอมมิชชัน
araqnid

7
หากมุ่งมั่นรับแฮชของการกระทำครั้งสุดท้าย ชำระเงินสาขาที่คุณต้องการที่จะและgit merge _hash_
Daniel

ระวังให้ดี หากคุณยอมรับการเปลี่ยนแปลงแล้วและคุณทำตามขั้นตอนเหล่านี้ ... คุณจะเห็นข้อความ ... "สาขาและที่มา / อาจารย์ของคุณแยกจากกัน"
thinkanotherone

1
@thinkanotherone หากคุณยอมรับการเปลี่ยนแปลงแล้วไม่มีอะไรจะซ่อนและตรวจสอบสาขาที่แตกต่างไม่ใช่จุดสิ้นสุดของโลก git merge <hash-of-the-commit-you-just-made>กระทำที่คุณทำยังคงมีและคุณสามารถผสานสาขาว่าด้วยการใช้
Erik B

160

สิ่งนี้ช่วยฉัน

git checkout -b newbranch
git checkout master
git merge newbranch
git branch -d newbranch

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

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

49
คุณจะประหลาดใจ
Eric

@ErikB ฉันไม่รู้ด้วยซ้ำว่ามีสิ่งที่ไม่ได้อยู่ในสาขา คำตอบนี้มีประโยชน์มากสำหรับฉัน
Konstantin Schubert

2
คำตอบที่น่ารักจริง ๆ แค่พิมพ์ลงไปและทำงานไม่เหมือนทุกสิ่งทุกอย่างที่พบในฐานะผู้เริ่มต้นของ GIT - คุณอาจต้องการชี้ให้เห็นว่า newbranch เป็นชื่อที่ไม่ชอบและไม่ได้ตั้งใจจะแทนที่ด้วยแฮชคอมมิท
Toni Leigh

22
git checkout master

นั่นเป็นผลดังนี้:

Warning: you are leaving 2 commits behind, not connected to
any of your branches:

1e7822f readme
0116b5b returned to clean django

If you want to keep them by creating a new branch, this may be a good time to do so with:
git branch new_branch_name 1e7822f25e376d6a1182bb86a0adf3a774920e1e

ดังนั้นให้ทำ:

git merge 1e7822f25e376d6a1182bb86a0adf3a774920e1e

ฉันไม่ได้ลอง แต่ดูเหมือนว่ามันจะใช้ได้ดี ฉันเดาว่าคุณจะรันgit gcระหว่างรันทั้งสองคำสั่งคุณจะเสียความมุ่งมั่นเหล่านั้น แต่ถ้าคุณไม่ได้ทำงานgit gcโดยอัตโนมัติสิ่งนี้ควรเป็นวิธีที่ไม่มีความเสี่ยงอย่างเป็นธรรม ฉันจะไปกับคำตอบของ babay แต่ถ้าคุณต้องการช่วยตัวเองจากการเขียนคำสั่งพิเศษสองคำฉันคิดว่านี่เป็นวิธีที่จะไป
Erik B

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

+1 ฉันกังวลเกี่ยวกับการตรวจสอบสาขาอื่นในขณะที่ออกจากการคอมมิชชันเห็นข้อความนี้เพิ่มความมั่นใจที่จะไป
J-Dizzle

11

ออกจากที่นี่อีกวิธีหนึ่ง

git branch newbranch
git checkout master 
git merge newbranch 

3
@ErikB เขาอาจทำหลายอย่างได้ ในกรณีนี้ดูคำตอบของ babay
Benjamin Oakes

@BenjaminOakes อาจเป็นเช่นนั้น แต่คำสั่ง git เหล่านี้ไม่ถูกต้อง
Erik B

@ErikB จริงแน่นอน :) คำตอบของ babay คือรูปแบบที่ถูกต้องของสิ่งที่ Alex ดูเหมือนจะพยายามทำ
เบนจามินเคส

9

อีกวิธีหนึ่งคุณสามารถตั้งค่า submodules ของคุณเพื่อให้แทนที่จะอยู่ในสถานะหัวเดี่ยวเริ่มต้นที่คุณตรวจสอบสาขา

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

วิธีหนึ่งคือการชำระเงินสาขาย่อยของ submodule เมื่อคุณเพิ่มด้วยแฟล็ก -b:

git submodule add -b master <remote-repo> <path-to-add-it-to>

อีกวิธีคือไปที่ไดเรคทอรี submodule และลองดู

git checkout master

1
คุณสามารถบอกฉันว่าจะทำอย่างไร
Erik B

มีวิธีการปรับปรุง submodule ที่มีอยู่ในโหมดสาขาเริ่มต้นนี้หรือไม่? อัปเดตgitmodulesอาจจะ?
Hertzel Guinness

@HertzelGuinness ไม่ได้จริงๆ submodule มีการตรวจสอบที่กระทำ sha เฉพาะ สาขาเป็นเพียงตัวชี้ไปยัง sha และ sha ที่ชี้ไปที่สามารถเปลี่ยนแปลงได้ สิ่งนี้ไม่มีประโยชน์เพราะมันไม่ได้หยุดสถานะของ submodule ที่ชำระเงินแล้ว การตรวจสอบสาขาเป็นเพียงความสะดวกสบายถ้าคุณทำการเปลี่ยนแปลง submodule
Abizern

5

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

คุณสามารถกำหนดให้ส่งมอบสิ่งใหม่ของคุณได้masterโดยทำ:

git branch -f master HEAD
git checkout master

นี้บังคับให้อัปเดตmasterที่จะชี้ไปHEAD(โดยไม่ต้องใส่คุณในmaster) masterจากนั้นเปลี่ยนไป


ทำงานได้อย่างสมบูรณ์แบบตามที่ต้องการ ฉันจัดเตรียมไฟล์ไว้แล้วและมุ่งมั่น แต่ไม่สามารถผลักดันได้เนื่องจากข้อผิดพลาดด้านบน โค้ดสองบรรทัดด้านบนทำงานได้อย่างสมบูรณ์แบบและผลักรหัสของฉันตามที่คาดไว้
Invinciblemuffi

4

ฉันเพิ่งพบปัญหานี้อีกครั้ง เป็นเวลานานแล้วที่ฉันได้ทำงานร่วมกับ submodules และเรียนรู้เพิ่มเติมเกี่ยวกับ git ฉันรู้ว่าเพียงแค่ตรวจสอบสาขาที่คุณต้องการจะทำก็เพียงพอแล้ว Git จะทำให้ต้นไม้ทำงานแม้ว่าคุณจะไม่ซ่อนมัน

git checkout existing_branch_name

หากคุณต้องการทำงานในสาขาใหม่สิ่งนี้น่าจะเหมาะกับคุณ:

git checkout -b new_branch_name

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

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


2

วิธีการต่อไปนี้อาจใช้งานได้:

git rebase HEAD master
git checkout master

นี่จะรีบูตการเปลี่ยนแปลง HEAD ปัจจุบันของคุณที่ด้านบนของมาสเตอร์ จากนั้นคุณสามารถสลับสาขา


ทางเลือกอื่นคือทำการชำระเงินที่สาขาก่อน:

git checkout master

จากนั้น Git ควรแสดง SHA1 จากการมอบหมายเดี่ยวของคุณจากนั้นคุณสามารถเลือกรับเชอร์รี่เช่น

git cherry-pick YOURSHA1

หรือคุณสามารถรวมอันล่าสุด:

git merge YOURSHA1

เพื่อดูทั้งหมดของกระทำของคุณจากสาขาที่แตกต่างกัน (เพื่อให้แน่ใจว่าคุณได้พวกเขา) git reflogทำงาน:


0

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

อย่างไรก็ตามการสร้างสาขาใหม่นั้นเกินความคิดของฉัน สิ่งที่คุณต้องทำคือ:

git checkout some-branch
git merge commit-sha

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

git reflog

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