ถ้าฉันวิ่งgit branch -d XYZ
มีวิธีกู้สาขาหรือไม่ มีวิธีการย้อนกลับไหมถ้าฉันไม่ได้เรียกใช้คำสั่งสาขาลบ?
ถ้าฉันวิ่งgit branch -d XYZ
มีวิธีกู้สาขาหรือไม่ มีวิธีการย้อนกลับไหมถ้าฉันไม่ได้เรียกใช้คำสั่งสาขาลบ?
คำตอบ:
ใช่คุณควรจะสามารถที่จะทำgit reflog
และหา SHA1 git checkout [sha]
สำหรับการกระทำที่ปลายสุดของสาขาที่ถูกลบของคุณแล้วเพียง และเมื่อคุณทำอย่างนั้นคุณก็สามารถgit checkout -b [branchname]
สร้างสาขาขึ้นใหม่ได้จากที่นั่น
มอบเครดิตให้แก่ @Cascabel สำหรับเวอร์ชันย่อ / ซับในรุ่นนี้
คุณสามารถทำได้ในขั้นตอนเดียว:
git checkout -b <branch> <sha>
git checkout -b <branch> <sha>
.
<sha>
มัน เช่นที่กล่าวถึงข้างต้น -git checkout -b <branch> <sha>
CMD+K
)
git reflog --no-abbrev
เพื่อดูแบบเต็มที่<sha>
ย่อโดยค่าเริ่มต้น
git checkout remotes/origin/deleted_branch
ฉันก็สามารถที่จะ
เวลาส่วนใหญ่ที่ไม่สามารถเข้าถึงได้กระทำอยู่ในการอ้างอิง ดังนั้นสิ่งแรกที่ต้องลองคือดู reflogโดยใช้คำสั่งgit reflog
(ซึ่งแสดง reflog สำหรับHEAD
)
git reflog name-of-my-branch
บางทีอาจจะเป็นสิ่งที่ง่ายขึ้นถ้าได้กระทำการเป็นส่วนหนึ่งของสาขาที่เฉพาะเจาะจงยังคงมีอยู่คือการใช้คำสั่ง มันยังใช้งานได้กับรีโมตตัวอย่างเช่นหากคุณบังคับให้กด (คำแนะนำเพิ่มเติม: ชอบแทนเสมอgit push --force-with-lease
กว่าเพื่อป้องกันความผิดพลาดและสามารถกู้คืนได้มากกว่า)
หากการกระทำของคุณไม่ได้อยู่ในการอ้างอิงของคุณ (อาจเป็นเพราะถูกลบโดยเครื่องมือของบุคคลที่สามที่ไม่ได้เขียนในการอ้างอิง) ฉันจะกู้คืนสาขาได้สำเร็จโดยการรีเซ็ตสาขาของฉันเป็น sha ของการกระทำที่พบโดยใช้คำสั่งเช่นนั้น สร้างไฟล์ที่มีความมุ่งมั่นห้อย):
git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\ -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt
หากคุณควรใช้มากกว่าหนึ่งครั้ง (หรือต้องการบันทึกไว้ที่อื่น) คุณสามารถสร้างนามแฝงด้วยคำสั่งนั้น ...
git config --global alias.rescue '!git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\ -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt'
และใช้กับ git rescue
ในการตรวจสอบพบการกระทำคุณสามารถแสดงการกระทำแต่ละรายการโดยใช้คำสั่งเพื่อค้นหา
ในการแสดงเมตาดาต้าการคอมมิชชัน (ผู้สร้าง, วันที่สร้างและการส่งข้อความ):
git cat-file -p 48540dfa438ad8e442b18e57a5a255c0ecad0560
หากต้องการดูความแตกต่าง:
git log -p 48540dfa438ad8e442b18e57a5a255c0ecad0560
เมื่อคุณพบการกระทำของคุณแล้วสร้างสาขาในการกระทำนี้ด้วย:
git branch commit_rescued 48540dfa438ad8e442b18e57a5a255c0ecad0560
สำหรับคนที่อยู่ภายใต้ Windows และชอบ GUIs คุณสามารถกู้คืนคอมมิชชัน (และไฟล์ที่ไม่มีการแบ่งฉาก) ด้วยGitExtensions ได้อย่างง่ายดายโดยใช้คุณสมบัติRepository
=> Git maintenance
=>Recover lost objects...
คำสั่งที่คล้ายกันเพื่อกู้คืนไฟล์ staged ที่ถูกลบอย่างง่ายดาย: https://stackoverflow.com/a/58853981/717372
หากคุณต้องการใช้ GUI คุณสามารถดำเนินการทั้งหมดด้วย gitk
gitk --reflog
สิ่งนี้จะช่วยให้คุณเห็นประวัติการกระทำของสาขาราวกับว่าสาขานั้นไม่ถูกลบ Create new branch
ตอนนี้เพียงแค่คลิกขวาที่ล่าสุดมอบให้สาขาและเลือกตัวเลือกเมนู
โซลูชันที่ได้รับคะแนนสูงสุดทำมากกว่าที่ร้องขอ:
git checkout <sha>
git checkout -b <branch>
หรือ
git checkout -b <branch> <sha>
ย้ายคุณไปที่สาขาใหม่พร้อมกับการเปลี่ยนแปลงล่าสุดทั้งหมดที่คุณอาจลืมที่จะกระทำ นี่อาจไม่ใช่ความตั้งใจของคุณโดยเฉพาะเมื่ออยู่ใน "โหมดความตื่นตระหนก" หลังจากสูญเสียกิ่งไม้
วิธีทำความสะอาด (และง่ายกว่า)ดูเหมือนจะเป็นแบบหนึ่งซับ (หลังจากที่คุณพบ<sha>
ด้วยgit reflog
):
git branch <branch> <sha>
ตอนนี้ทั้งสาขาปัจจุบันของคุณและการเปลี่ยนแปลงที่ไม่ได้รับผลกระทบ แต่จะมีการสร้างสาขาใหม่เท่านั้นจนถึงจุด<sha>
สูงสุด
หากไม่ใช่เคล็ดลับมันจะยังใช้งานได้และคุณจะได้สาขาที่สั้นกว่าจากนั้นคุณสามารถลองใหม่ด้วย<sha>
ชื่อสาขาใหม่และใหม่จนกว่าคุณจะได้สาขาที่ถูกต้อง
ในที่สุดคุณสามารถเปลี่ยนชื่อสาขาที่กู้คืนสำเร็จเป็นชื่อหรือสิ่งอื่น:
git branch -m <restored branch> <final branch>
กุญแจสำคัญสู่ความสำเร็จคือการหาสิ่งที่ถูกต้อง<sha>
ดังนั้นบอกชื่อของคุณอย่างชาญฉลาด :)
การเพิ่มไปยังคำตอบtfe : นอกจากนี้ยังมีสคริปต์git-resurrect.shในcontrib/
พื้นที่ของแหล่ง Git (ในที่เก็บ git.git) ซึ่งอาจช่วยคุณได้
git-resurrect <name>
พยายามค้นหาร่องรอยของปลายกิ่งที่เรียกว่า<name>
และพยายามคืนชีพให้ใหม่ ขณะนี้การอ้างอิงจะค้นหาข้อความเช็คเอาต์และ-r
รวมข้อความไว้ด้วย ด้วย-m
และ-t
ประวัติของการอ้างอิงทั้งหมดจะถูกสแกนเพื่อMerge <name> into other
/Merge <other> into <name>
(ตามลำดับ) ส่งเรื่องที่ค่อนข้างช้า แต่อนุญาตให้คุณฟื้นสาขาหัวข้อของผู้อื่น
ฉันใช้คำสั่งต่อไปนี้เพื่อค้นหาและดึงสาขาที่ถูกลบของฉัน ขั้นตอนแรกนั้นมาจากคำอธิบายของ gcb
$ git fsck --full --no-reflogs --unreachable --lost-found > lost
$ cat lost | cut -d\ -f3 > commits
$ cat commits | xargs -n 1 git log -n 1 --pretty=oneline
ตอนนี้ค้นหา git commit id (GIT-SHA) ตามคอมเมนท์คอมเม้นท์แล้วใช้ในคำสั่งด้านล่าง ชำระเงินสาขาใหม่ที่ชื่อว่า NEW-BRANCH พร้อม GIT-SHA ที่ค้นพบก่อนหน้านี้:
$ git checkout -b NEW-BRANCH GIT-SHA
หากคุณไม่มี reflog เช่น เนื่องจากคุณกำลังทำงานในพื้นที่เก็บข้อมูลเปลือยซึ่งไม่ได้เปิดใช้งาน reflog และการมอบหมายที่คุณต้องการกู้คืนได้ถูกสร้างขึ้นเมื่อเร็ว ๆ นี้อีกตัวเลือกหนึ่งคือการค้นหาวัตถุที่สร้างขึ้นเมื่อเร็ว ๆ นี้และมองผ่านพวกเขา
จากภายใน.git/objects
ไดเรกทอรีที่ทำงาน:
find . -ctime -12h -type f | sed 's/[./]//g' | git cat-file --batch-check | grep commit
สิ่งนี้จะค้นหาวัตถุทั้งหมด (กระทำไฟล์แท็ก ฯลฯ ) ที่สร้างขึ้นในช่วง 12 ชั่วโมงที่ผ่านมาและกรองวัตถุเพื่อแสดงเฉพาะการกระทำ การตรวจสอบสิ่งเหล่านี้เป็นกระบวนการที่รวดเร็ว
ฉันลองใช้สคริปต์ git-ressurect.sh ที่กล่าวถึงในคำตอบของจาคุบก่อน
man find
: "-ctime n - สถานะของไฟล์ถูกเปลี่ยนล่าสุดเมื่อ * 24 ชั่วโมงที่ผ่านมา" ดังนั้นเราควรเปลี่ยน 12 เป็น 0.5 เพื่อให้มีพฤติกรรมที่คาดหวังใน 12 ชั่วโมงที่ผ่านมา
สำหรับผู้ใช้GitHub ที่ไม่ได้ติดตั้ง Git:
หากคุณต้องการกู้คืนจากเว็บไซต์GitHubคุณสามารถใช้ APIเพื่อรับรายการกิจกรรมที่เกี่ยวข้องกับ repo:
เป็นครั้งแรก
ค้นหา SHA เหล่านั้น (ส่งมอบแฮช):
curl -i https://api.github.com/repos/PublicUser/PublicRepo/events
... หรือสำหรับ repos ส่วนตัว:
curl -su YourUserName https://api.github.com/repos/YourUserName/YourProject/events
(จะได้รับแจ้งให้ใส่รหัสผ่าน GitHub)
ต่อไป
•ไปที่สาขาและลบอันนั้น
• ในหน้าเดียวกันโดยไม่ต้องโหลดซ้ำเปิด DevTools แผงเครือข่าย ตอนนี้เตรียม ...
•คลิกคืนค่า คุณจะสังเกตเห็น "บรรทัด" ใหม่ คลิกขวาและเลือก "คัดลอกเป็น cURL" และบันทึกข้อความนี้ในโปรแกรมแก้ไขบางอย่าง
-H "Cookie="
•ผนวกไปยังจุดสิ้นสุดของเส้นคัดลอกโค้ดหนึ่งนี้:
ตอนนี้คุณควรได้รับสิ่งที่ชอบ:
curl 'https://github.com/UserName/ProjectName/branches?branch=BranchSHA&name=BranchName' -H 'Cookie:' -H 'Origin: https://github.com' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US' -H 'User-Agent: User-Agent' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'Accept: */*' -H 'Referer: https://github.com/UserName/ProjectName/branches' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' --data 'utf8=%E2%9C%93&authenticity_token=token' --compressed
ขั้นตอนสุดท้าย
PS
ฉันรู้ว่านี่อาจไม่ใช่วิธีที่ "ง่ายที่สุด" หรือ "ถูกต้อง" แต่มีให้ในกรณีที่มีคนพบว่ามีประโยชน์
git reflog
reflog
หมายเหตุ: เมื่อใช้ OAuth หรือตรวจสอบสองปัจจัยบน Githubcurl
คำสั่งจะกลายเป็นของรูปแบบ: curl -u username:token https://api.github.com/user
หรือcurl -H "Authorization: token TOKEN" https://api.github.com/repos/USER_OR_ORG_NAME/REPO_NAME/events
จากความเข้าใจของฉันถ้าสาขาอื่นที่จะลบสามารถเข้าถึงได้โดยสาขาอื่นคุณสามารถลบได้อย่างปลอดภัยโดยใช้
git branch -d [branch]
และงานของคุณจะไม่สูญหาย โปรดจำไว้ว่าสาขาไม่ใช่สแนปชอต แต่เป็นตัวชี้ไปยังสาขา ดังนั้นเมื่อคุณลบสาขาที่คุณลบตัวชี้
คุณจะไม่สูญเสียงานถ้าคุณลบสาขาที่ไม่สามารถติดต่อได้ แน่นอนว่ามันจะไม่ง่ายอย่างการตรวจสอบแฮชการกระทำ แต่คุณยังสามารถทำได้ นั่นเป็นเหตุผลที่ Git -d
ไม่สามารถลบสาขาที่ไม่สามารถเข้าถึงได้โดยใช้ แต่คุณต้องใช้
git branch -D [branch]
นี่เป็นส่วนหนึ่งของต้องดูวิดีโอจาก Scott Chacon เกี่ยวกับ Git ตรวจสอบนาที 58:00 เมื่อเขาพูดถึงสาขาและวิธีลบ
reflog
เป็นเพียง overkill
ตรวจสอบให้แน่ใจว่าได้ดำเนินการทั้งหมดนี้ในพื้นที่และยืนยันว่า repo ของคุณอยู่ในสถานะที่คุณต้องการก่อนที่จะผลักดันไปยัง Bitbucket Cloud มันอาจเป็นความคิดที่ดีที่จะลอกแบบ repo ปัจจุบันของคุณและทดสอบโซลูชันเหล่านี้ก่อน
Deleted branch <your-branch> (was <sha>)
2. หากต้องการกู้คืนสาขาให้ใช้:
git checkout -b <branch> <sha>
หากคุณไม่ทราบว่า 'sha' อยู่ด้านบนของหัวคุณสามารถ:
git reflog
git checkout -b <branch> <sha>
หากการกระทำของคุณไม่ได้อยู่ในการอ้างอิงของคุณ:
git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\ -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt
2. จากนั้นคุณสามารถแสดงการกระทำแต่ละรายการโดยใช้วิธีใดวิธีหนึ่งต่อไปนี้
git log -p <commit>
git cat-file -p <commit>
สำหรับการกู้คืนสาขาที่ถูกลบขั้นแรกให้ดูประวัติ reflog ก่อน
git reflog -n 60
โดยที่ n อ้างถึง n คอมมิตล่าสุด จากนั้นหาหัวที่เหมาะสมและสร้างสาขาด้วยหัวนั้น
git branch testbranch HEAD@{30}
ฉันรีบาวด์จากระยะไกลเพื่อพยายามล้างข้อมูลคอมมิชชันที่ฉันไม่ต้องการและกำลังจะเลือกสิ่งที่ฉันต้องการ แน่นอนฉันเขียน SHA ผิด ...
นี่คือวิธีที่ฉันพบพวกเขา (ส่วนใหญ่จะเป็นอินเทอร์เฟซ / การโต้ตอบที่ง่ายกว่าจากคำตอบที่นี่):
ก่อนอื่นให้สร้างรายการการกระทำที่หลวมในบันทึกของคุณ ทำสิ่งนี้โดยเร็วที่สุดและหยุดการทำงานเนื่องจากอาจมีการทิ้งขยะโดยตัวเก็บรวบรวมขยะ
git fsck --full --no-reflogs --unreachable --lost-found > lost
สิ่งนี้จะสร้างlost
ไฟล์ที่มีข้อผูกพันทั้งหมดที่คุณจะต้องดู เพื่อทำให้ชีวิตของเราง่ายขึ้นเราจะตัดเฉพาะ SHA จาก:
cat lost | cut -d\ -f3 > commits
ตอนนี้คุณมีcommits
ไฟล์ที่มีการกระทำทั้งหมดที่คุณต้องดู
สมมติว่าคุณกำลังใช้ Bash ขั้นตอนสุดท้าย:
for c in `cat commits`; do git show $c; read; done
สิ่งนี้จะแสดงข้อมูลที่แตกต่างและการส่งมอบข้อมูลให้กับแต่ละรายการ Enterและรอให้คุณกด ตอนนี้เขียนสิ่งที่คุณต้องการแล้วเชอร์รี่เลือกพวกเขาหลังจากที่คุณทำเสร็จเพียงแค่ Ctrl-C มัน
ใหญ่ใช่
หากคุณใช้ GIT ให้ ทำตามขั้นตอนง่าย ๆ เหล่านี้ https://confluence.atlassian.com/bbkb/how-to-restore-a-deleted-branch-765757540.html
หากคุณกำลังใช้ smartgit และผลักสาขานั้น ไปที่ต้นกำเนิดแล้วค้นหาสาขานั้นและคลิกขวาจากนั้นชำระเงิน
ขั้นแรกให้ไปที่ชุดคอมไพล์การย้ายไปยังโครงการของคุณเช่น:
cd android studio project
cd Myproject
then type :
git reflog
คุณทุกคนมีรายการของการเปลี่ยนแปลงและหมายเลขอ้างอิงใช้หมายเลขอ้างอิงจากนั้นชำระเงิน
จากสตูดิโอ Android หรือจาก Betcha git วิธีการแก้ปัญหาอื่นใช้หมายเลขอ้างอิงและไปที่สตูดิโอ Android คลิกที่สาขา Git ลงแล้วคลิกที่แท็กชำระเงินหรือแก้ไขที่ผ่านมาหมายเลขอ้างอิงแล้วฮ่า ๆ คุณมีสาขา
เมื่อเพิ่มคำตอบของ tfe คุณสามารถกู้คืนได้ด้วยกระบวนการที่กล่าวถึงนี้เว้นแต่ว่าจะไม่ได้เก็บขยะ สาขา Git เป็นเพียงตัวชี้ไปยังกระทำเฉพาะในต้นไม้กระทำ แต่ถ้าคุณลบตัวชี้และคอมมิชชันในสาขานั้นจะไม่ถูกรวมเข้ากับสาขาอื่น ๆ ที่มีอยู่แล้วคอมไพล์จะถือว่ามันเป็นทางห้อยและทำการลบในระหว่างการเก็บขยะซึ่งมันอาจทำงานโดยอัตโนมัติเป็นระยะ
หากสาขาของคุณไม่ได้รวมกับสาขาที่มีอยู่และหากเป็นขยะที่เก็บรวบรวมคุณจะสูญเสียการผูกมัดทั้งหมดจนกว่าจะถึงจุดที่สาขาถูกแยกจากสาขาที่มีอยู่
ปัญหาที่เกี่ยวข้อง: ฉันมาที่หน้านี้หลังจากค้นหา "วิธีรู้ว่าสาขาใดถูกลบ"
ในขณะที่ลบสาขาเก่าหลายแห่งฉันรู้สึกว่าได้ลบสาขาใหม่ที่ผิดพลาดไป แต่ไม่ทราบชื่อเพื่อกู้คืน
หากต้องการทราบว่าจะลบสาขาใดเมื่อเร็ว ๆ นี้ให้ทำดังนี้:
หากคุณไปที่ URL Git ของคุณซึ่งจะมีลักษณะดังนี้:
https://your-website-name/orgs/your-org-name/dashboard
จากนั้นคุณสามารถดูฟีดของสิ่งที่ถูกลบโดยที่ในอดีตที่ผ่านมา
ฉันทำสิ่งนี้ในคอมพิวเตอร์ที่ฉันลบสาขา:
git reflog
การตอบสนอง:
74b2383 (develope) HEAD@{1}: checkout: moving from master to develope
40ef328 (HEAD -> master, origin/master, origin/HEAD) HEAD@{2}: checkout: moving from develope to master
74b2383 (develope) HEAD@{3}: checkout: moving from master to develope
40ef328 (HEAD -> master, origin/master, origin/HEAD) HEAD@{4}: reset: moving to HEAD
40ef328 (HEAD -> master, origin/master, origin/HEAD) HEAD@{5}: clone: from http://LOCALGITSERVER/myBigProject/Android.git
และฉันดึงสาขาด้วยคำสั่งนี้:
git checkout -b newBranchName 74b2383
เพียงแค่ใช้git reflog
ไม่ได้ส่งคืนsha
สำหรับฉัน เฉพาะcommit id
(ซึ่งมีความยาว 8 ตัวอักษรและ sha จะยาวกว่า)
ดังนั้นฉันใช้
git reflog --no-abbrev
จากนั้นทำเช่นเดียวกันกับที่กล่าวไว้ข้างต้น:
git checkout -b <branch> <sha>
โปรดทราบว่าสาขา git ลบเพียงลบสำเนาในเครื่องไม่ใช่คัดลอกบนเซิร์ฟเวอร์ ขั้นแรกในพาเนล Git (ไอคอน git บนแถบเครื่องมือด้านซ้าย) ดูผ่านสาขาและดูว่าสาขาของคุณยังคงอยู่ภายใต้ "origin / your_branch_name" หรือไม่ ถ้าเป็นเช่นนั้นเพียงแค่เลือกและคุณจะได้รับรหัสของคุณกลับคืน (แนะนำให้คุณคัดลอก / วาง / บันทึกในพื้นที่อื่น)
หากคุณไม่เห็น "origin / your_branch_name" ให้ติดตั้งส่วนขยาย GitLens สิ่งนี้ช่วยให้คุณมองไปรอบ ๆ ในที่เก็บเซิร์ฟเวอร์และค้นหาสำเนาที่คุณซิงค์กับเซิร์ฟเวอร์ หากคุณมีที่เก็บหลายแห่งโปรดทราบว่าอาจจำเป็นต้องเปิดไฟล์อย่างน้อยหนึ่งไฟล์จากที่เก็บที่ต้องการเพื่อให้ที่เก็บปรากฏใน GitLens แล้ว:
เปิดพาเนล GitLens
ขยายที่เก็บ
คุณควรเห็นรายการหมวดหมู่: สาขา / ผู้มีส่วนร่วม / รีโมท / ที่หยุด / ฯลฯ
คุณควรหา YourLostTreasure ภายใต้ "Branches" หรืออาจอยู่ภายใต้ "Remotes -> Origins" หวังว่าคุณจะเห็นสาขาที่มีชื่อที่ต้องการ - ถ้าคุณขยายมันคุณควรเห็นไฟล์ที่คุณเปลี่ยนในสาขานั้น คลิกสองครั้งที่ชื่อไฟล์เพื่อเปิดและสำรองรหัสนั้นทันที
หากคุณไม่เห็นสาขาที่หายไปของคุณให้รีบไปและถ้าคุณพบสิ่งที่สัญญาให้เปิดและคว้ารหัสทันที ฉันต้องสะกิดนิดหน่อยจนกว่าฉันจะพบ TheGoldenBranch และแม้กระทั่งรหัสก็หายไปหนึ่งหรือสองครั้งที่ผ่านมาบันทึก (อาจเป็นเพราะฉันล้มเหลวในการซิงค์กับเซิร์ฟเวอร์ก่อนที่จะพยายาม -a-Branch-Merge- แต่บังเอิญคลิกที่ - สาขาลบ) การค้นหาของฉันยาวเกินไปโดยไม่จำเป็นเพราะเมื่อฉันพบสาขาครั้งแรกฉันไม่แน่ใจว่าชื่อนั้นถูกต้องหรือไม่ดังนั้นจึงต้องใช้เวลาในการค้นหาสาขาแรกนั้นอีกครั้ง (ดังนั้น Carpe Carpum แล้ว ดูต่อไป)