Hapus komit terakhir di bitbucket


103

Saya membuat kesalahan dan saya tidak tahu cara menghapus push terbaru saya di repositori. Saya menarik pembaruan terbaru dari aplikasi tetapi memiliki konflik dan saya mendorongnya ke repositori.

Bagaimana cara menghapus komit terakhir saya? Atau bagaimana cara memperbaikinya?

Jawaban:


102

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.


Terima kasih untuk informasi. Dan saya tahu konsekuensinya jika saya menghapus komit, saya hanya tidak tahu cara membatalkan tindakan saya karena ini pertama kalinya saya mendapat kesalahan. Saya perlu membatalkan komit saya karena sistem sudah aktif. Kami hanya dua orang yang bekerja dengan repositori itu.
Catherine

git backout <REV>? Atau hg backout <REV>:?
Armando Pérez Marqués

Tetapi bagaimana jika komit yang ditambahkan setelah yang akan dikembalikan telah membuat modifikasi pada baris yang dihapus?
hura

@RahulSaha karena apa yang Anda lakukan pada dasarnya adalah mencoba menggabungkan komit ke cabang, saya cukup yakin itu akan memberi Anda konflik penggabungan yang harus Anda selesaikan.
asermax

98

Jika Anda tidak bekerja dengan orang lain (atau dengan senang hati menyebabkan mereka sangat mengganggu) , maka dimungkinkan untuk menghapus komit dari cabang bitbucket.

Jika Anda mencoba mengubah cabang non-master:

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

jika Anda mencoba mengubah cabang master

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 .

Berurusan dengan kolaborator yang kesal

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-pickkomitmen 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.


1
Bagi mereka yang lebih nyaman menggunakan SourceTree: 1) Untuk mengubah cabang utama di UI web untuk BitBucket, lihat Pengaturan Repo. 2) Untuk menghapus cabang di UI web, lihat halaman Cabang. 3) Setel ulang repo lokal seperti di atas. 4) Dorong perubahan lokal Anda untuk membuat ulang cabang tersebut.
Richard Le Mesurier

2
Sebagai seseorang yang secara tidak sengaja membuka rahasia, saya sangat menghargai ketelitian jawaban ini. Terima kasih!
Torsi

48

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.


Github akan mengizinkan ini, tetapi pada tulisan ini, Bitbucket tidak mengizinkan dorongan paksa.
JamesQMurphy

4
sebenarnya bitbucket tidak mendukung dorongan kekuatan hanya perbedaannya alih-alih menghapus sepenuhnya komitmen yang tidak terlacak itu menandainya sebagai dihapus.
Shubanker

Cara yang disarankan dari bitbucket adalah menggunakan revert. Tetapi saya pikir dalam kasus saya ini lebih tepat. Karena saya satu-satunya yang menggunakannya, dan rasanya lebih bersih daripada menggunakan pengembalian. Terima kasih.
nafsaka

1
Ya, ini masih berfungsi di Bitbucket. Anda baru saja menyelamatkan saya banyak waktu! Saya melakukan commit / push dari Eclipse saya dan tercampur dengan proyek lain yang saya miliki. Sebagian karena praktik buruk dari pihak saya dengan menggunakan baris perintah dan gerhana bawaan untuk mengerjakan git.
DarkCygnus

brilian, atau lebih mudah: setel ulang cabang saat ini ke komit ini, lalu gunakan dorongan paksa ke server untuk memperbaiki masalah saya
Anthony Kal

3

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


1
Memotong dan menempel benar-benar berantakan. Ditambah, ini tidak akan menyelesaikan masalah dari pertanyaan tersebut.
Daniel Lee

1
git revertsederhana: 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.
n nothing101

1
Git revert adalah mekanisme yang sama seperti di atas.
nafsaka

3

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.


2

Seperti yang dikatakan orang lain, biasanya Anda ingin menggunakan hg backoutatau git revert. Namun, terkadang Anda benar-benar ingin menghilangkan commit.

Pertama, Anda ingin pergi ke pengaturan repositori Anda. Klik Strip commitslinknya.

Hapus tautan komit dalam pengaturan bitbucket

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 Confirmdan 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.


Versi mana itu, dan izin apa yang diperlukan? Ini terlihat berbeda di v6.4.3 yang saya lihat, dan item ini tidak ada. Saya adalah admin repositori.
Raphael

1

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)

masukkan deskripsi gambar di sini

Hapus baris komit terakhir seluruhnya

3) simpan dengan ctrl+XatauESC:wq

sekarang cabang Anda akan diperbarui tanpa komit terakhir Anda ..


1

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

0

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'.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.