Pertanyaan Dapatkah saya memulihkan cabang setelah penghapusannya di Git?


Jika saya jalankan git branch -d XYZ, apakah ada cara untuk memulihkan cabang? Apakah ada cara untuk kembali seolah-olah saya tidak menjalankan perintah cabang hapus?


765
2017-09-04 03:25


asal


Jawaban:


Ya, Anda harus bisa melakukannya git reflog dan temukan SHA1 untuk komit di ujung cabang dihapus Anda, lalu saja git checkout [sha]. Dan begitu Anda melakukannya, Anda bisa git checkout -b [branchname] untuk menciptakan kembali cabang dari sana.


1378
2017-09-04 03:43



Sebagian besar komitmen yang tidak dapat dijangkau berada dalam reflog. Begitu, 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. Ia bekerja juga dengan remote, misalnya jika Anda memaksakan paksa.


Jika komitmen Anda tidak ada dalam reflog Anda (mungkin karena dihapus oleh alat pihak ke-3 yang tidak menulis di reflog), saya berhasil memulihkan cabang dengan mereset cabang saya ke sha dari komit yang ditemukan menggunakan perintah seperti itu (itu membuat file dengan semua commit 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 bisa 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 gunakan dengan git rescue

Untuk menyelidiki ditemukannya commit, Anda dapat menampilkan setiap commit menggunakan beberapa perintah untuk melihatnya.

Untuk menampilkan metadata commit (penulis, tanggal pembuatan dan pesan commit):

git cat-file -p 48540dfa438ad8e442b18e57a5a255c0ecad0560

Untuk melihat juga diff:

git log -p 48540dfa438ad8e442b18e57a5a255c0ecad0560

Setelah Anda menemukan komit Anda, kemudian buat cabang di ini berkomitmen dengan:

git branch commit_rescued 48540dfa438ad8e442b18e57a5a255c0ecad0560

98
2018-03-10 15:10



Jika Anda suka menggunakan GUI, Anda dapat melakukan seluruh operasi dengan gitk.

gitk --reflog

Ini akan memungkinkan Anda untuk melihat sejarah komitmen cabang seolah cabang tidak dihapus. Sekarang klik kanan pada komitmen terakhir ke cabang dan pilih opsi menu Create new branch.


30
2018-06-02 14:28



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 mungkin Anda lupa lakukan. Ini mungkin bukan niat Anda, terutama ketika dalam "mode panik" setelah kehilangan cabang.

SEBUAH solusi lebih bersih (dan lebih sederhana) tampaknya menjadi satu-liner (setelah Anda menemukan <sha> dengan git reflog):

git branch <branch> <sha>

Sekarang baik cabang Anda maupun perubahan yang tidak direncanakan terpengaruh. Sebaliknya hanya cabang baru yang akan dibuat hingga ke <sha>.

Jika ini bukan tipnya, itu akan tetap berfungsi dan Anda mendapatkan cabang yang lebih pendek, kemudian Anda dapat mencoba lagi dengan yang baru <sha> dan nama cabang baru sampai Anda melakukannya dengan benar.

Akhirnya Anda dapat mengubah nama cabang yang berhasil dipulihkan menjadi apa yang dinamai atau apa pun:

git branch -m <restored branch> <final branch>

Tak perlu dikatakan, kunci sukses adalah menemukan komit yang benar <sha>, jadi beri nama Anda dengan bijaksana :)


15
2018-04-08 15:33



Menambah ke tfe menjawab: ada juga git-resurrect.sh skrip di contrib/ area dari sumber Git (di git.git repositori), yang mungkin bisa membantu Anda.

git-resurrect <name> mencoba menemukan jejak ujung cabang   bernama <name>, dan mencoba untuk membangkitkannya kembali. Saat ini, reflog tersebut   mencari pesan checkout, dan dengan -r juga menggabungkan pesan. Dengan    -m dan -t, riwayat dari semua referensi dipindai Merge <name> into other/Merge <other> into <name> (Masing-masing) melakukan subjek, yang   agak lambat tetapi memungkinkan Anda untuk menghidupkan kembali topik orang lain   ranting.


13
2017-09-06 19:39



Jika Anda tidak memiliki reflog, misalnya. karena Anda bekerja di repositori kosong yang tidak memiliki reflog yang diaktifkan dan komitmen yang ingin Anda pulihkan telah dibuat baru-baru ini, opsi lain adalah menemukan objek commit yang baru saja dibuat dan mencarinya.

Dari dalam .git/objects run direktori:

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 menyaringnya agar hanya menampilkan commit. Memeriksa ini kemudian merupakan proses yang cepat.

Saya akan mencoba skrip git-ressurect.sh yang disebutkan di Jawaban Jakub pertama meskipun.


8
2018-05-13 11:26



Saya menggunakan perintah berikut untuk menemukan dan mengambil cabang 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 id commit git (GIT-SHA) berdasarkan komentar komit dan gunakan dalam perintah di bawah ini. Checkout cabang baru yang disebut NEW-CABANG dengan GIT-SHA yang ditemukan sebelumnya:

$ git checkout -b NEW-BRANCH GIT-SHA

6
2017-11-14 13:28