Mengapa git revert mengeluh tentang opsi -m yang hilang?

185

Jadi saya sedang mengerjakan proyek dengan orang lain, dan ada banyak garpu github yang sedang dikerjakan. Seseorang baru saja memperbaiki untuk suatu masalah dan saya bergabung dengan garpunya, tetapi kemudian saya menyadari bahwa saya dapat menemukan solusi yang lebih baik. Saya ingin mengembalikan komit yang baru saja saya buat. Saya mencoba melakukan ini dengan git revert HEADtetapi itu memberi saya kesalahan ini:

fatal: Komit <SHA1> adalah gabungan tetapi opsi -m tidak diberikan.

Apa artinya? Ketika saya bergabung dan berkomitmen, saya menggunakan opsi -m untuk mengatakan "Digabung dengan <username>".

Apa yang saya lakukan salah di sini?

icnhzabot
sumber

Jawaban:

217

Secara default git revertmenolak untuk mengembalikan komit gabungan sebagai apa yang sebenarnya berarti ambigu. Saya menganggap bahwa Anda HEADsebenarnya gabungan komit.

Jika Anda ingin mengembalikan komit penggabungan, Anda harus menentukan induk gabungan yang ingin Anda pertimbangkan sebagai trunk utama, yaitu apa yang ingin Anda kembalikan.

Seringkali ini akan menjadi orangtua nomor satu, misalnya jika Anda aktif masterdan melakukan git merge unwanteddan kemudian memutuskan untuk mengembalikan penggabungan unwanted. Orang tua pertama akan menjadi mastercabang pre-gabungan Anda dan orang tua kedua akan menjadi ujung unwanted.

Dalam hal ini yang dapat Anda lakukan:

git revert -m 1 HEAD
CB Bailey
sumber
4
Ok terima kasih. Saya merasa lebih mudah hanya dengan mengubah dua file yang dipengaruhi oleh gabungan dan kemudian melakukan beberapa perubahan saya yang lain juga.
icnhzabot
43
Di mana saya dapat menemukan informasi apakah saya harus menggunakan -m1 atau -m2, ...?
Patrick Cornelissen
34
git cat-file -p [MERGE_COMMIT_ID]akan menampilkan cabang induk secara berurutan. Yang pertama terdaftar adalah -m 1, yang kedua -m 2.
nostromo
2
git revert [HASH] -m 2mengatakan kepada saya Di cabang 1.x-1.x tidak ada komit, direktori kerja bersih tapi komit saya tidak dikembalikan.
jenlampton
3
Jadi, jika saya perlu mengembalikan kembali 10 penggabungan (yang sangat mungkin karena git melakukan penggabungan secara otomatis setiap kali saya melakukan perubahan dari pengembang lain) saya harus melakukan ini untuk setiap penggabungan tunggal? Apakah ini sebabnya penggemar git sangat tertarik untuk rebasing, karena mengembalikan pada dasarnya tidak berguna?
Neutrino
46

Katakanlah orang lain membuat bar di atas foo, tetapi Anda menciptakan baz sementara itu dan kemudian bergabung, memberikan sejarah

$ git lola
* 2582152 (HEAD, master) Gabung cabang 'otherguy'
| \  
| * bilah c7256de (otherguy)
* | b7e7176 baz
| /  
* 9968f79 foo

Catatan: git lola adalah alias yang tidak standar tetapi bermanfaat.

Tidak ada dadu dengan git revert:

$ git mengembalikan KEPALA
fatal: Komit 2582152 ... adalah gabungan tetapi opsi -m tidak diberikan.

Charles Bailey memberikan jawaban yang sangat baik seperti biasa. Menggunakan git revertseperti pada

$ git revert --no-edit -m 1 KEPALA
[master e900aad] Kembalikan "Gabung cabang 'otherguy'"
 0 file berubah, 0 sisipan (+), 0 penghapusan (-)
 mode hapus 100644 bilah

secara efektif menghapus bardan menghasilkan riwayat

$ git lola
* e900aad (HEAD, master) Kembalikan "Gabung cabang 'otherguy'"
* 2582152 Gabung cabang 'otherguy'
| \  
| * bilah c7256de (otherguy)
* | b7e7176 baz
| /  
* 9968f79 foo

Tapi saya curiga Anda ingin membuang komit gabungan:

reset $ git --hard HEAD ^
KEPALA sekarang di b7e7176 baz

$ git lola
* b7e7176 (HEAD, master) baz
| * bilah c7256de (otherguy)
| /  
* 9968f79 foo

Seperti yang didokumentasikan dalam git rev-parsemanual

<rev>^, misalnya HEAD ^,v1.5.1^0
Suffix ^ke parameter revisi berarti orangtua pertama dari objek komit itu. ^<n>berarti induk ke- n ( yaitu <rev>^ setara dengan <rev>^1). Sebagai aturan khusus, <rev>^0berarti komit itu sendiri dan digunakan ketika <rev>adalah nama objek dari objek tag yang merujuk ke objek komit.

jadi sebelum memanggil git reset, HEAD^(atau HEAD^1) adalah b7e7176 dan HEAD^2c7256de, yaitu , masing-masing orang tua pertama dan kedua dari gabungan tersebut melakukan.

Hati-hati dengan git reset --hardkarena dapat menghancurkan pekerjaan.

Greg Bacon
sumber
3
Ini adalah campuran, kacau, mengguncang dunia. Kecuali Lola. Terima kasih banyak untuk alias luar biasa ini.
Barney
Cara mudah untuk menambah lolaperintah git Anda:git config --global alias.lola "log --graph --decorate --pretty=oneline --abbrev-commit --all"
D. Gibbs
8

Saya punya masalah ini, solusinya adalah dengan melihat grafik commit (menggunakan gitk) dan melihat bahwa saya memiliki yang berikut:

*   commit I want to cherry-pick (x)
|\  
| * branch I want to cherry-pick to (y)
* | 
|/  
* common parent (x)

Saya mengerti sekarang yang ingin saya lakukan

git cherry-pick -m 2 mycommitsha

Ini karena -m 1akan menggabungkan berdasarkan induk biasa di mana sebagai -m 2penggabungan berdasarkan cabang y, itulah yang saya ingin ceri-pilih.

shmish111
sumber
1
Mungkin karena itu tidak terkait dengan git-revert, tentang apa pertanyaan ini.
pnomolos
1
Saya pikir pertanyaan ini adalah tentang -mopsi, bukan hanya tentang git merge. Yaitu, alasan di balik penggunaan -mopsi tampaknya sama untuk reverts dan cherry-picks. Jika itu tidak benar, beri tahu kami. Karena saya belum menemukan pertanyaan lain yang secara khusus membahas penggunaan cherry-pick, terima kasih atas jawaban ini, yang mungkin mengarahkan google untuk membantu saya menemukan pertanyaan ini dan diskusi yang bermanfaat dan relevan!
nealmcb