Saat ini saya sedang mengerjakan cabang dan ingin beberapa komit untuk bergabung ke cabang lain:
a-b-c-d-e-f-g (branchA)
/
--o-x-x-x-x-x-x-x-x-x-x (master)
\
x-x-x-x-x (branchB)
(Huruf menunjukkan komit, dan "x" adalah komit yang tidak relevan.)
Namun saya perhatikan bahwa adalah ide yang baik untuk mengumpulkan beberapa komitmen. Saya ingin "menggabungkan" komit a, d, e dan g menjadi satu tambalan dan mengkomitnya ke master. Komit b dan f harus pergi sebagai salah satu komit ke branchB. Apakah ada cara 'git'-ish yang baik untuk mencapainya?
Jawaban:
Perintah yang Anda cari adalah
git rebase
, khususnya-i/--interactive
opsi.Saya akan berasumsi bahwa Anda ingin meninggalkan komit c di cabang A, dan yang Anda maksud benar-benar ingin memindahkan komit lain ke cabang lain, daripada menggabungkan, karena penggabungan sangat mudah. Mari kita mulai dengan memanipulasi cabang A.
The
^
berarti komit sebelumnya, sehingga perintah ini mengatakan untuk rebase cabang A menggunakan komit sebelum "a" sebagai basis. Git akan memberi Anda daftar komit dalam rentang ini. Susun ulang dan beri tahu git untuk menekan yang sesuai:Sekarang sejarahnya akan terlihat seperti ini:
Sekarang, mari ambil komit b + f yang baru saja dipencet untuk branchB.
Dan hal yang sama untuk a + d + e + g untuk master:
Terakhir, perbarui branchA agar mengarah ke c:
Sekarang kita harus memiliki:
Perhatikan bahwa jika Anda memiliki beberapa komit yang ingin Anda pindahkan antar cabang, Anda dapat menggunakan rebase lagi (non-interaktif):
Terakhir, sebuah penafian: Sangat mungkin untuk menyusun ulang commit sedemikian rupa sehingga beberapa tidak lagi berlaku dengan rapi. Ini bisa jadi karena Anda memilih urutan yang buruk (meletakkan tambalan sebelum komit memperkenalkan fitur yang ditambal); dalam hal ini Anda ingin membatalkan rebase (
git rebase --abort
). Jika tidak, Anda harus dengan cerdas memperbaiki konflik (seperti yang Anda lakukan dengan konflik gabungan), menambahkan perbaikan, lalu jalankangit rebase --continue
untuk melanjutkan. Instruksi ini juga disediakan oleh pesan kesalahan yang tercetak saat konflik terjadi.sumber
git branch -f branchA branchA^^
salah? Yaitu, bukankah seharusnya branchA menunjuk ke c pada titik ini, sehingga baris pertama diagram adalahc (branchA)
dan bukanc - [a+d+e+g] - [b+f] (branchA)
?git branch -f branchA branchA^^
mengapa Anda tidak bisa melakukangit reset --hard <sha1 of c>
di cabang A?Di mana
3
jumlah komit yang perlu disusun ulang ( sumber ).Ini akan membuka vi , mendaftar komit dari terlama (atas) ke terbaru (bawah).
Sekarang susun ulang baris, simpan , dan keluar dari editor.
ddp
akan memindahkan baris saat ini ke bawahddkP
akan memindahkan baris saat ini ke atas ( sumber )sumber
git rebase --interactive
adalah perintah yang Anda inginkan.Contoh:
Status saat ini adalah ini:
Saya ingin menyusun ulang komit
9a24b81
( Komitmen ketiga) dan7bdfb68
( Komitmen kedua). Untuk melakukan ini, pertama-tama saya menemukan komit sebelum komit pertama yang ingin kita ubah . Ini adalah komit186d1e0
(Komitmen pertama).Perintah yang akan dijalankan adalah
git rebase --interactive COMMIT-BEFORE-FIRST-COMMIT-WE-WANT-TO-CHANGE
, dalam hal ini:Ini membuka file di editor default dengan konten berikut:
Perhatikan bahwa urutan komit dalam file berlawanan dengan yang digunakan untuk git log. Dalam git log, komit terbaru ada di bagian atas. Dalam file ini, komit terbaru ada di bagian bawah.
Seperti yang dijelaskan oleh komentar di bagian bawah file, ada berbagai hal yang dapat saya lakukan, seperti menekan, melepas, dan menyusun ulang komitmen. Untuk memesan ulang komit, saya mengedit file sehingga terlihat seperti ini (komentar bawah tidak ditampilkan):
The
pick
perintah pada awal setiap baris berarti "penggunaan (yaitu mencakup) ini melakukan" dan ketika saya menyimpan file suhu dengan perintah rebase dan keluar dari editor, git akan mengeksekusi perintah dan memperbarui repositori dan direktori kerja:Perhatikan riwayat komit yang ditulis ulang.
Tautan:
sumber
git rebase --interactive
untuk mencapai tujuan OP?Jika Anda hanya ingin menyusun ulang dua komit terakhir , Anda dapat menggunakan
git reorder
alias ini : https://stackoverflow.com/a/33388211/338581sumber
git rebase adalah yang Anda inginkan. Lihat opsi --interactive.
sumber