Pertanyaan Bagaimana cara menggunakan git merge --squash?


Saya memiliki server Git jarak jauh, ini 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

  • Di dalam repositori atas kita harus melakukan satu commit untuk satu bug dengan pesan resmi Git

Jadi bagaimana saya bisa menggabungkan cabang saya ke cabang jarak jauh sehingga mereka hanya mendapatkan satu komitmen untuk semua lapor-masuk saya (saya bahkan ingin memberikan pesan komit untuk ini)?


763
2018-03-15 07:47


asal


Jawaban:


Katakanlah cabang perbaikan bug Anda dipanggil bugfix dan Anda ingin menggabungkannya master:

git checkout master
git merge --squash bugfix
git commit

Ini akan mengambil semua commit dari bugfix cabang, masukkan mereka ke dalam 1 commit, dan gabungkan dengan Anda master cabang.


Penjelasan:

git checkout master

Beralih ke Anda master cabang.

git merge --squash bugfix

Mengambil semua perintah dari bugfix cabang dan menggabungkannya dengan cabang Anda saat ini.

git commit

Menciptakan komitmen tunggal dari perubahan yang digabungkan.

Menghilangkan -m parameter memungkinkan Anda memodifikasi konsep pesan commit yang berisi setiap pesan dari komitmen Anda yang dijejalkan sebelum menyelesaikan commit Anda.


1259
2018-03-15 08:16



Anda ingin menggabungkan dengan opsi squash. Itu jika Anda ingin melakukannya satu cabang pada suatu waktu.

git merge --squash feature1

Jika Anda ingin menggabungkan semua cabang pada saat yang sama sebagai satu commit, maka rebase pertama secara interaktif dan squash setiap fitur kemudian gurita bergabung:

git checkout feature1
git rebase -i master

Squash menjadi satu komit kemudian ulangi untuk fitur lainnya.

git checkout master
git merge feature1 feature2 feature3 ...

Penggabungan terakhir itu adalah "gurita bergabung" karena menggabungkan banyak cabang sekaligus.

Semoga ini membantu


84
2018-03-15 08:08



Yang akhirnya membereskan hal ini bagi saya adalah a komentar menunjukkan bahwa:

git checkout main
git merge --squash feature

setara dengan melakukan:

git checkout feature
git diff main > feature.patch
git checkout main
patch -p1 < feature.patch
git add .

Ketika saya ingin menggabungkan sebuah cabang fitur dengan 105 (!!) melakukan dan mereka semua terjepit menjadi satu, saya tidak mau git rebase -i origin/master karena saya harus menyelesaikan konflik penggabungan secara terpisah setiap dari komit menengah (atau setidaknya yang tidak bisa diketahui sendiri). Menggunakan git merge --squash memberi saya hasil yang saya inginkan, dari komitmen tunggal untuk menggabungkan seluruh cabang fitur. Dan, saya hanya perlu melakukan paling banyak satu resolusi konflik manual.


81
2017-08-19 15:59



Jika Anda sudah melakukannya git merge bugfix di main, Anda dapat menekan commit gabungan Anda menjadi satu dengan:

git reset --soft HEAD^1
git commit

19
2018-03-13 17:50



Menggabungkan newFeature bercabang ke dalam master dengan komitmen khusus:

git merge --squash newFeature && git commit -m 'Your custom commit message';

Jika sebaliknya, Anda lakukan

git merge --squash newFeature && git commit

Anda akan mendapatkan pesan komit yang akan mencakup semua newFeature commit cabang, yang dapat Anda sesuaikan.


6
2018-03-17 11:10



Untuk Git

Buat fitur baru

via Terminal / Shell:

git checkout origin/feature/<featurename>
git merge --squash origin/feature/<featurename>

Ini tidak melakukan itu, memungkinkan Anda untuk memeriksanya terlebih dahulu.

Kemudian komit, dan selesaikan fitur dari cabang baru ini, dan hapus / abaikan yang lama (yang Anda lakukan dev on).


0
2017-10-05 14:33