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?
git
branch
git-branch
prosseek
sumber
sumber
Jawaban:
Ya, Anda harus dapat melakukan
git reflog
dan menemukan SHA1 untuk komit di ujung cabang yang Anda hapus, lalu adilgit checkout [sha]
. Dan begitu Anda berkomitmen, Anda dapatgit checkout -b [branchname]
membuat ulang cabang dari sana.Kredit ke @Cascabel untuk versi kental / satu baris ini.
Anda dapat melakukannya dalam satu langkah:
sumber
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 untukHEAD
).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 sukagit 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):
Jika Anda harus menggunakannya lebih dari satu kali (atau ingin menyimpannya di suatu tempat), Anda juga dapat membuat alias dengan perintah itu ...
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):
Untuk melihat juga perbedaan:
Setelah Anda menemukan komit Anda, kemudian buat cabang di komit ini dengan:
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
sumber
Jika Anda suka menggunakan GUI, Anda dapat melakukan seluruh operasi dengan gitk.
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
.sumber
Solusi pilihan teratas sebenarnya lebih dari yang diminta:
atau
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>
dengangit reflog
):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:
Tidak perlu dikatakan, kunci sukses adalah menemukan komitmen yang tepat
<sha>
, jadi sebutkan komitmen Anda dengan bijak :)sumber
Menambah jawaban tfe : ada juga skrip git-resurrect.sh di
contrib/
area sumber Git (di repositori git.git), yang mungkin membantu Anda.sumber
Saya menggunakan perintah berikut untuk menemukan dan mengambil cabang saya yang dihapus. Langkah pertama adalah dari deskripsi gcb.
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:
sumber
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: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.
sumber
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:
Langkah terakhir
PS
Saya menyadari ini mungkin bukan solusi "paling sederhana" atau "tepat", tetapi ditawarkan jika seseorang merasa itu berguna.
sumber
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 didapatreflog
. 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
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 menggunakanIni adalah bagian dari video yang harus ditonton dari Scott Chacon tentang Git. Periksa menit 58:00 ketika ia berbicara tentang cabang dan bagaimana menghapusnya.
Pengantar Git dengan Scott Chacon dari GitHub
sumber
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.
2. Untuk mengembalikan cabang, gunakan:
Jika Anda tidak tahu 'sha' di atas kepala Anda, Anda dapat:
Jika komit Anda tidak ada dalam reflog Anda:
2. Anda kemudian dapat menampilkan setiap komit menggunakan salah satu dari ini:
sumber
Untuk memulihkan cabang yang dihapus, Pertama-tama buka sejarah reflog,
Dimana n mengacu pada n terakhir yang dilakukan. Kemudian temukan kepala yang tepat dan buat cabang dengan kepala itu.
sumber
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.
Ini membuat
lost
file dengan semua komit yang harus Anda lihat. Untuk menyederhanakan hidup kita, mari kita potong saja SHA darinya:Sekarang Anda memiliki
commits
file dengan semua komitmen yang harus Anda perhatikan.Dengan asumsi Anda menggunakan Bash, langkah terakhir:
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.
sumber
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
sumber
Pertama pergi ke git batch perpindahan ke proyek Anda seperti:
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.
sumber
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.
sumber
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:
Kemudian Anda dapat melihat umpan, dari apa yang dihapus, oleh siapa, di masa lalu.
sumber
Saya melakukan ini di komputer yang saya hapus cabang:
git reflog
tanggapan:
dan saya mengambil cabang dengan perintah ini:
git checkout -b newBranchName 74b2383
sumber
Hanya menggunakan
git reflog
tidak mengembalikansha
untuk saya. Hanyacommit 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>
sumber
JIKA Anda menggunakan VSCode ... dan Anda menyinkronkan cabang Anda dengan server di beberapa titik sebelum menghapusnya ...
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.)
sumber