Saya ingin membuang semua perubahan yang dilakukan setelah komit <commit-hash>
. Jadi saya melakukannya:
git reset --hard <commit-hash>
Sekarang saya ingin melakukan hal yang sama dengan remote saya. Bagaimana saya bisa melakukan ini? Saya telah melakukan beberapa komitmen (dan mendorong) setelah <commit-hash>
dan saya hanya ingin membuang semuanya. Apakah ada sesuatu yang sangat salah di jalan dan saya tidak ingin membuatnya lebih buruk dari yang sudah ada. ; (
Saya pada dasarnya ingin memundurkan origin/master
ke<commit-hash>
origin/master
belum ditarik dan didorong oleh pengguna lain? Mengubah riwayat repositori publik (yaitu non-lokal) adalah sesuatu yang ingin Anda hindari setiap saat.Jawaban:
Dengan asumsi bahwa cabang Anda dipanggil di
master
sini dan dari jarak jauh, dan bahwa kendali jarak jauhorigin
Anda disebut dapat Anda lakukan:Namun, Anda harus menghindari melakukan ini jika ada orang lain yang bekerja dengan repositori jarak jauh Anda dan telah menarik perubahan Anda. Dalam hal ini, akan lebih baik untuk mengembalikan komit yang tidak Anda inginkan, kemudian dorong seperti biasa.
Pembaruan: Anda telah menjelaskan di bawah ini bahwa orang lain telah menarik perubahan yang Anda dorong, jadi itu lebih baik untuk membuat komit baru yang mengembalikan semua perubahan itu . Ada penjelasan yang bagus tentang pilihan Anda untuk melakukan ini dalam jawaban ini dari Jakub Narębski . Yang mana yang paling nyaman tergantung pada berapa banyak komit yang ingin Anda kembalikan, dan metode mana yang paling masuk akal bagi Anda.
Karena dari pertanyaan Anda, sudah jelas bahwa Anda sudah terbiasa
git reset --hard
mengatur ulangmaster
cabang Anda, Anda mungkin perlu mulai dengan menggunakangit reset --hard ORIG_HEAD
untuk memindahkan cabang Anda kembali ke tempat sebelumnya. (Seperti biasa dengangit reset --hard
, pastikan itugit status
bersih, bahwa Anda berada di cabang kanan dan bahwa Anda sadargit reflog
sebagai alat untuk memulihkan komit yang tampaknya hilang.) Anda juga harus memeriksaORIG_HEAD
titik - titik ke komit yang tepat, dengangit show ORIG_HEAD
.Penyelesaian masalah:
Jika Anda mendapatkan pesan seperti " ! [Remote ditolak] a60f7d85 -> master (kait pra-terima ditolak) "
maka Anda harus mengizinkan penulisan ulang riwayat cabang untuk cabang tertentu. Dalam BitBucket misalnya dikatakan "Menulis ulang sejarah cabang tidak diperbolehkan". Ada kotak centang bernama
Allow rewriting branch history
yang harus Anda periksa.sumber
git update-ref
sebagai gantireset --hard
; itu akan memungkinkan Anda untuk melakukan hal yang sama tanpa memiliki pohon yang bekerja / memeriksa cabangrevert
tetapi katakanlah saya ingin mengembalikan 4 komitmen terakhir jadi saya harus melakukangit revert comit1; git push; git revert comit2; git push; ...
atau hanyagit revert commit4; git push
?git revert commit4
menciptakan komit baru yang hanya membatalkan perubahan yang diperkenalkancommit4
. Namun, sebagai jawaban yang saya tautkan ke poin, Anda dapat menggulung ini menjadi satu komit.git reset --hard
tetapi saya telah menghapus lokal saya dan menarik dari asal lagi sehingga saya dapat melakukangit revert ...
keraguan saya sekarang adalah: apakah saya harus mengembalikan setiap komit dan mendorong (satu per satu) atau hanya mengembalikan komit pertama setelah hanya komit saja?.git
referensi lengkap, dan jadi mudah bagi orang untuk membuang sampah sembarangan pada direktori mereka dengan referensi yang tidak ingin mereka buat. Saya salah mengatakan bahwa tidak ada pemeriksaan keamanan. Anda dapat menemukan klasifikasi menjadi perintah "plumbing" dan "porcelain" di halaman git man .Gunakan jawaban lain jika Anda tidak keberatan kehilangan perubahan lokal. Metode ini masih dapat merusak remote Anda jika Anda memilih hash komit yang salah untuk kembali.
Jika Anda hanya ingin membuat kecocokan remote komit di mana saja di repo lokal Anda:
git log
untuk menemukan komit yang ingin Anda tuju.git log -p
untuk melihat perubahan, ataugit log --graph --all --oneline --decorate
untuk melihat pohon kompak.Jalankan perintah seperti:
misalnya
atau
Saya menggunakan alias (
git go
) yang nyaman untuk melihat riwayat seperti pada langkah 2, yang dapat ditambahkan seperti:sumber
git config --global alias.graph 'log --graph --all --decorate --oneline'
kurang berantakan dan Anda masih dapat membatasinya, misalnya:git graph -5
q
untuk keluar dari log git. 2 menit saya tidak akan pernah kembali.less
danq
merupakan cara normal untuk keluar. Git Bash seperti terminal * nix.Saya memecahkan masalah seperti Anda dengan perintah ini:
sumber
Di GitLab, Anda mungkin harus mengatur cabang Anda untuk tidak terlindungi sebelum melakukan ini. Anda dapat melakukan ini di [repo]> Pengaturan> Repositori> Cabang yang Dilindungi. Kemudian metode dari jawaban Mark bekerja.
sumber
Jika Anda ingin versi file sebelumnya, saya akan merekomendasikan menggunakan checkout git.
Melakukan hal ini akan mengirim Anda kembali ke masa lalu, itu tidak mempengaruhi keadaan proyek Anda saat ini, Anda dapat datang ke mainline git checkout mainline
tetapi ketika Anda menambahkan file dalam argumen, file itu dibawa kembali kepada Anda dari waktu sebelumnya ke waktu proyek Anda saat ini, yaitu proyek Anda saat ini diubah dan perlu dilakukan.
Keuntungannya adalah ia tidak menghapus histori, dan juga tidak mengembalikan perubahan kode tertentu (git revert)
Lihat lebih lanjut di sini https://www.atlassian.com/git/tutorials/undoing-changes#git-checkout
sumber
Dua sen saya untuk jawaban sebelumnya: jika
masih tidak berfungsi, Anda mungkin ingin mengedit
<your-remote-repo>.git/config
bagian penerimaan file:sumber
Jika cabang Anda bukan pengembangan atau produksi, cara termudah untuk mencapai ini adalah mengatur ulang ke komit tertentu secara lokal dan membuat cabang baru dari sana. Kamu bisa menggunakan:
git checkout 000000
(di mana 000000 adalah id komit di mana Anda ingin pergi) di cabang bermasalah Anda dan kemudian cukup buat cabang baru:
git remote menambahkan [name_of_your_remote]
Kemudian Anda dapat membuat PR baru dan semuanya akan berfungsi dengan baik!
sumber
Lakukan satu hal, dapatkan nomor komitnya SHA no. seperti 87c9808 dan kemudian,
git push --force origin master
sumber
Sourcetree: mengatur ulang remote ke komit tertentu
Dorong komit ini ke sumber / fitur baru / 1337_MyAwesomeFeature
Cabang fitur lokal Anda dan cabang fitur jarak jauh Anda sekarang berada di komit sebelumnya (pilihan Anda)
sumber