Saya memiliki repositori yang memiliki beberapa komit buruk di atasnya (D, E dan F untuk contoh ini).
Master ABCDEF dan asal / master
Saya telah memodifikasi repositori lokal secara khusus dengan a git reset --hard
. Saya mengambil cabang sebelum reset jadi sekarang saya memiliki repo yang terlihat seperti:
A-B-C master
\ D-E-F old_master
A-B-C-D-E-F origin/master
Sekarang saya membutuhkan beberapa bagian dari komit buruk itu jadi saya ceri memilih bit yang saya butuhkan dan membuat beberapa komit baru jadi sekarang saya memiliki yang berikut secara lokal:
A-B-C-G-H master
\ D-E-F old_master
Sekarang saya ingin mendorong keadaan ini ke repo jarak jauh. Namun, ketika saya mencoba melakukan git push
Git dengan sopan memberi saya sikat:
$ git push origin +master:master --force
Total 0 (delta 0), reused 0 (delta 0)
error: denying non-fast forward refs/heads/master (you should pull first)
To [email protected]:myrepo.git
! [remote rejected] master -> master (non-fast forward)
error: failed to push some refs to '[email protected]:myrepo.git'
Bagaimana cara mendapatkan repo jarak jauh untuk mengambil status repo lokal saat ini?
git push -force
lebih hati-hati .Jawaban:
Jika memaksa push tidak membantu ( "
git push --force origin
'atau'git push --force origin master
" harus cukup), mungkin berarti bahwa server remote menolak non dorongan maju cepat baik melalui receive.denyNonFastForwards konfigurasi variabel (lihat git config manualnya untuk deskripsi), atau melalui perbarui / pra-terima kait.Dengan Git yang lebih tua, Anda dapat mengatasi batasan itu dengan menghapus "
git push origin :master
" (lihat ':' sebelum nama cabang) dan kemudian membuat kembaligit push origin master
cabang yang diberikan " ".Jika Anda tidak dapat mengubah ini, maka satu-satunya solusi adalah alih-alih menulis ulang riwayat untuk membuat komit mengembalikan perubahan pada DEF :
sumber
get revert HEAD~N
membantu.N
adalah jumlah komit. Misalnya, jika saya memerlukan komit sebelumnya, saya akan menggunakangit revert HEAD~1
Untuk melengkapi jawaban Jakub, jika Anda memiliki akses ke server git jarak jauh di ssh, Anda dapat masuk ke direktori git jarak jauh dan mengatur:
Kemudian kembali ke repo lokal Anda, coba lagi untuk melakukan komit Anda dengan
--force
:Dan akhirnya mengembalikan pengaturan server dalam keadaan terlindungi asli:
sumber
vi
disediakan pada posting SO ini: stackoverflow.com/a/43721579/2073804Alih-alih memperbaiki cabang "master" Anda, lebih mudah menukarnya dengan "master yang Anda inginkan" dengan mengganti nama cabang. Lihat https://stackoverflow.com/a/2862606/2321594 . Dengan cara ini Anda bahkan tidak akan meninggalkan jejak beberapa log pemulihan.
sumber
Seluruh bisnis pengaturan ulang git tampak menyulitkan saya.
Jadi saya melakukan sesuatu di sepanjang baris untuk mendapatkan folder src saya di negara saya punya beberapa komit yang lalu
Dengan cara ini keadaan urusan dalam src disimpan dalam file tar dan git dipaksa untuk menerima keadaan ini tanpa terlalu banyak mengutak-atik pada dasarnya direktori src diganti dengan keadaan yang telah dilakukan beberapa kali lalu.
sumber
Untuk pengguna GitHub, ini bekerja untuk saya:
git reset --hard <full_hash_of_commit_to_reset_to>
git push --force
Ini akan "memperbaiki" riwayat cabang pada mesin lokal Anda dan server GitHub, tetapi siapa pun yang telah menyinkronkan cabang ini dengan server karena komit yang buruk akan memiliki riwayat pada mesin lokal mereka. Jika mereka memiliki izin untuk mendorong ke cabang secara langsung maka komit ini akan ditampilkan segera kembali ketika mereka menyinkronkan.
Yang perlu dilakukan semua orang adalah
git reset
perintah dari atas untuk "memperbaiki" cabang pada mesin lokal mereka. Tentu saja mereka perlu mewaspadai komitmen lokal yang dibuat untuk cabang ini setelah hash target. Cherry mengambil / mencadangkan dan mendaftar kembali yang diperlukan, tetapi jika Anda berada di cabang yang dilindungi maka jumlah orang yang dapat melakukan langsung ke sana kemungkinan terbatas.sumber