Saya tidak sengaja berkomitmen pada cabang yang salah. Bagaimana cara saya menghapus komit itu?
948
Hapus komit terbaru, menjaga pekerjaan yang telah Anda lakukan:
git reset --soft HEAD~1
Hapus komit terbaru, hancurkan pekerjaan yang telah Anda lakukan:
git reset --hard HEAD~1
git reset --hard origin
git remote
Asal pikir daftar bagi saya,git reset --hard origin
katafatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
. Mengapa?git reset HEAD~1
juga akan menyimpan semua perubahan Anda tetapi akan meninggalkan Anda dengan indeks kosong daripada menyimpan semuanya (seperti yang--soft
akan dilakukan).Saya heran mengapa jawaban terbaik yang saya temukan hanya di komentar! ( oleh Daenyth dengan 86 suara )
Perintah ini akan menyinkronkan repositori lokal dengan repositori jarak jauh yang menyingkirkan setiap perubahan yang Anda lakukan pada lokal Anda. Anda juga dapat melakukan hal berikut untuk mengambil cabang persis yang Anda miliki di asal.
sumber
git reset --hard origin/<branch>
git reset --soft origin/<branch>
, jika Anda ingin menghilangkan komit tetapi tetap bekerja lokal.fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
, Anda perlu menentukan cabang seperti:git reset --hard origin/feature/my-cool-stuff
Jangan hapus itu: hanya satu komit saja
git cherry-pick
sudah cukup.Tetapi jika Anda memiliki beberapa komit di cabang yang salah, di situlah
git rebase --onto
bersinar:Misalkan Anda memiliki ini:
, maka Anda dapat menandai
master
dan memindahkannya ke tempat yang Anda inginkan:, setel ulang cabang y ke tempat yang seharusnya:
, dan akhirnya pindahkan komit Anda (aplikasikan kembali, buat komit yang benar-benar baru)
sumber
Lakukan
git rebase -i FAR_ENOUGH_BACK
dan lepaskan garis untuk komit yang tidak Anda inginkan.sumber
Jika Anda ingin memindahkan komit ke cabang lain, dapatkan SHA dari komit tersebut
Kemudian pindahkan cabang saat ini
Dan
cherry-pick
komitmen untukother-branch
sumber
git reset --hard HEAD~1
setelah itu. Saya pikir menggunakanreset --soft
kemudian beralih cabang dan melakukan lagi akan menghemat pekerjaan ekstra. Kemudian lagi saya menggunakan SourceTree untuk melakukan sebagian besar hal-hal dasar saya, hanya perintah baris-ing dengan ini setelah kesalahan saya.Untuk referensi Anda, saya yakin Anda dapat "memotong" melakukan dari cabang Anda saat ini tidak hanya dengan git reset --hard, tetapi juga dengan perintah berikut:
Bahkan, jika Anda tidak peduli untuk memeriksa, Anda dapat mengatur cabang ke apa pun yang Anda inginkan dengan:
Ini akan menjadi cara terprogram untuk menghapus komit dari cabang, misalnya, untuk menyalin komit baru ke dalamnya (menggunakan rebase).
Misalkan Anda memiliki cabang yang terputus dari master karena Anda telah mengambil sumber dari beberapa lokasi lain dan membuangnya ke cabang.
Anda sekarang memiliki cabang tempat Anda menerapkan perubahan, sebut saja "topik".
Anda sekarang akan membuat duplikat cabang topik Anda dan kemudian rebase ke dump kode sumber yang duduk di cabang "dump":
Sekarang perubahan Anda diterapkan kembali dalam branch topic_duplicate berdasarkan pada titik awal "dump" tetapi hanya komit yang telah terjadi sejak "master". Jadi perubahan Anda sejak master sekarang diterapkan kembali di atas "dump" tetapi hasilnya berakhir pada "topic_duplicate".
Anda kemudian dapat mengganti "dump" dengan "topic_duplicate" dengan melakukan:
Atau dengan
Atau hanya dengan membuang sampah
Mungkin Anda juga bisa memilih ceri setelah menghapus "topic_duplicate" saat ini.
Apa yang ingin saya katakan adalah bahwa jika Anda ingin memperbarui cabang "duplikat" saat ini berdasarkan dari leluhur yang berbeda, Anda harus terlebih dahulu menghapus komit "cherrypicked" yang sebelumnya dilakukan dengan melakukan
git reset --hard <last-commit-to-retain>
ataugit branch -f topic_duplicate <last-commit-to-retain>
dan kemudian menyalin komit lainnya atas (dari utama cabang topik) baik dengan rebasing atau memetik ceri.Rebasing hanya berfungsi pada cabang yang sudah memiliki komit, jadi Anda perlu menduplikasi cabang topik Anda setiap kali Anda ingin melakukannya.
Memetik ceri lebih mudah:
Jadi seluruh urutan akan turun ke:
Ketika cabang duplikat topik Anda telah diperiksa. Itu akan menghapus komit yang sebelumnya dipetik cherry dari duplikat saat ini, dan hanya menerapkan kembali semua perubahan yang terjadi di "topik" di atas "dump" Anda saat ini (leluhur yang berbeda). Tampaknya cara yang cukup mudah untuk mendasarkan pengembangan Anda pada master hulu "nyata" sambil menggunakan master "hilir" yang berbeda untuk memeriksa apakah perubahan lokal Anda juga masih berlaku untuk itu. Atau Anda bisa membuat diff dan menerapkannya di luar pohon sumber Git. Tetapi dengan cara ini Anda dapat menyimpan versi yang dimodifikasi (ditambal) terbaru yang didasarkan pada versi distribusi Anda sementara pengembangan Anda yang sebenarnya bertentangan dengan master hulu nyata.
Jadi hanya untuk menunjukkan:
Semoga ini bisa membantu seseorang. Saya bermaksud menulis ulang ini, tetapi saya tidak bisa mengelola sekarang. Salam.
sumber
Mengikuti perintah yang berfungsi untuk saya, semua perubahan yang dikomit dijatuhkan & lokal diset ulang ke yang sama dengan cabang asal / master jarak jauh.
sumber