Jika saya lari git branch -d XYZ
, apakah ada cara untuk memulihkan cabang? Apakah ada cara untuk kembali seolah-olah saya tidak menjalankan perintah delete branch?
Jika saya lari git branch -d XYZ
, apakah ada cara untuk memulihkan cabang? Apakah ada cara untuk kembali seolah-olah saya tidak menjalankan perintah delete branch?
Jawaban:
Ya, Anda harus dapat melakukan git reflog
dan menemukan SHA1 untuk komit di ujung cabang yang Anda hapus, lalu adil git checkout [sha]
. Dan begitu Anda berkomitmen, Anda dapat git checkout -b [branchname]
membuat ulang cabang dari sana.
Kredit ke @Cascabel untuk versi kental / satu baris ini.
Anda dapat melakukannya dalam satu langkah:
git checkout -b <branch> <sha>
git checkout -b <branch> <sha>
.
<sha>
. Misalnya seperti yang disebutkan di atas -git checkout -b <branch> <sha>
CMD+K
)
git reflog --no-abbrev
untuk melihat penuh <sha>
yang disingkat secara default.
git checkout remotes/origin/deleted_branch
.
Sebagian besar waktu komitmen yang tidak terjangkau berada di reflog. Jadi, hal pertama yang harus dicoba adalah melihat reflog menggunakan perintah git reflog
(yang menampilkan reflog untuk HEAD
).
Mungkin sesuatu yang lebih mudah jika komit adalah bagian dari cabang tertentu yang masih ada adalah dengan menggunakan perintah git reflog name-of-my-branch
. Ini juga berfungsi dengan remote, misalnya jika Anda memaksakan push (saran tambahan: selalu lebih suka git push --force-with-lease
mencegah kesalahan yang lebih baik dan lebih dapat dipulihkan).
Jika komit Anda tidak ada dalam reflog Anda (mungkin karena dihapus oleh alat pihak ke-3 yang tidak menulis di reflog), saya berhasil memulihkan cabang dengan menyetel ulang cabang saya ke sha dari commit yang ditemukan menggunakan perintah seperti itu (itu membuat file dengan semua komit yang menggantung):
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
Jika Anda harus menggunakannya lebih dari satu kali (atau ingin menyimpannya di suatu tempat), Anda juga dapat membuat alias dengan perintah itu ...
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'
dan menggunakannya dengan git rescue
Untuk menyelidiki komit yang ditemukan, Anda dapat menampilkan setiap komit menggunakan beberapa perintah untuk memeriksanya.
Untuk menampilkan metadata komit (penulis, tanggal pembuatan dan pesan komit):
git cat-file -p 48540dfa438ad8e442b18e57a5a255c0ecad0560
Untuk melihat juga perbedaan:
git log -p 48540dfa438ad8e442b18e57a5a255c0ecad0560
Setelah Anda menemukan komit Anda, kemudian buat cabang di komit ini dengan:
git branch commit_rescued 48540dfa438ad8e442b18e57a5a255c0ecad0560
Untuk yang berada di bawah Windows dan suka GUI, Anda dapat dengan mudah memulihkan komit (dan juga file bertahap yang tidak dikomit) dengan GitExtensions dengan menggunakan fitur Repository
=> Git maintenance
=>Recover lost objects...
Perintah serupa untuk dengan mudah memulihkan file bertahap dihapus: https://stackoverflow.com/a/58853981/717372
Jika Anda suka menggunakan GUI, Anda dapat melakukan seluruh operasi dengan gitk.
gitk --reflog
Ini akan memungkinkan Anda untuk melihat riwayat komit cabang seolah-olah cabang belum dihapus. Sekarang cukup klik kanan pada komit terbaru ke cabang dan pilih opsi menu Create new branch
.
Solusi pilihan teratas sebenarnya lebih dari yang diminta:
git checkout <sha>
git checkout -b <branch>
atau
git checkout -b <branch> <sha>
memindahkan Anda ke cabang baru bersama dengan semua perubahan terbaru yang Anda mungkin lupa untuk komit. Ini mungkin bukan niat Anda, terutama ketika dalam "mode panik" setelah kehilangan cabang.
Solusi yang lebih bersih (dan lebih sederhana) tampaknya adalah one-liner (setelah Anda menemukan <sha>
dengan git reflog
):
git branch <branch> <sha>
Sekarang, cabang Anda saat ini atau perubahan yang tidak dikomit tidak terpengaruh. Sebaliknya, hanya cabang baru yang akan dibuat hingga<sha>
.
Jika bukan tip, itu masih akan berfungsi dan Anda mendapatkan cabang yang lebih pendek, maka Anda dapat mencoba lagi dengan <sha>
nama cabang baru dan baru sampai Anda melakukannya dengan benar.
Akhirnya, Anda dapat mengubah nama cabang yang berhasil dipulihkan menjadi nama atau apa pun namanya:
git branch -m <restored branch> <final branch>
Tidak perlu dikatakan, kunci sukses adalah menemukan komitmen yang tepat <sha>
, jadi sebutkan komitmen Anda dengan bijak :)
Menambah jawaban tfe : ada juga skrip git-resurrect.sh di contrib/
area sumber Git (di repositori git.git), yang mungkin membantu Anda.
git-resurrect <name>
mencoba menemukan jejak ujung cabang yang disebut<name>
, dan mencoba menghidupkannya kembali. Saat ini, reflog sedang mencari pesan checkout, dan dengan-r
juga menggabungkan pesan. Dengan-m
dan-t
, riwayat semua referensi dipindai untukMerge <name> into other
/Merge <other> into <name>
(masing-masing) melakukan subyek, yang agak lambat tetapi memungkinkan Anda untuk menghidupkan kembali cabang topik orang lain.
Saya menggunakan perintah berikut untuk menemukan dan mengambil cabang saya yang dihapus. Langkah pertama adalah dari deskripsi 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
Sekarang cari git commit id (GIT-SHA) berdasarkan komentar komit dan gunakan dalam perintah di bawah ini. Periksa cabang baru bernama NEW-CABANG dengan GIT-SHA yang ditemukan sebelumnya:
$ git checkout -b NEW-BRANCH GIT-SHA
Jika Anda tidak memiliki reflog, mis. karena Anda bekerja di repositori kosong yang tidak mengaktifkan reflog dan komit yang ingin Anda pulihkan dibuat baru-baru ini, opsi lain adalah menemukan objek komit yang baru dibuat dan melihatnya.
Dari dalam .git/objects
direktori run:
find . -ctime -12h -type f | sed 's/[./]//g' | git cat-file --batch-check | grep commit
Ini menemukan semua objek (komit, file, tag, dll.) Dibuat dalam 12 jam terakhir dan memfilternya untuk menunjukkan hanya komit. Memeriksa ini kemudian merupakan proses yang cepat.
Saya akan mencoba skrip git-ressurect.sh yang disebutkan dalam jawaban Jakub terlebih dahulu.
man find
: "-ctime n - Status file terakhir diubah n * 24 jam yang lalu." Jadi kita juga harus mengubah 12 menjadi 0,5 untuk memiliki perilaku yang diharapkan dari 12 jam terakhir.
Untuk pengguna GitHub tanpa Git terpasang:
Jika Anda ingin mengembalikannya dari situs web GitHub , Anda dapat menggunakan API mereka untuk mendapatkan daftar acara terkait repo:
Pertama
temukan SHA tersebut (melakukan hash):
curl -i https://api.github.com/repos/PublicUser/PublicRepo/events
... atau untuk repo pribadi:
curl -su YourUserName https://api.github.com/repos/YourUserName/YourProject/events
(akan diminta kata sandi GitHub)
Lanjut
• Pergi ke cabang dan hapus yang itu.
• Di halaman yang sama, tanpa memuat ulang , buka DevTools, panel Network. Sekarang persiapkan ...
• Klik pulihkan. Anda akan melihat "baris" baru. Klik kanan padanya dan pilih "Copy as cURL" dan simpan teks ini di beberapa editor.
• Tambahkan ke akhir baris kode yang disalin, yang ini: -H "Cookie="
.
Anda sekarang harus mendapatkan sesuatu seperti:
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
Langkah terakhir
PS
Saya menyadari ini mungkin bukan solusi "paling sederhana" atau "tepat", tetapi ditawarkan jika seseorang merasa itu berguna.
git reflog
dan karena itu berguna misalnya ketika telah menghapus cabang jauh dan kehilangan akses ke komputer yang dilakukan dari sehingga tidak ada pilek berguna yang didapat reflog
. Catatan saat menggunakan OAuth atau autentikasi dua faktor pada Github , curl
perintah tersebut menjadi dalam bentuk: curl -u username:token https://api.github.com/user
ataucurl -H "Authorization: token TOKEN" https://api.github.com/repos/USER_OR_ORG_NAME/REPO_NAME/events
Dari pemahaman saya jika cabang yang akan dihapus dapat dijangkau oleh cabang lain, Anda dapat menghapusnya dengan aman
git branch -d [branch]
dan pekerjaanmu tidak hilang. Ingatlah bahwa suatu cabang bukanlah snapshot, tetapi sebuah penunjuk ke yang satu. Jadi, ketika Anda menghapus cabang, Anda menghapus pointer.
Anda bahkan tidak akan kehilangan pekerjaan jika Anda menghapus cabang yang tidak dapat dijangkau oleh cabang lainnya. Tentu saja itu tidak akan semudah memeriksa hash komit, tetapi Anda masih bisa melakukannya. Itu sebabnya Git tidak dapat menghapus cabang yang tidak dapat dijangkau dengan menggunakan -d
. Sebaliknya Anda harus menggunakan
git branch -D [branch]
Ini adalah bagian dari video yang harus ditonton dari Scott Chacon tentang Git. Periksa menit 58:00 ketika ia berbicara tentang cabang dan bagaimana menghapusnya.
reflog
hanya berlebihan.
Pastikan untuk melakukan semua ini secara lokal, dan konfirmasikan repo Anda berada dalam kondisi yang Anda inginkan sebelum mendorong ke Bitbucket Cloud. Mungkin juga merupakan ide bagus untuk mengkloning repo Anda saat ini, dan menguji solusi ini terlebih dahulu.
Deleted branch <your-branch> (was <sha>)
2. Untuk mengembalikan cabang, gunakan:
git checkout -b <branch> <sha>
Jika Anda tidak tahu 'sha' di atas kepala Anda, Anda dapat:
git reflog
git checkout -b <branch> <sha>
Jika komit Anda tidak ada dalam reflog Anda:
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. Anda kemudian dapat menampilkan setiap komit menggunakan salah satu dari ini:
git log -p <commit>
git cat-file -p <commit>
Saya mengubah cabang dari jarak jauh untuk mencoba menghapus beberapa komitmen yang tidak saya inginkan dan akan memilih yang tepat yang saya inginkan. Tentu saja saya salah menulis SHA ...
Inilah cara saya menemukannya (sebagian besar antarmuka / interaksi yang lebih mudah dari hal-hal pada jawaban di sini):
Pertama, buat daftar komitmen longgar di log Anda. Lakukan ini sesegera mungkin dan berhenti bekerja, karena mungkin dibuang oleh pengumpul sampah.
git fsck --full --no-reflogs --unreachable --lost-found > lost
Ini membuat lost
file dengan semua komit yang harus Anda lihat. Untuk menyederhanakan hidup kita, mari kita potong saja SHA darinya:
cat lost | cut -d\ -f3 > commits
Sekarang Anda memiliki commits
file dengan semua komitmen yang harus Anda perhatikan.
Dengan asumsi Anda menggunakan Bash, langkah terakhir:
for c in `cat commits`; do git show $c; read; done
Ini akan menunjukkan kepada Anda perbedaan dan komit informasi untuk masing-masing dari mereka. Dan menunggu Anda menekan Enter. Sekarang tulis semua yang Anda inginkan, lalu pilih-ceri. Setelah Anda selesai, cukup Ctrl-C saja.
YA BESAR
jika Anda menggunakan GIT, ikuti langkah-langkah sederhana ini https://confluence.atlassian.com/bbkb/how-to-restore-a-deleted-branch-765757540.html
jika Anda menggunakan smartgit dan sudah mendorong cabang itu pergi ke asal, temukan cabang itu dan klik kanan lalu checkout
Pertama pergi ke git batch perpindahan ke proyek Anda seperti:
cd android studio project
cd Myproject
then type :
git reflog
Anda semua memiliki daftar perubahan dan nomor referensi ambil nomor ref kemudian checkout
dari studio android atau dari git betcha. solusi lain ambil nomor ref dan buka android studio klik pada cabang git ke bawah lalu klik pada checkout tag atau revisi melewati nomor referensi lalu lol Anda memiliki cabang.
Menambah jawaban Anda, Anda dapat memulihkan dengan proses ini disebutkan, kecuali jika komit tidak mengumpulkan sampah. Cabang Git hanyalah sebuah pointer ke komit tertentu di pohon komit. Tetapi jika Anda menghapus pointer, dan komit pada cabang itu tidak digabung ke cabang lain yang ada, maka git memperlakukannya sebagai menggantung komit dan menghapusnya selama pengumpulan sampah, yang dapat berjalan secara otomatis secara berkala.
Jika cabang Anda tidak digabung ke cabang yang ada, dan jika itu adalah sampah yang dikumpulkan, maka Anda akan kehilangan semua komitmen sampai titik dari mana cabang itu bercabang dari cabang yang ada.
Masalah terkait: Saya membuka halaman ini setelah mencari "bagaimana cara mengetahui apa yang dihapus cabang".
Saat menghapus banyak cabang lama, saya merasa salah menghapus cabang yang baru, tetapi tidak tahu nama untuk memulihkannya.
Untuk mengetahui cabang apa yang dihapus baru-baru ini, lakukan hal berikut:
Jika Anda membuka URL Git Anda, yang akan terlihat seperti ini:
https://your-website-name/orgs/your-org-name/dashboard
Kemudian Anda dapat melihat umpan, dari apa yang dihapus, oleh siapa, di masa lalu.
Saya melakukan ini di komputer yang saya hapus cabang:
git reflog
tanggapan:
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
dan saya mengambil cabang dengan perintah ini:
git checkout -b newBranchName 74b2383
Hanya menggunakan git reflog
tidak mengembalikan sha
untuk saya. Hanya commit id
(yang panjangnya 8 karakter dan sha yang lebih panjang)
Jadi saya menggunakan
git reflog --no-abbrev
Dan kemudian lakukan hal yang sama seperti yang disebutkan di atas:
git checkout -b <branch> <sha>
Perhatikan bahwa penghapusan cabang git hanya menghapus salinan lokal, bukan salinan di server. Pertama, di panel Git (ikon git di bilah alat kiri), lihat melalui cabang dan lihat apakah cabang Anda masih ada di bawah "origin / your_branch_name". Jika demikian, cukup pilih itu dan Anda harus mendapatkan kode Anda kembali (menyarankan agar Anda segera menyalin / menempel / menyimpannya secara lokal di tempat lain).
Jika Anda tidak melihat "origin / your_branch_name", Instal ekstensi GitLens. Ini memungkinkan Anda untuk melihat secara visual di dalam repositori server dan menemukan salinan yang Anda sinkronkan ke server. Jika Anda memiliki beberapa repositori, perhatikan bahwa mungkin perlu membuka setidaknya satu file dari repositori yang diinginkan untuk membuat repositori muncul di GitLens. Kemudian:
Buka panel GitLens
Perluas repositori
Anda akan melihat daftar kategori: Cabang / Kontributor / Remote / Stash / dll
Anda harus menemukan YourLostTreasure di bawah "Branches" atau mungkin di bawah "Remote -> Origins". Mudah-mudahan, Anda akan melihat cabang dengan nama yang diinginkan - jika Anda mengembangkannya, Anda akan melihat file yang Anda ubah di cabang itu. Klik dua kali nama file untuk membukanya, dan segera buat cadangan kode itu.
Jika Anda tidak segera melihat cabang Anda yang hilang, cari-cari dan jika Anda menemukan sesuatu yang menjanjikan, segera buka dan ambil kodenya. Saya harus melihat-lihat sedikit sampai saya menemukan TheGoldenBranch, dan bahkan kemudian kode itu hilang satu atau dua penyelamatan terakhir (mungkin karena saya gagal menyinkronkan ke server sebelum mencoba-a-Branch-Merge-tetapi-secara tidak sengaja mengklik - Cabang-Hapus). Pencarian saya tidak perlu diperpanjang karena ketika saya pertama kali menemukan cabang saya tidak sepenuhnya yakin nama itu benar sehingga terus mencari, dan butuh beberapa waktu untuk menemukan kembali cabang pertama itu. (Karenanya, Carpe Carpum lalu terus mencari.)