Seseorang menerima permintaan tarik yang seharusnya tidak mereka miliki. Sekarang kami memiliki banyak kode yang rusak digabung. Bagaimana Anda membatalkan permintaan tarik? Saya hanya akan mengembalikan perubahan ke komit tepat sebelum penggabungan, tetapi saya perhatikan bahwa itu bergabung dalam banyak komit. Jadi sekarang ada semua komitmen dari orang ini dari beberapa hari sebelum penggabungan. Bagaimana Anda membatalkan ini?
git
github
merge
pull-request
Akan
sumber
sumber
Jawaban:
Ada jawaban yang lebih baik untuk masalah ini, meskipun saya bisa memecahnya langkah demi langkah.
Anda perlu mengambil dan memeriksa perubahan hulu terbaru seperti itu, misalnya:
Melihat log komit, Anda harus menemukan sesuatu yang mirip dengan ini:
Sekarang Anda ingin mengembalikan seluruh permintaan tarik dengan kemampuan untuk membatalkan kembali nanti. Untuk melakukannya, Anda harus mengambil ID komit gabungan .
Dalam contoh di atas komit gabungan adalah yang teratas di mana dikatakan "Permintaan tarik gabungan # 123 ..." .
Lakukan ini untuk mengembalikan kedua perubahan ( "Tambahkan bilah" dan "Tambahkan foo" ) dan Anda akan berakhir dengan satu komit mengembalikan seluruh permintaan tarik yang dapat Anda batalkan kembali nanti dan menjaga riwayat perubahan tetap bersih:
sumber
git checkout upstream/master -b revert/john/foo_and_bar
? apa fungsinya sebenarnya?Lihatlah grafik komit Anda (dengan gitk atau program serupa). Anda akan melihat komit dari permintaan tarik, dan Anda akan melihat komit Anda sendiri, dan komit gabungan (jika itu bukan gabungan fast-forward). Anda hanya perlu menemukan komit terakhir sebelum penggabungan, dan setel ulang cabang ke komit ini.
(Jika Anda memiliki reflog cabang, akan lebih mudah untuk menemukan komit sebelum penggabungan.)
(Edit setelah informasi lebih lanjut dalam komentar :)
Oke, mari kita lihat grafik:
Saya menganggap komit terakhir (paling kanan) adalah penggabungan salah Anda dengan permintaan tarik , yang menggabungkan garis biru yang terlihat di sini. Komitmen baik terakhir Anda adalah yang sebelumnya di garis hitam, di sini ditandai dengan merah:
Setel ulang ke komit ini, dan Anda akan baik-baik saja.
Ini berarti, dalam copy pekerjaan lokal Anda, lakukan ini (setelah memastikan Anda tidak memiliki hal-hal yang tidak dikomit lagi, misalnya dengan simpanan git):
Sekarang konfirmasikan bahwa Anda benar-benar di komit yang saya tandai di sana, dan Anda tidak akan melihat satu pun dari barang yang ditarik dalam leluhurnya.
(jika remote github Anda dinamai
origin
- lain ubah nama).Sekarang semuanya akan terlihat benar di github juga. Komit masih akan berada di repositori Anda, tetapi tidak dapat dijangkau oleh cabang mana pun, sehingga tidak akan membahayakan di sana. (Dan mereka akan tetap di repositori RogerPaladin, tentu saja.)
(Mungkin ada satu-satunya cara khusus web Github untuk melakukan hal yang sama, tapi saya tidak terlalu akrab dengan Github dan sistem pengelolaan permintaan tariknya.)
Perhatikan bahwa jika ada orang lain yang mungkin telah menarik tuan Anda dengan komit yang salah, mereka kemudian memiliki masalah yang sama seperti Anda saat ini, dan tidak dapat benar-benar berkontribusi kembali. sebelum mengatur ulang ke versi master baru Anda.
Jika kemungkinan ini terjadi, atau Anda hanya ingin menghindari masalah, gunakan
git revert
perintah alih-alihgit reset
, untuk mengembalikan perubahan dengan komit baru, alih-alih mengembalikan ke yang lebih lama. (Beberapa orang berpikir Anda tidak boleh melakukan reset dengan cabang yang diterbitkan.) Lihat jawaban lain untuk pertanyaan ini tentang bagaimana melakukan ini.Demi masa depan:
Jika Anda ingin hanya beberapa komit dari cabang RogerPaladin ini, pertimbangkan untuk menggunakan
cherry-pick
bukanmerge
. Atau berkomunikasi dengan RogerPaladin untuk memindahkan mereka ke cabang terpisah dan mengirim permintaan tarik baru.sumber
reset --hard
dan dorongan gaya adalah latihan yang sangat buruk) Jawaban oleh @errordeveloper di bawah ini menunjukkan cara untuk melakukan ini tanpa menulis ulang sejarah atau memaksakan dorongan.Jika tarikan adalah hal terakhir yang dia lakukan saat itu
sumber
git reset --hard HEAD~1
, saya biasagit push origin -f
memperbarui repositori jarak jauh. Tapi hati-hati, berhati-hatilah sebelum melakukan ini.Mulai 24 Juni 2014, Anda dapat mencoba membatalkan PR dengan mudah (Lihat " Mengembalikan permintaan tarik ") dengan:
Memperkenalkan Tombol Kembalikan
Masih harus diuji apakah itu mengembalikan penggunaan
-m
atau tidak (untuk mengembalikan gabungan juga)Namun Adil H Raza menambahkan dalam komentar (Desember 2019):
Peringatan : Korayem tunjukkan dalam komentar bahwa:
Korayem merujuk kita ke " Github: Perubahan yang diabaikan setelah kembali (
git cherry-pick
,git rebase
) " untuk lebih.sumber
Untuk membatalkan permintaan tarik github dengan komit yang tidak ingin Anda hapus, Anda harus menjalankan:
git reset --hard --merge <commit hash>
dengan hash komit menjadi PRIOR komit untuk menggabungkan permintaan tarik. Ini akan menghapus semua komitmen dari permintaan tarik tanpa mempengaruhi komitmen apa pun dalam riwayat.
Cara yang baik untuk menemukan ini adalah dengan membuka permintaan tarik yang sudah ditutup dan menemukan bidang ini:
Tarik Gambar Permintaan
Setelah Anda menjalankan
git reset
, jalankan:git push origin --force <branch name>
Ini harus mengembalikan cabang sebelum permintaan tarik TANPA memengaruhi komit apa pun di cabang yang dibubuhi riwayat komit antara komitmen dari permintaan tarik.
EDIT:
Jika Anda mengklik tombol balik pada permintaan tarik, ini menciptakan komit tambahan pada cabang. TIDAK JANGAN komit atau unmerge. Ini berarti bahwa jika Anda menekan tombol kembali, Anda tidak dapat membuka permintaan tarik baru untuk menambahkan kembali semua kode ini.
sumber
Saya menggunakan tempat ini sepanjang waktu, terima kasih.
Saya sedang mencari cara membatalkan permintaan tarik dan sampai di sini.
Aku baru saja akan
git reset --hard
akan "sudah lama" dan melakukan fast forward kembali ke tempat saya sebelum melakukan permintaan tarik.Selain mencari di sini, saya juga bertanya kepada rekan kerja saya apa yang akan dia lakukan, dan dia memiliki jawaban yang biasanya bagus: menggunakan contoh output pada jawaban pertama di atas:
Seperti kebanyakan hal di Git, jika Anda melakukannya dengan cara yang tidak mudah, Anda mungkin salah melakukannya.
sumber