Saya tahu itu penulisan ulang sejarah yang buruk yada yada.
Tetapi bagaimana cara menghapus secara permanen beberapa commit dari cabang jarak jauh?
Saya tahu itu penulisan ulang sejarah yang buruk yada yada.
Tetapi bagaimana cara menghapus secara permanen beberapa commit dari cabang jarak jauh?
Jawaban:
Anda git reset --hard
cabang lokal Anda untuk menghapus perubahan dari pohon dan indeks kerja, dan Anda git push --force
cabang lokal Anda yang direvisi ke jarak jauh. ( solusi lain di sini , termasuk menghapus cabang jarak jauh, dan mendorongnya kembali)
Jawaban SO ini menggambarkan bahaya dari perintah semacam itu, terutama jika orang bergantung pada sejarah jarak jauh untuk repo lokal mereka sendiri.
Anda harus siap menunjukkan orang ke bagian PEMULIHAN DARI REBASE UPSTREAM dari git rebase
halaman manual
Dengan Git 2.23 (Agustus 2019, sembilan tahun kemudian), Anda akan menggunakan perintah baru git switch
.
Yaitu:
(ganti dengan jumlah komitmen yang harus dihapus)git switch -C mybranch origin/mybranch~n
n
Itu akan mengembalikan indeks dan pohon yang berfungsi, seperti git reset --hard
akan.
push --force
away
git gc
tidak selalu berjalan cukup sering di sisi jarak jauh. Misalnya di GitHub: twitter.com/githubhelp/status/387926738161774592?lang=es
Perhatikan untuk menggunakan last_working_commit_id
, saat mengembalikan komit yang tidak berfungsi
git reset --hard <last_working_commit_id>
Jadi kita tidak boleh mengatur ulang ke commit_id
yang tidak kita inginkan.
Maka tentu saja, kita harus mendorong ke cabang jauh:
git push --force
git reset --hard
seharusnya dilakukan.
Ada tiga opsi yang ditampilkan dalam tutorial ini . Jika tautan rusak, saya akan meninggalkan langkah-langkah utama di sini.
1 Kembalikan komit penuh
git revert dd61ab23
2 Hapus komit terakhir
git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>
atau, jika cabang tersedia secara lokal
git reset HEAD^ --hard
git push <<remote>> -f
di mana + dd61 ... adalah komit hash dan git Anda menafsirkan x ^ sebagai induk dari x, dan + sebagai dorongan non-fastforwared yang dipaksakan.
3 Hapus komit dari daftar
git rebase -i dd61ab23^
Ini akan terbuka dan editor menunjukkan daftar semua komitmen. Hapus yang ingin Anda singkirkan. Selesai rebase dan dorong kekuatan untuk repo.
git rebase --continue
git push <remote_repo> <remote_branch> -f
Jika Anda ingin menghapus misalnya 3
komit terakhir , jalankan perintah berikut untuk menghapus perubahan dari sistem file (working tree) dan komit riwayat (indeks) pada cabang lokal Anda:
git reset --hard HEAD~3
Kemudian jalankan perintah berikut (pada mesin lokal Anda) untuk memaksa cabang jarak jauh untuk menulis ulang sejarahnya:
git push --force
Selamat! Semua selesai!
Beberapa catatan:
Anda dapat mengambil id komit yang diinginkan dengan menjalankan
git log
Maka Anda dapat mengganti HEAD~N
dengan <desired-commit-id>
seperti ini:
git reset --hard <desired-commit-id>
Jika Anda ingin menyimpan perubahan pada sistem file dan hanya memodifikasi indeks (komit riwayat), gunakan --soft
flag like git reset --soft HEAD~3
. Kemudian Anda memiliki kesempatan untuk memeriksa perubahan terbaru Anda dan menyimpan atau menjatuhkan semua atau sebagian dari mereka. Dalam kasus terakhir runnig git status
menunjukkan file berubah sejak saat itu <desired-commit-id>
. Jika Anda menggunakan --hard
opsi, git status
akan memberi tahu Anda bahwa cabang lokal Anda persis sama dengan cabang jarak jauh. Jika Anda tidak menggunakan --hard
atau --soft
, mode default yang digunakan --mixed
. Dalam mode ini, git help reset
katakan:
Atur ulang indeks tetapi bukan pohon kerja (yaitu, file yang diubah disimpan tetapi tidak ditandai untuk komit) dan melaporkan apa yang belum diperbarui.
Ini mungkin terlalu sedikit terlambat tetapi yang membantu saya adalah pilihan 'nuklir' yang terdengar keren. Pada dasarnya menggunakan perintah, filter-branch
Anda dapat menghapus file atau mengubah sesuatu di atas sejumlah besar file sepanjang seluruh sejarah git Anda.
Lebih baik dijelaskan di sini .
Menyederhanakan dari jawaban pctroll, juga berdasarkan pada posting blog ini .
# look up the commit id in git log or on github, e.g. 42480f3, then do
git checkout master
git checkout your_branch
git revert 42480f3
# a text editor will open, close it with ctrl+x (editor dependent)
git push origin your_branch
# or replace origin with your remote
Terkadang cara termudah untuk memperbaiki masalah ini adalah dengan membuat cabang baru dari tempat Anda tahu kodenya bagus. Kemudian Anda bisa meninggalkan sejarah cabang yang salah kalau-kalau Anda perlu mengambil tindakan lain dari itu nanti. Ini juga memastikan Anda tidak kehilangan histori komit.
Dari cabang bandel lokal Anda:
git log
salin hash komit yang Anda inginkan di cabang dan keluar dari git log
git checkout theHashYouJustCopied
git checkout -b your_new_awesome_branch
Sekarang Anda memiliki cabang baru seperti yang Anda inginkan.
Jika Anda juga perlu menyimpan komit tertentu dari cabang yang salah yang tidak ada di cabang baru Anda, Anda bisa memilih komit tertentu yang Anda butuhkan:
git checkout the_errant_branch
git log
Salin hash komit dari komitmen yang Anda butuhkan untuk menarik cabang bagus dan keluar dari log git.
git checkout your_new_awesome_branch
git cherry-pick theHashYouJustCopied
Tepuk-tepuk diri Anda.