ฉันสามารถกู้คืนสาขาหลังจากลบใน Git ได้หรือไม่?


1066

ถ้าฉันวิ่งgit branch -d XYZมีวิธีกู้สาขาหรือไม่ มีวิธีการย้อนกลับไหมถ้าฉันไม่ได้เรียกใช้คำสั่งสาขาลบ?


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

คำตอบ:


1955

ใช่คุณควรจะสามารถที่จะทำgit reflogและหา SHA1 git checkout [sha]สำหรับการกระทำที่ปลายสุดของสาขาที่ถูกลบของคุณแล้วเพียง และเมื่อคุณทำอย่างนั้นคุณก็สามารถgit checkout -b [branchname]สร้างสาขาขึ้นใหม่ได้จากที่นั่น


มอบเครดิตให้แก่ @Cascabel สำหรับเวอร์ชันย่อ / ซับในรุ่นนี้

คุณสามารถทำได้ในขั้นตอนเดียว:

git checkout -b <branch> <sha>

477
คุณสามารถทำได้ในขั้นตอนเดียว: git checkout -b <branch> <sha>.
Cascabel

200
เคล็ดลับด่วน - หากคุณเพิ่งลบสาขาคุณจะเห็นสิ่งนี้ในเทอร์มินัล - "ลบสาขา <your-branch> (คือ <sha>)" และจากนั้นมันง่ายสุด ๆ - แค่ใช้<sha>มัน เช่นที่กล่าวถึงข้างต้น -git checkout -b <branch> <sha>
โนว์บัช

6
แท้จริงแล้วเป็นเพียงแค่เลื่อนขึ้นในสถานีของคุณ (ยกเว้นกรณีที่คุณไม่ได้CMD+K)
neaumusic

42
ใช้git reflog --no-abbrevเพื่อดูแบบเต็มที่<sha>ย่อโดยค่าเริ่มต้น
jkulak

5
สำหรับคนอื่นเหมือนผมที่มีปัญหาในการหาหม่าสาขาที่ถูกลบ: git checkout remotes/origin/deleted_branchฉันก็สามารถที่จะ
Jeff Irwin

161

เวลาส่วนใหญ่ที่ไม่สามารถเข้าถึงได้กระทำอยู่ในการอ้างอิง ดังนั้นสิ่งแรกที่ต้องลองคือดู 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


2
ความช่วยเหลืออย่างมาก ฉันมีความมุ่งมั่นที่หายไปที่ไม่เคยอยู่ใน repo ท้องถิ่นของฉัน คำสั่งแรกที่คุณมีอยู่นั้นช่วยฉันค้นหามันบนเซิร์ฟเวอร์ +1
Sean Adkinson

1
นามแฝงกู้ภัย git นั้นมาจากสวรรค์ !!! ขอบคุณมากสำหรับการมีส่วนร่วม!
72A12F4E

2
คุณช่วยชีวิตฉัน.
Jed Lynch

คำตอบของ Patrick Koorevaar ช่วยฉันเพราะฉันไม่ทราบว่าฉันได้ลบคอมมิชชันล่าสุดแล้ว <sha>
Monir Khan

@ Monir-Khan และ? ฉันควรสรุปอะไร แพทริคคำตอบเป็นเพียงสำเนา / วางคำสั่งของฉัน (กับข้อผิดพลาด: เขาลืมที่จะกรองกระทำ) ...
ฟิลิปป์

45

หากคุณต้องการใช้ GUI คุณสามารถดำเนินการทั้งหมดด้วย gitk

gitk --reflog

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


28

โซลูชันที่ได้รับคะแนนสูงสุดทำมากกว่าที่ร้องขอ:

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>ดังนั้นบอกชื่อของคุณอย่างชาญฉลาด :)


14

การเพิ่มไปยังคำตอบtfe : นอกจากนี้ยังมีสคริปต์git-resurrect.shในcontrib/พื้นที่ของแหล่ง Git (ในที่เก็บ git.git) ซึ่งอาจช่วยคุณได้

git-resurrect <name>พยายามค้นหาร่องรอยของปลายกิ่งที่เรียกว่า<name>และพยายามคืนชีพให้ใหม่ ขณะนี้การอ้างอิงจะค้นหาข้อความเช็คเอาต์และ-rรวมข้อความไว้ด้วย ด้วย -mและ-tประวัติของการอ้างอิงทั้งหมดจะถูกสแกนเพื่อMerge <name> into other/ Merge <other> into <name>(ตามลำดับ) ส่งเรื่องที่ค่อนข้างช้า แต่อนุญาตให้คุณฟื้นสาขาหัวข้อของผู้อื่น


1
มันใช้งานได้สำหรับฉันตอนนี้แม้ว่าฉันจะต้องเพิ่ม / usr / lib / git-core / ลงใน PATH ของฉัน แต่มันไม่ได้แสดงปาฏิหาริย์ที่ฉันหวังไว้ :(
AmanicA

10

ฉันใช้คำสั่งต่อไปนี้เพื่อค้นหาและดึงสาขาที่ถูกลบของฉัน ขั้นตอนแรกนั้นมาจากคำอธิบายของ 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

ขอบคุณมาก. ใช้เวลาเล็กน้อยในการค้นหาชื่อ แต่เวลาคุ้มค่า หากมีวิธีในการค้นหาสตริงข้อความยอมรับก็จะดีกว่ามาก
Monir Khan

9

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

จากภายใน.git/objectsไดเรกทอรีที่ทำงาน:

find . -ctime -12h -type f | sed 's/[./]//g' | git cat-file --batch-check | grep commit

สิ่งนี้จะค้นหาวัตถุทั้งหมด (กระทำไฟล์แท็ก ฯลฯ ) ที่สร้างขึ้นในช่วง 12 ชั่วโมงที่ผ่านมาและกรองวัตถุเพื่อแสดงเฉพาะการกระทำ การตรวจสอบสิ่งเหล่านี้เป็นกระบวนการที่รวดเร็ว

ฉันลองใช้สคริปต์ git-ressurect.sh ที่กล่าวถึงในคำตอบของจาคุบก่อน


1
แนวคิดทางเลือกที่ดี! คำสั่งของคุณเกิดข้อผิดพลาด ปัญหาเกิดขึ้นกับส่วน "12h" (อันที่จริง "h") เมื่อฉันลบ "h" มันก็ใช้ได้ จากman find: "-ctime n - สถานะของไฟล์ถูกเปลี่ยนล่าสุดเมื่อ * 24 ชั่วโมงที่ผ่านมา" ดังนั้นเราควรเปลี่ยน 12 เป็น 0.5 เพื่อให้มีพฤติกรรมที่คาดหวังใน 12 ชั่วโมงที่ผ่านมา
pagliuca

1
ฉันใช้ OS X 10.8 ที่นี่ดังนั้นแฟล็ก 'ค้นหา' ด้านบนจะขึ้นอยู่กับเวอร์ชันที่จัดส่ง
Robert Knight

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

9

สำหรับผู้ใช้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)

    • (หาก repo เรียกร้องสิทธิ์สองปัจจัยให้ดูความคิดเห็นในคำตอบนี้ด้านล่าง)

ต่อไป

  • ไปที่GitHubและสร้างสาขาชั่วคราวใหม่ซึ่งจะถูกลบทิ้งตลอดกาล ( Chromeจะดีกว่า)

   •ไปที่สาขาและลบอันนั้น

   •   ในหน้าเดียวกันโดยไม่ต้องโหลดซ้ำเปิด 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

ขั้นตอนสุดท้าย

  • แทนที่ "BranchSHA" ด้วย SHA-hash และ BranchName ของคุณด้วยชื่อที่ต้องการ (BTW มันเป็นแฮ็คที่ยอดเยี่ยมในการเปลี่ยนชื่อสาขาจากเว็บ) หากคุณไม่ช้าเกินไปคุณจะต้องทำคำขอนี้อย่างใดอย่างหนึ่ง ตัวอย่างเช่นเพียงคัดลอกวางไปยังเทอร์มินัล

PS

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


1
ข้างต้นเป็นหนึ่งในไม่กี่ออกมีที่ไม่พึ่งพาและดังนั้นจึงมีประโยชน์เช่นเมื่อมีการลบสาขาที่ห่างไกลและการเข้าถึงที่หายไปยังเครื่องคอมพิวเตอร์ที่ทำจากดังนั้นไม่มีอะไรเย็นที่มีประโยชน์จะได้รับจาก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
TT--

@ TT-- ว้าวฉันดีใจที่มันช่วยได้! และขอขอบคุณสำหรับการสนับสนุนของคุณเกี่ยวกับการรับรองความถูกต้องโทเค็น :)
Maxim Mazurok

8

จากความเข้าใจของฉันถ้าสาขาอื่นที่จะลบสามารถเข้าถึงได้โดยสาขาอื่นคุณสามารถลบได้อย่างปลอดภัยโดยใช้

git branch -d [branch]

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

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

git branch -D [branch]

นี่เป็นส่วนหนึ่งของต้องดูวิดีโอจาก Scott Chacon เกี่ยวกับ Git ตรวจสอบนาที 58:00 เมื่อเขาพูดถึงสาขาและวิธีลบ

รู้เบื้องต้นเกี่ยวกับ Git กับ Scott Chacon ของ GitHub


7
สิ่งนี้จะช่วยตอบคำถามได้อย่างไร
Dmitri Zaitsev

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

1
ต้องเลื่อนสามหน้าจอไปที่ AT LAST เพื่อหาคำตอบที่อยู่ปัญหา: การลบสาขาคือการลบตัวชี้เพียง ไม่มีสถานการณ์การสูญหายของข้อมูลที่นี่สิ่งเดียวที่จะกู้คืนคือที่ที่มันชี้ คำตอบที่ไปโดยตรงreflogเป็นเพียง overkill
RomainValeri

5

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

  1. หากคุณเพิ่งลบสาขาคุณจะเห็นสิ่งนี้ในเทอร์มินัลของคุณ:
    Deleted branch <your-branch> (was <sha>)

2. หากต้องการกู้คืนสาขาให้ใช้:

    git checkout -b <branch> <sha>

หากคุณไม่ทราบว่า 'sha' อยู่ด้านบนของหัวคุณสามารถ:

  1. ค้นหา 'sha' สำหรับการกระทำที่ส่วนปลายของสาขาที่คุณลบโดยใช้:
    git reflog
  1. ในการกู้คืนสาขาให้ใช้:
    git checkout -b <branch> <sha>

หากการกระทำของคุณไม่ได้อยู่ในการอ้างอิงของคุณ:

  1. คุณสามารถลองกู้คืนสาขาโดยการรีเซ็ตสาขาของคุณเป็น 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>

4

สำหรับการกู้คืนสาขาที่ถูกลบขั้นแรกให้ดูประวัติ reflog ก่อน

git reflog -n 60

โดยที่ n อ้างถึง n คอมมิตล่าสุด จากนั้นหาหัวที่เหมาะสมและสร้างสาขาด้วยหัวนั้น

git branch testbranch HEAD@{30}

4

ฉันรีบาวด์จากระยะไกลเพื่อพยายามล้างข้อมูลคอมมิชชันที่ฉันไม่ต้องการและกำลังจะเลือกสิ่งที่ฉันต้องการ แน่นอนฉันเขียน 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 มัน


2

ใหญ่ใช่

หากคุณใช้ GIT ให้ ทำตามขั้นตอนง่าย ๆ เหล่านี้ https://confluence.atlassian.com/bbkb/how-to-restore-a-deleted-branch-765757540.html

หากคุณกำลังใช้ smartgit และผลักสาขานั้น ไปที่ต้นกำเนิดแล้วค้นหาสาขานั้นและคลิกขวาจากนั้นชำระเงิน


1

ขั้นแรกให้ไปที่ชุดคอมไพล์การย้ายไปยังโครงการของคุณเช่น:

cd android studio project
cd Myproject
then type :
git reflog

คุณทุกคนมีรายการของการเปลี่ยนแปลงและหมายเลขอ้างอิงใช้หมายเลขอ้างอิงจากนั้นชำระเงิน
จากสตูดิโอ Android หรือจาก Betcha git วิธีการแก้ปัญหาอื่นใช้หมายเลขอ้างอิงและไปที่สตูดิโอ Android คลิกที่สาขา Git ลงแล้วคลิกที่แท็กชำระเงินหรือแก้ไขที่ผ่านมาหมายเลขอ้างอิงแล้วฮ่า ๆ คุณมีสาขา


1

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

หากสาขาของคุณไม่ได้รวมกับสาขาที่มีอยู่และหากเป็นขยะที่เก็บรวบรวมคุณจะสูญเสียการผูกมัดทั้งหมดจนกว่าจะถึงจุดที่สาขาถูกแยกจากสาขาที่มีอยู่


1

ปัญหาที่เกี่ยวข้อง: ฉันมาที่หน้านี้หลังจากค้นหา "วิธีรู้ว่าสาขาใดถูกลบ"

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

หากต้องการทราบว่าจะลบสาขาใดเมื่อเร็ว ๆ นี้ให้ทำดังนี้:

หากคุณไปที่ URL Git ของคุณซึ่งจะมีลักษณะดังนี้:

https://your-website-name/orgs/your-org-name/dashboard

จากนั้นคุณสามารถดูฟีดของสิ่งที่ถูกลบโดยที่ในอดีตที่ผ่านมา


แน่ใจ คำตอบข้างต้นสำหรับ GitHub เราติดตั้ง GitHub ภายในเครื่อง ขอบคุณที่ถามคำถาม
Manohar Reddy Poreddy

1

ฉันทำสิ่งนี้ในคอมพิวเตอร์ที่ฉันลบสาขา:

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


0

เพียงแค่ใช้git reflogไม่ได้ส่งคืนshaสำหรับฉัน เฉพาะcommit id(ซึ่งมีความยาว 8 ตัวอักษรและ sha จะยาวกว่า)

ดังนั้นฉันใช้ git reflog --no-abbrev

จากนั้นทำเช่นเดียวกันกับที่กล่าวไว้ข้างต้น: git checkout -b <branch> <sha>


คุณสามารถใช้ตัวละคร sha 8 ตัวย่อได้ตลอดเวลาคุณไม่จำเป็นต้องใช้ sha เต็มรูปแบบ
Michael Dreher

0

หากคุณใช้ VSCode ... และคุณซิงค์สาขาของคุณกับเซิร์ฟเวอร์ในบางจุดก่อนที่จะลบ ...

โปรดทราบว่าสาขา git ลบเพียงลบสำเนาในเครื่องไม่ใช่คัดลอกบนเซิร์ฟเวอร์ ขั้นแรกในพาเนล Git (ไอคอน git บนแถบเครื่องมือด้านซ้าย) ดูผ่านสาขาและดูว่าสาขาของคุณยังคงอยู่ภายใต้ "origin / your_branch_name" หรือไม่ ถ้าเป็นเช่นนั้นเพียงแค่เลือกและคุณจะได้รับรหัสของคุณกลับคืน (แนะนำให้คุณคัดลอก / วาง / บันทึกในพื้นที่อื่น)

หากคุณไม่เห็น "origin / your_branch_name" ให้ติดตั้งส่วนขยาย GitLens สิ่งนี้ช่วยให้คุณมองไปรอบ ๆ ในที่เก็บเซิร์ฟเวอร์และค้นหาสำเนาที่คุณซิงค์กับเซิร์ฟเวอร์ หากคุณมีที่เก็บหลายแห่งโปรดทราบว่าอาจจำเป็นต้องเปิดไฟล์อย่างน้อยหนึ่งไฟล์จากที่เก็บที่ต้องการเพื่อให้ที่เก็บปรากฏใน GitLens แล้ว:

  1. เปิดพาเนล GitLens

  2. ขยายที่เก็บ

  3. คุณควรเห็นรายการหมวดหมู่: สาขา / ผู้มีส่วนร่วม / รีโมท / ที่หยุด / ฯลฯ

คุณควรหา YourLostTreasure ภายใต้ "Branches" หรืออาจอยู่ภายใต้ "Remotes -> Origins" หวังว่าคุณจะเห็นสาขาที่มีชื่อที่ต้องการ - ถ้าคุณขยายมันคุณควรเห็นไฟล์ที่คุณเปลี่ยนในสาขานั้น คลิกสองครั้งที่ชื่อไฟล์เพื่อเปิดและสำรองรหัสนั้นทันที

หากคุณไม่เห็นสาขาที่หายไปของคุณให้รีบไปและถ้าคุณพบสิ่งที่สัญญาให้เปิดและคว้ารหัสทันที ฉันต้องสะกิดนิดหน่อยจนกว่าฉันจะพบ TheGoldenBranch และแม้กระทั่งรหัสก็หายไปหนึ่งหรือสองครั้งที่ผ่านมาบันทึก (อาจเป็นเพราะฉันล้มเหลวในการซิงค์กับเซิร์ฟเวอร์ก่อนที่จะพยายาม -a-Branch-Merge- แต่บังเอิญคลิกที่ - สาขาลบ) การค้นหาของฉันยาวเกินไปโดยไม่จำเป็นเพราะเมื่อฉันพบสาขาครั้งแรกฉันไม่แน่ใจว่าชื่อนั้นถูกต้องหรือไม่ดังนั้นจึงต้องใช้เวลาในการค้นหาสาขาแรกนั้นอีกครั้ง (ดังนั้น Carpe Carpum แล้ว ดูต่อไป)

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