Misalkan Anda memiliki riwayat yang mengandung tiga komit A, B dan C :
A-B-C
Saya ingin menggabungkan dua komit A dan B menjadi satu komit AB :
AB-C
Saya mencoba
git rebase -i A
yang membuka editor saya dengan konten berikut:
pick e97a17b B
pick asd314f C
Saya mengubah ini menjadi
squash e97a17b B
pick asd314f C
Kemudian Git 1.6.0.4 mengatakan:
Cannot 'squash' without a previous commit
Apakah ada cara atau ini tidak mungkin?
git
rebase
git-rebase
git-rewrite-history
Kristen
sumber
sumber
Jawaban:
Gunakan
git rebase -i --root
pada Git versi 1.7.12 .Dalam file rebase interaktif, ubah baris kedua dari komit B menjadi squash dan biarkan baris lain di pilih :
Ini akan menggabungkan dua komit A dan B menjadi satu komit AB .
Ditemukan dalam jawaban ini .
sumber
Anda mencoba:
Dimungkinkan untuk memulai seperti itu jika Anda melanjutkan dengan
edit
daripadasquash
:lalu lari
Selesai
sumber
git rebase --abort
untuk memulai kembali dan melakukannya dengan cara yang benar (tidak menekan komit pertama di editor)A
adalah komit awal, tetapi sekarang Anda inginkanB
menjadi komit awal. komit git adalah seluruh pohon, bukan beda bahkan jika mereka biasanya digambarkan dan dilihat dalam hal perbedaan yang mereka perkenalkan.Resep ini berfungsi bahkan jika ada banyak komit antara A dan B, dan B dan C.
sumber
git rebase --onto tmp <sha1_for_B>
Dalam hal rebase interaktif, Anda harus melakukannya sebelum A sehingga daftar akan menjadi:
untuk menjadi:
Jika A adalah komit awal, Anda harus memiliki komit awal yang berbeda sebelum A. Git berpikir dalam perbedaan, itu akan bekerja pada perbedaan antara (A dan B) dan (B dan C). Karenanya squash tidak berfungsi dalam contoh Anda.
sumber
Dalam kasus yang Anda memiliki ratusan atau ribuan komit, menggunakan jawaban kostmo ini dari
bisa jadi tidak praktis dan lambat, hanya karena banyaknya komitmen yang harus diproses skrip rebase dua kali , satu kali untuk menghasilkan daftar editor rebase interaktif (di mana Anda memilih tindakan apa yang akan diambil untuk setiap komit), dan satu kali untuk benar-benar mengeksekusi penerapan kembali komitmen.
Berikut adalah solusi alternatif yang akan menghindari biaya waktu pembuatan daftar editor rebase interaktif dengan tidak menggunakan rebase interaktif di tempat pertama. Dengan cara ini, ini mirip dengan solusi Charles Bailey . Anda cukup membuat cabang yatim dari komit kedua, dan kemudian rebase semua komitmen turunan di atasnya:
Dokumentasi
sumber
Dalam pertanyaan terkait, saya berhasil membuat pendekatan yang berbeda dengan kebutuhan untuk menekan komitmen pertama, yaitu, untuk membuatnya menjadi komitmen kedua.
Jika Anda tertarik: git: bagaimana cara memasukkan komit sebagai yang pertama, menggeser yang lainnya?
sumber
Perintah git untuk pasukan: git rebase -i KEPALA ~ [jumlah komit]
Katakanlah Anda memiliki di bawah riwayat git commit:
pick 5152061 feat: Menambahkan dukungan untuk menyimpan gambar. (A)
pilih 39c5a04 Fix: perbaikan bug. (B)
pilih perbaikan 839c6b3: konflik diselesaikan. (C)
Sekarang Anda ingin memencet A dan B ke AB, lakukan langkah-langkah di bawah ini:
pick 5152061 feat: Menambahkan dukungan untuk menyimpan gambar. (A)
s 39c5a04 Fix: perbaikan bug. (B)
pilih perbaikan 839c6b3: konflik diselesaikan. (C)
Catatan: untuk squashing commit kita bisa menggunakan squash atau s. Hasil akhirnya adalah:
pilih 5152061 feat: Menambahkan dukungan untuk menyimpan gambar. (AB)
pilih perbaikan 839c6b3: konflik diselesaikan. (C)
sumber
Anda harus melakukan sedikit keajaiban baris perintah.
Itu akan meninggalkan Anda dengan cabang yang memiliki AB dan C sebagai commit.
sumber