Saya memiliki server Git jarak jauh, ini adalah skenario yang ingin saya lakukan:
Untuk setiap bug / fitur saya membuat cabang Git yang berbeda
Saya terus melakukan kode saya di cabang Git dengan pesan Git yang tidak resmi
Dalam repositori teratas kita harus melakukan satu komit untuk satu bug dengan pesan Git resmi
Jadi bagaimana saya bisa menggabungkan cabang saya ke cabang jarak jauh sehingga mereka mendapatkan hanya satu komit untuk semua check-in saya (saya bahkan ingin memberikan pesan komit untuk ini)?
git
git-merge
git-squash
SunnyShah
sumber
sumber
git merge --squash
melakukan semuanya pada baris perintah dalam satu tembakan dan Anda hanya berharap itu berfungsi.git rebase -i
membawa editor dan memungkinkan Anda menyempurnakan rebase. Ini lebih lambat, tetapi Anda bisa melihat apa yang Anda lakukan. Juga, ada perbedaan antara rebase dan penggabungan yang sedikit terlalu terlibat untuk dibahas dalam komentar.merge --squash
dari yang lama ke yang baru, lalu gabungkan cabang baru untuk dikuasai. Cabang lama menjadi usang.Jawaban:
Katakanlah cabang perbaikan bug Anda dipanggil
bugfix
dan Anda ingin menggabungkannya menjadimaster
:Ini akan mengambil semua komit dari
bugfix
cabang, squash mereka menjadi 1 komit, dan menggabungkannya denganmaster
cabang Anda .Penjelasan :
Beralih ke
master
cabang Anda .Mengambil semua komit dari
bugfix
cabang dan menggabungkannya dengan cabang Anda saat ini.Menciptakan satu komit dari perubahan yang digabungkan.
Dengan mengabaikan
-m
parameter, Anda dapat memodifikasi pesan konsep draf yang berisi setiap pesan dari komit terjepit Anda sebelum menyelesaikan komit Anda.sumber
git commit
(tanpa-m
param) dan Anda akan bisa memodifikasi pesan komit yang disusun yang berisi semua pesan komit yang Anda hancurkan.git commit --amend -m '...'
nanti.git commit
tidak akan lagi menampilkan pesan komit bermanfaat yang berisi semua pesan komit yang Anda hancurkan. Jika demikian, cobagit commit --file .git/SQUASH_MSG
(via stackoverflow.com/a/11230783/923560 ).git commit -a --author="Author" --message="Issue title #id"
git merge --squash
memungkinkan Anda untuk membuat komit tunggal di atas cabang saat ini yang efeknya sama dengan menggabungkan cabang lain. Tapi itu tidak akan menghasilkan catatan penggabungan, yang berarti permintaan tarik Anda karena hasilnya tidak akan berubah, namun tidak akan ditandai sebagai digabungkan! Jadi, Anda hanya perlu menghapus cabang yang harus dilakukan.Apa yang akhirnya bereskan bagi saya adalah komentar yang menunjukkan bahwa:
setara dengan melakukan:
Ketika saya ingin menggabungkan cabang fitur dengan 105 (!!) komit dan membuat semuanya tergencet menjadi satu, saya tidak mau
git rebase -i origin/master
karena saya perlu secara terpisah menyelesaikan konflik penggabungan untuk masing - masing komitmen menengah (atau setidaknya yang git tidak bisa mencari tahu sendiri). Menggunakangit merge --squash
memberi saya hasil yang saya inginkan, dari satu komit untuk menggabungkan seluruh cabang fitur. Dan, saya hanya perlu melakukan paling banyak satu resolusi konflik manual.sumber
git merge master
, dan hanya kemudiangit merge --squash feature
di cabang master.git merge --squash feature
dari cabang utama?Anda ingin bergabung dengan opsi squash. Itu jika Anda ingin melakukannya satu cabang sekaligus.
Jika Anda ingin menggabungkan semua cabang pada saat yang sama dengan komit tunggal, maka rebase pertama secara interaktif dan tekan setiap fitur kemudian gurita bergabung:
Squash menjadi satu komit kemudian ulangi untuk fitur lainnya.
Penggabungan terakhir itu adalah "penggabungan gurita" karena menggabungkan banyak cabang sekaligus.
Semoga ini membantu
sumber
Jika sudah
git merge bugfix
aktifmain
, Anda dapat menekan komit gabungan menjadi satu dengan:sumber
git reset --soft HEAD^1
tampaknya membatalkan komit terakhir yang dilakukan sebelum penggabungan, setidaknya dalam kasus penggabungan menjadi maju cepat.git reset --soft HEAD^<number-of-commits-to-squash>
.Gabungkan
newFeature
cabangmaster
dengan komit khusus:Jika sebaliknya, Anda melakukannya
git merge --squash newFeature && git commit
Anda akan mendapatkan pesan komit yang akan menyertakan semua
newFeature
komitmen cabang, yang dapat Anda sesuaikan.Saya jelaskan di sini: https://youtu.be/FQNAIacelT4
sumber
Saya tahu pertanyaan ini bukan tentang Github secara khusus, tetapi karena Github digunakan secara luas dan ini adalah jawaban yang saya cari, saya akan membagikannya di sini.
Github memiliki kemampuan untuk melakukan penggabungan squash, tergantung pada opsi penggabungan yang diaktifkan untuk repositori.
Jika penggabungan squash diaktifkan, opsi "Squash and merge" akan muncul di dropdown di bawah tombol "Gabung".
sumber
Misalkan Anda bekerja di fitur / task1 dengan banyak komit.
Buka cabang proyek Anda (proyek / my_project)
Buat cabang baru (fitur / task1_bugfix)
Marge dengan
--squash
opsiBuat komit tunggal
Dorong cabang Anda
sumber
Untuk Git
Buat fitur baru
melalui Terminal / Shell:
Ini tidak melakukan itu, memungkinkan Anda untuk meninjaunya terlebih dahulu.
Kemudian komit, dan selesaikan fitur dari cabang baru ini, dan hapus / abaikan yang lama (yang sudah Anda gunakan).
sumber
jika Anda mendapatkan kesalahan: Melakukan tidak mungkin karena Anda memiliki file yang tidak dihapus.
memperbaiki semua file Konflik
Anda juga bisa menggunakan
sumber
Untuk menekan cabang lokal Anda sebelum mendorongnya:
checkout cabang yang dimaksud untuk dikerjakan jika belum diperiksa.
Temukan sha dari commit tertua yang ingin Anda pertahankan.
Buat / checkout cabang baru (tmp1) dari komit itu.
git checkout -b tmp1 <sha1-of-commit>
Gabungkan cabang asli menjadi cabang baru yang tergencet.
git merge --squash <original branch>
Komit perubahan yang telah dibuat oleh gabungan, dengan pesan ringkasan komit.
git commit -m <msg>
Periksa cabang asli yang ingin Anda remas.
git checkout <branch>
Atur ulang ke komit asli yang ingin Anda pertahankan.
git reset --soft <sha1>
Rebase cabang ini berdasarkan cabang tmp1 baru.
git rebase tmp1
Itu saja - sekarang hapus cabang tmp1 sementara setelah Anda yakin semuanya baik-baik saja.
sumber
Anda dapat menggunakan alat yang saya buat untuk membuat proses ini lebih mudah: git-squash . Misalnya untuk menekan semua komit pada cabang fitur yang telah bercabang dari cabang utama, tulis:
sumber