Saya membuat beberapa perubahan di cabang utama saya dan ingin membawanya ke hulu. ketika saya memilih tindakan berikut namun saya terjebak di fd9f578 di mana git mengatakan:
$ git cherry-pick fd9f578
fatal: Commit fd9f57850f6b94b7906e5bbe51a0d75bf638c74d is a merge but no -m option was given.
Apa yang git coba sampaikan kepada saya dan apakah cherry-pick adalah hal yang tepat untuk digunakan di sini? Cabang utama memang menyertakan perubahan ke file yang telah dimodifikasi di cabang hulu, jadi saya yakin akan ada beberapa konflik penggabungan tetapi itu tidak terlalu buruk untuk diluruskan. Saya tahu perubahan mana yang dibutuhkan di mana.
Ini adalah komitmen yang ingin saya bawa ke hulu.
e7d4cff added some comments...
23e6d2a moved static strings...
44cc65a incorporated test ...
40b83d5 whoops delete whitspace...
24f8a50 implemented global.c...
43651c3 cleaned up ...
068b2fe cleaned up version.c ...
fd9f578 Merge branch 'master' of ssh://extgit/git/sessions_common
4172caa cleaned up comments in sessions.c ...
sumber
git rebase
- ini seperti penggabungan, tetapi alih-alih mengintegrasikan dua cabang, transplantasi satu untuk duduk di atas yang lain.git show
dan sejenisnya).git reset --hard HEAD@{1}
untuk mendapatkan kembali komit Anda yang hilang.git reset
tidak dibatasi untuk bergerak "mundur" dalam sejarah.git checkout -b mybranch HEAD@{1}
juga akan bekerja.git merge
mungkin memiliki konsekuensi yang tidak diinginkan. Perintah itu akan menambahkan semua komit (lama) lain yang ada di cabang induk. Biasanya orang memilih untuk memetik ceri karena mereka tidak ingin yang lain melakukan. Pastikan Anda memeriksa ulang bahwa Anda hanya menerapkan perubahan yang Anda inginkan!-m
berarti nomor induk.Dari git doc:
Misalnya, jika pohon komit Anda seperti di bawah ini:
maka
git cherry-pick E
akan menghasilkan masalah yang Anda hadapi.git cherry-pick E -m 1
berarti menggunakanD-E
, sementaragit cherry-pick E -m 2
berarti menggunakanB-C-E
.sumber
@ Borealid jawaban itu benar, tetapi anggaplah Anda tidak peduli tentang melestarikan sejarah penggabungan yang tepat dari sebuah cabang dan hanya ingin memilih versi yang sudah di-linearisasi. Berikut cara mudah dan aman untuk melakukannya:
Status awal: Anda berada di cabang
X
, dan Anda ingin memilih komitY..Z
.git checkout -b tempZ Z
git rebase Y
git checkout -b newX X
git cherry-pick Y..tempZ
git branch -D tempZ
Apa yang dilakukan adalah membuat cabang
tempZ
berdasarkanZ
, tetapi dengan sejarah dariY
linier selanjutnya, dan kemudian memetiknya ke salinan yangX
disebutnewX
. (Lebih aman melakukan ini pada cabang baru daripada bermutasiX
.) Tentu saja mungkin ada konflik di langkah 4, yang harus Anda selesaikan dengan cara biasa (cherry-pick
bekerja sangat miriprebase
dalam hal itu). Akhirnya menghapustempZ
cabang sementara .Jika langkah 2 memberikan pesan "TempZ cabang saat ini adalah yang terbaru", maka
Y..Z
sudah linear, jadi abaikan saja pesan itu dan lanjutkan dengan langkah 3 dan seterusnya.Kemudian tinjau
newX
dan lihat apakah itu sesuai dengan yang Anda inginkan.(Catatan: ini tidak sama dengan yang sederhana
git rebase X
ketika di cabangZ
, karena itu tidak tergantung dengan cara apa pun pada hubungan antaraX
danY
; mungkin ada komit antara leluhur yang sama danY
yang tidak Anda inginkan.)sumber
git rebase Y
mengatakanCurrent branch tempZ is up to date
Y..Z
sudah linear. Jadi, Anda dapat mengabaikan pesan itu dan melanjutkan dengan langkah 3 dan 4.Menyederhanakan. Cherry memilih komit. Jangan memilih cherry-merger.
Inilah penulisan ulang jawaban yang diterima yang secara ideal mengklarifikasi keuntungan / risiko dari pendekatan yang mungkin:
Anda mencoba memilih cherry fd9f578, yang merupakan gabungan dari dua orang tua.
Alih-alih memilih cherry memilih merger, hal yang paling sederhana adalah memilih cherry memilih commit yang sebenarnya Anda inginkan dari setiap cabang di merger.
Karena Anda sudah bergabung, kemungkinan semua komitmen yang Anda inginkan ada di daftar Anda. Pilih Cherry secara langsung dan Anda tidak perlu mengacaukan komit gabungan.
penjelasan
Cara kerja cherry-pick adalah dengan mengambil diff yang diwakili oleh changeset (perbedaan antara pohon yang bekerja pada saat itu dan pohon yang bekerja dari induknya), dan menerapkan perubahan tersebut ke cabang Anda saat ini.
Jika komit memiliki dua atau lebih orang tua, seperti halnya dengan gabungan, komit juga mewakili dua atau lebih perbedaan. Kesalahan terjadi karena ketidakpastian di mana diff harus berlaku.
alternatif
Jika Anda menentukan bahwa Anda perlu menyertakan gabungan vs memetik komitmen terkait, Anda memiliki dua opsi:
(Lebih rumit dan tidak jelas; juga membuang riwayat) Anda dapat menunjukkan orang tua mana yang harus diterapkan.
Gunakan
-m
opsi untuk melakukannya. Misalnya,git cherry-pick -m 1 fd9f578
akan menggunakan induk pertama yang tercantum dalam gabungan sebagai basis.Juga pertimbangkan bahwa ketika Anda memilih komit gabungan, itu menciutkan semua perubahan yang dibuat di induk yang Anda tidak tentukan
-m
menjadi komit yang satu itu . Anda kehilangan semua sejarah mereka, dan menggabungkan semua diff mereka. Panggilanmu.(Lebih sederhana dan lebih akrab; menyimpan sejarah) yang dapat Anda gunakan
git merge
sebagai gantinyagit cherry-pick
.git merge
, ia akan mencoba untuk menerapkan semua komit yang ada pada cabang yang Anda gabungkan, dan mendaftar secara individual di log git Anda.sumber
Penyederhanaan metode @Daira Hopwood bagus untuk memilih satu komit tunggal. Tidak perlu cabang sementara.
Dalam kasus penulis:
lalu lakukan:
sumber