Jawaban:
Pertama-tama, jika Anda bekerja dengan orang lain pada repositori kode yang sama, Anda tidak boleh menghapus komit karena ketika Anda memaksa pembaruan pada repositori itu akan membuat repositori lokal rekan kerja Anda dalam keadaan ilegal (misalnya jika mereka membuat komit setelah komit yang Anda hapus, komit tersebut tidak akan valid karena komit tersebut didasarkan pada komit yang sekarang tidak ada).
Dengan demikian, yang dapat Anda lakukan adalah mengembalikan komit. Prosedur ini dilakukan secara berbeda (perintah berbeda) tergantung pada CVS yang Anda gunakan:
Di git :
git revert <commit>
Dengan lincah :
hg backout <REV>
EDIT: Operasi pengembalian membuat komit baru yang melakukan kebalikan dari komit yang dibalik (misalnya jika komit asli menambahkan baris, komit pemulihan menghapus baris itu), secara efektif menghapus perubahan komit yang tidak diinginkan tanpa menulis ulang riwayat repositori.
git backout <REV>
? Atau hg backout <REV>
:?
Jika Anda tidak bekerja dengan orang lain (atau dengan senang hati menyebabkan mereka sangat mengganggu) , maka dimungkinkan untuk menghapus komit dari cabang bitbucket.
git reset HEAD^ # remove the last commit from the branch history
git push origin :branch_name # delete the branch from bitbucket
git push origin branch_name # push the branch back up again, without the last commit
Secara umum, cabang master tidak istimewa - itu hanya konvensi. Namun, bitbucket dan github dan situs serupa biasanya mengharuskan ada cabang utama (mungkin karena lebih mudah daripada menulis lebih banyak kode untuk menangani kejadian di mana repositori tidak memiliki cabang - tidak yakin). Jadi, Anda perlu membuat cabang baru, dan menjadikannya sebagai cabang utama:
# on master:
git checkout -b master_temp
git reset HEAD^ # undo the bad commit on master_temp
git push origin master_temp # push the new master to Bitbucket
Di Bitbucket, buka pengaturan repositori, dan ubah "Cabang utama" menjadi master_temp
(di Github, ubah "Cabang default").
git push origin :master # delete the original master branch from Bitbucket
git checkout master
git reset master_temp # reset master to master_temp (removing the bad commit)
git push origin master # re-upload master to bitbucket
Sekarang buka Bitbucket, dan Anda akan melihat riwayat yang Anda inginkan. Anda sekarang dapat pergi ke halaman pengaturan dan mengubah cabang Utama kembali ke master
.
Proses ini juga akan bekerja dengan perubahan riwayat lainnya (misalnya git filter-branch
). Anda hanya perlu memastikan untuk menyetel ulang ke komitmen yang sesuai, sebelum riwayat baru dipisahkan dari yang lama.
edit : tampaknya Anda tidak perlu repot-repot melakukan semua ini di github, karena Anda dapat memaksa-push cabang reset .
Lain kali ada orang yang mencoba menarik dari repositori Anda, (jika mereka telah menarik komit buruk), penarikan akan gagal. Mereka secara manual harus mengatur ulang ke komit sebelum riwayat yang diubah, dan kemudian menarik lagi.
git reset HEAD^
git pull
Jika mereka telah menarik komitmen buruk, dan berkomitmen di atasnya , maka mereka harus mengatur ulang, dan kemudian git cherry-pick
komitmen baik yang ingin mereka buat, secara efektif membuat ulang seluruh cabang tanpa komit buruk.
Jika mereka tidak pernah menarik komitmen buruk, maka seluruh proses ini tidak akan memengaruhi mereka, dan mereka dapat melakukannya seperti biasa.
Anda dapat mengatur ulang untuk HEAD^
kemudian mendorongnya secara paksa.
git reset HEAD^
git push -u origin master --force
Ini akan menghapus komit terakhir Anda dan akan mencerminkan bitbucket sebagai komit dihapus tetapi akan tetap ada di server mereka.
Saya pernah mengalami masalah dengan git revert di masa lalu (terutama karena saya tidak begitu yakin cara kerjanya.) Saya mengalami masalah saat kembali karena masalah penggabungan ..
Solusi sederhana saya adalah ini.
Langkah 1.
git clone <your repos URL> .
proyek Anda di folder lain, lalu:
Langkah 2.
git reset --hard <the commit you wanna go to>
lalu Langkah 3.
di direktori proyek terbaru (dan utama) Anda (yang memiliki komit terakhir yang bermasalah) tempel file dari langkah 2
LANGKAH 4.
git commit -m "Fixing the previous messy commit"
LANGKAH 5.
Nikmati
git revert
sederhana: ini membuat komit baru yang melakukan kebalikan dari perubahan dalam komit sebelumnya (atau beberapa komit). Itu tidak menghapus komit, jadi tidak relevan untuk pertanyaan ini. Selain itu, langkah kloning di sini tidak terlalu diperlukan.
Berikut ini pendekatan sederhana hingga 4 langkah:
0 - Beri tahu tim bahwa Anda akan memperbaiki repositori
Terhubung dengan tim dan beri tahu mereka tentang perubahan yang akan datang.
1 - Hapus komit terakhir
Dengan asumsi cabang target Anda adalah master
:
$ git checkout master # move to the target branch
$ git reset --hard HEAD^ # remove the last commit
$ git push -f # push to fix the remote
Pada titik ini Anda selesai jika Anda bekerja sendiri.
2 - Perbaiki repositori lokal rekan satu tim Anda
Tentang rekan satu tim Anda:
$ git checkout master # move to the target branch
$ git fetch # update the local references but do not merge
$ git reset --hard origin/master # match the newly fetched remote state
Jika rekan setim Anda tidak memiliki komitmen baru, Anda sudah selesai pada titik ini dan Anda harus selaras.
3 - Mengembalikan komitmen yang hilang
Misalkan seorang rekan tim memiliki komit baru dan belum dipublikasikan yang hilang dalam proses ini.
$ git reflog # find the new commit hash
$ git cherry-pick <commit_hash>
Lakukan ini untuk sebanyak mungkin komitmen yang diperlukan.
Saya telah berhasil menggunakan pendekatan ini berkali-kali. Diperlukan upaya tim untuk memastikan semuanya sinkron.
Seperti yang dikatakan orang lain, biasanya Anda ingin menggunakan hg backout
atau git revert
. Namun, terkadang Anda benar-benar ingin menghilangkan commit.
Pertama, Anda ingin pergi ke pengaturan repositori Anda. Klik Strip commits
linknya.
Masukkan ID kumpulan perubahan untuk kumpulan perubahan yang ingin Anda hancurkan, dan klik Preview strip
. Itu akan membuat Anda melihat kerusakan seperti apa yang akan Anda lakukan sebelum Anda melakukannya. Kemudian klik saja Confirm
dan komit Anda bukan lagi riwayat. Pastikan Anda memberi tahu semua kolaborator apa yang telah Anda lakukan, sehingga mereka tidak secara tidak sengaja mendorong kembali komitmen yang melanggar.
Setelah perubahan dilakukan, perubahan tidak akan dapat dihapus. karena sifat dasar komit bukanlah untuk menghapus.
Hal yang dapat Anda lakukan (metode mudah dan aman),
Rebase Interaktif:
1) git rebase -i HEAD~2
#akan menampilkan 2 komit terbaru Anda
2) Komit Anda akan terdaftar seperti, Terbaru akan muncul di bagian bawah halaman LILO (terakhir di Keluar Terakhir)
Hapus baris komit terakhir seluruhnya
3) simpan dengan ctrl+X
atauESC:wq
sekarang cabang Anda akan diperbarui tanpa komit terakhir Anda ..
Anda juga dapat menulis perintah untuk Bitbucket seperti yang disebutkan oleh Dustin :
git push -f origin HEAD^:master
Catatan: sebagai ganti master Anda bisa menggunakan cabang manapun. Dan menghapus hanya menekan Bitbucket.
Untuk menghapus komit terakhir secara lokal di git, gunakan:
git reset --hard HEAD~1
Sekarang, bitbucket cloud (saya tidak yakin versi mana) memungkinkan untuk mengembalikan komit dari sistem file sebagai berikut (saya tidak melihat cara mengembalikan dari antarmuka Bitbucket di browser Chrome).
-cadangkan seluruh direktori Anda untuk mengamankan perubahan yang Anda lakukan secara tidak sengaja
-pilih direktori yang diperiksa
tombol kanan mouse: menu tortoise git
-repo-browser (opsi menu 'kembali' hanya membatalkan perubahan yang tidak dilakukan)
-tekan tombol HEAD
-pilih baris paling atas (komit terakhir)
-tombol kanan mouse: kembalikan perubahan dengan komit ini
-setelah itu membatalkan perubahan pada sistem file, tekan komit
-ini memperbarui GIT dengan pesan 'Kembalikan (pesan Anda sebelumnya). Ini mengembalikan komitmen ini dan itu '
-pilih 'komit dan dorong'.