Berasal dari svn, baru mulai mengenal git.
Ketika sebuah cabang dihapus di git, apakah itu dihapus dari sejarah?
Di svn, Anda dapat dengan mudah memulihkan cabang dengan mengembalikan operasi hapus (penggabungan terbalik). Seperti semua penghapusan dalam svn, cabang tidak pernah benar-benar dihapus, hanya dihapus dari pohon saat ini.
Jika cabang sebenarnya dihapus dari sejarah di git, apa yang terjadi pada perubahan yang digabungkan dari cabang itu? Apakah mereka dipertahankan?
sumber
Dalam Git, cabang hanyalah pointer (referensi) untuk melakukan dalam grafik asiklik diarahkan (DAG) dari komitmen. Ini berarti bahwa menghapus cabang hanya menghapus referensi untuk melakukan, yang mungkin membuat beberapa komitmen dalam DAG tidak dapat dijangkau, sehingga tidak terlihat. Tetapi semua komit yang ada di cabang yang dihapus masih ada di repositori, setidaknya sampai komit yang tidak terjangkau dipangkas (misalnya menggunakan
git gc
).Catatan yang
git branch -d
akan menolak untuk menghapus cabang jika tidak yakin bahwa menghapusnya tidak akan meninggalkan komitmen yang tidak terjangkau. Anda perlu menggunakan yang lebih kuatgit branch -D
untuk memaksa penghapusan cabang jika mungkin meninggalkan komitmen yang tidak terjangkau.Perhatikan juga bahwa komit yang tidak dapat dijangkau, jika ada, hanya komit di antara ujung terakhir dari cabang yang dihapus dan komit yang digabungkan ke cabang lain yang sudah ada, komit yang ditandai, atau titik percabangan; mana yang lebih baru. Misalnya dalam situasi berikut:
hanya melakukan 'x' dan 'y' akan menjadi tidak dapat dijangkau setelah menghapus cabang.
Jika Anda beroperasi pada cabang yang dihapus dalam
gc.reflogExpire
periode tersebut, default 90 hari, Anda akan memiliki tip terakhir dari cabang yang dihapus dicatat dalam reflog HEAD (lihatgit reflog show HEAD
, ataugit log --oneline --walk-reflogs HEAD
). Anda harus dapat menggunakan reflog HEAD untuk memulihkan pointer yang dihapus. Perhatikan juga bahwa dalam kasus ini, komit yang tidak dapat dijangkau hanya dalam cabang yang dihapus akan dilindungi dari pemangkasan (penghapusan) dalamgc.reflogExpireUnreachable
periode, yang secara default adalah 30 hari.Jika Anda tidak dapat menemukan ujung cabang yang baru saja dihapus di reflog untuk HEAD, Anda dapat mencoba menggunakan
git fsck
untuk menemukan "komit yang tidak dapat dijangkau <sha1>", dan periksa yang (melaluigit show <sha1>
ataugit log <sha1>
) untuk menemukan ujung cabang yang dihapus.Independen tentang bagaimana Anda menemukan ujung cabang yang dihapus, Anda dapat membatalkan penghapusan, atau lebih tepatnya membuat kembali cabang yang baru saja dihapus menggunakan
Namun perlu dicatat bahwa reflog untuk cabang akan hilang.
Ada juga skrip git-resurrect.sh
contrib/
yang membantu menemukan jejak tip cabang dengan nama yang diberikan dan membangkitkan (membatalkan penghapusan) itu.sumber
git reflog show HEAD
terdaftar komit dan saya membuat cabang baru seperti yang Anda katakan, sempurna.Jika Anda khawatir tentang cabang yang tidak sengaja terhapus dan tidak memiliki salinan lokal dari repo Anda lagi, ada ekstensi ke server perusahaan Git seperti Gerrit yang akan mendeteksi penulisan ulang riwayat dan penghapusan cabang, akan mencadangkannya di bawah referensi khusus sehingga mereka dapat dipulihkan jika diperlukan dan tidak akan dipangkas dengan pengumpulan sampah. Administrator Gerrit masih dapat menghapus komitmen yang dipilih jika diperlukan karena alasan hukum.
sumber