Di Git, apakah ada cara untuk menggabungkan semua perubahan dari satu cabang ke cabang lain, tetapi squash ke satu komit pada saat yang sama?
Saya sering bekerja pada fitur baru di cabang terpisah dan secara teratur akan melakukan / mendorong - terutama untuk cadangan atau untuk mentransfer apa yang saya kerjakan ke mesin lain. Sebagian besar yang melakukan mengatakan "Feature xxx WIP" atau sesuatu yang berlebihan.
Setelah pekerjaan itu selesai dan saya ingin menggabungkan cabang WIP kembali menjadi master, saya ingin membuang semua komitmen perantara, dan hanya memiliki satu komit bersih.
Apakah ada cara mudah untuk melakukan ini?
Atau, bagaimana dengan perintah yang menekan semua komit pada cabang sejak titik di mana ia bercabang?
rebase --squash
Menemukannya! Perintah gabung memiliki
--squash
opsipada titik ini semuanya digabung, mungkin konflik, tetapi tidak dilakukan. Jadi sekarang saya bisa:
sumber
git add .
dilakukan?git add .
menambahkan semua file yang tidak diabaikan dalam direktori saat ini, saya akan berhati-hati dalam mengambil file yang tidak diinginkan dengan cara ini.git add .
Andagit add -u
hanya dapat menambahkan file yang sudah ditambahkan ke pohon.Coba
git rebase -i master
di cabang fitur Anda. Anda kemudian dapat mengubah semua kecuali satu 'pilih' menjadi 'squash' untuk menggabungkan komit. Lihat melakukan squashing dengan rebaseAkhirnya, Anda kemudian dapat melakukan penggabungan dari cabang master.
sumber
Menggunakan
git merge --squash <feature branch>
sebagai jawaban yang diterima menyarankan melakukan trik tetapi tidak akan menunjukkan cabang gabungan sebagai benar-benar bergabung.Karena itu solusi yang lebih baik adalah:
<feature branch>
ke dalam menggunakan di atasgit merge --squash
Wiki ini menjelaskan prosedur secara terperinci.
sumber
Saya telah membuat alias git saya sendiri untuk melakukan hal ini. Saya menyebutnya
git freebase
! Ini akan mengambil cabang fitur Anda yang berantakan dan tidak dapat diuraikan kembali dan membuatnya kembali sehingga menjadi cabang baru dengan nama yang sama dengan komit-komitnya diremas menjadi satu komit dan diubah kembali ke cabang yang Anda tentukan (master secara default). Pada akhirnya, ini akan memungkinkan Anda untuk menggunakan pesan komit apa pun yang Anda suka untuk cabang "bebas" baru Anda.Instal dengan menempatkan alias berikut di .gitconfig Anda:
Gunakan dari cabang fitur Anda dengan menjalankan:
git freebase <new-base>
Saya hanya menguji ini beberapa kali, jadi bacalah dulu dan pastikan Anda ingin menjalankannya. Sebagai tindakan keamanan kecil, printer ini mencetak starting sha1 sehingga Anda harus dapat memulihkan cabang lama Anda jika terjadi kesalahan.
Saya akan mempertahankannya dalam repo dotfile saya di github: https://github.com/stevecrozz/dotfiles/blob/master/.gitconfig
sumber
git merge --squash <feature branch>
adalah pilihan yang bagus. "git commit" memberi tahu Anda semua pesan fitur branch commit dengan pilihan Anda untuk menyimpannya.Untuk penggabungan komit kurang.
git merge lakukan x kali --git atur ulang HEAD ^ --soft lalu git komit.
File yang dihapus risiko dapat kembali.
sumber
Anda dapat melakukan ini dengan perintah "rebase". Mari kita sebut cabang "utama" dan "fitur":
Perintah rebase akan mengulang semua komit pada "fitur" sebagai satu komit dengan orangtua sama dengan "utama".
Anda mungkin ingin menjalankan
git merge main
sebelumnyagit rebase main
jika "main" telah berubah sejak "fitur" dibuat (atau sejak penggabungan terbaru). Dengan begitu, Anda masih memiliki riwayat lengkap seandainya Anda memiliki konflik gabungan.Setelah rebase, Anda bisa menggabungkan cabang Anda ke utama, yang akan menghasilkan penggabungan maju-cepat:
Lihat halaman rebase Pengertian Git Secara Konseptual untuk ikhtisar yang baik
sumber