Apa maksud Squashing di git. Bagaimana cara menghentikan komitmen di Github?
Saya baru mengenal Git dan saya meminta untuk ditugaskan ke bug pendatang baru di coala-analyzer. Saya memperbaiki bugnya, dan sekarang saya diminta untuk menghentikan komitmen saya. Bagaimana saya melakukannya?
Jawaban:
Anda dapat menganggap Git sebagai database lanjutan dari snapshot direktori kerja Anda.
Salah satu fitur yang sangat bagus dari Git adalah kemampuannya untuk menulis ulang sejarah komit.
Alasan utama untuk melakukan ini adalah bahwa banyak riwayat seperti itu hanya relevan untuk pengembang yang membuatnya, jadi itu harus disederhanakan, atau dibuat lebih bagus, sebelum mengirimkannya ke repositori bersama.
Menekan komit berarti, dari sudut pandang idiomatik, untuk memindahkan perubahan yang diperkenalkan dalam komit tersebut ke induknya sehingga Anda berakhir dengan satu komit, bukan dua (atau lebih).
Jika Anda mengulangi proses ini beberapa kali, Anda dapat mengurangi n komit menjadi satu.
Secara visual, jika Anda mulai pekerjaan Anda di komit ditandai Mulai , Anda ingin ini
Anda mungkin memperhatikan bahwa komit baru memiliki warna biru yang sedikit lebih gelap. Ini disengaja.
Dalam Git squashing dicapai dengan Rebase , dengan bentuk khusus yang disebut Rebase Interaktif .
Menyederhanakan saat Anda melakukan rebase satu set komit ke dalam cabang B , Anda menerapkan semua perubahan yang diperkenalkan oleh komit tersebut saat sudah selesai, mulai dari B, bukan dari leluhur aslinya.
Petunjuk visual
Perhatikan lagi corak biru yang berbeda.
Sebuah rebase interaktif memungkinkan Anda memilih bagaimana komit harus di-rebase. Jika Anda menjalankan perintah ini:
Anda akan mendapatkan file yang mencantumkan komit yang akan di-rebased
Saya tidak menyebutkan komitmennya, tetapi keempat komitmen ini dimaksudkan sebagai komitmen dari Awal hingga Kepala
Hal yang menyenangkan tentang daftar ini adalah dapat diedit .
Anda dapat menghilangkan komit, atau menghentikannya .
Yang harus Anda lakukan adalah mengubah kata pertama menjadi squash .
Jika Anda menutup editor dan tidak ada konflik penggabungan yang ditemukan, Anda akan mendapatkan riwayat ini:
Dalam kasus Anda, Anda tidak ingin melakukan rebase ke cabang lain, melainkan ke commit sebelumnya.
Untuk mengubah sejarah seperti yang ditunjukkan pada contoh pertama, Anda harus menjalankan sesuatu seperti
ubah "perintah" untuk menghentikan semua komitmen selain yang pertama, lalu tutup editor Anda.
Catatan tentang mengubah sejarah
Di Git, komit tidak pernah diedit. Mereka dapat dipangkas, dibuat tidak dapat dijangkau, dikloning tetapi tidak diubah.
Saat Anda melakukan rebase, Anda sebenarnya sedang membuat komitmen baru.
Yang lama tidak lagi dapat dijangkau oleh wasit mana pun, jadi tidak ditampilkan dalam riwayat tetapi mereka masih ada!
Inilah yang sebenarnya Anda dapatkan untuk rebase:
Jika Anda telah mendorongnya ke suatu tempat, menulis ulang histori sebenarnya akan membuat cabang!
sumber
man git rebase
: Pesan komit yang disarankan untuk komit terlipat adalah rangkaian pesan komit dari komit pertama dan pesan dengan perintah "squash"git diff
dapat membantu Anda menunjukkan apa yang terjadi.Perintah rebase memiliki beberapa opsi luar biasa yang tersedia dalam mode
--interactive
(atau-i
), dan salah satu yang paling banyak digunakan adalah kemampuan untuk menekan komit. Apa yang dilakukannya adalah mengambil komitmen yang lebih kecil dan menggabungkannya menjadi yang lebih besar, yang dapat berguna jika Anda menyelesaikan pekerjaan hari itu atau jika Anda hanya ingin mengemas perubahan Anda secara berbeda. Kami akan membahas bagaimana Anda dapat melakukan ini dengan mudah.Peringatan: Lakukan ini hanya pada komit yang belum didorong ke repositori eksternal. Jika orang lain mendasarkan pekerjaan dari komit yang akan Anda hapus, banyak konflik dapat terjadi. Hanya saja, jangan menulis ulang riwayat Anda jika telah dibagikan dengan orang lain.
Jadi katakanlah Anda baru saja membuat beberapa komitmen kecil, dan Anda ingin membuat satu komitmen yang lebih besar darinya. Sejarah repositori kami saat ini terlihat seperti ini:
4 komit terakhir akan jauh lebih bahagia jika digabungkan, jadi mari kita lakukan melalui rebasing interaktif:
Jadi, beberapa hal telah terjadi di sini. Pertama-tama, saya memberi tahu Git bahwa saya ingin melakukan rebase menggunakan empat commit terakhir dari tempat HEAD berada dengan HEAD ~ 4. Git sekarang telah menempatkan saya sebagai editor dengan teks di atas di dalamnya, dan sedikit penjelasan tentang apa yang bisa dilakukan. Anda memiliki banyak opsi yang tersedia untuk Anda dari layar ini, tetapi sekarang kami hanya akan memadatkan semuanya menjadi satu komitmen. Jadi, mengubah empat baris pertama file menjadi ini akan melakukan triknya:
Pada dasarnya ini memberitahu Git untuk menggabungkan keempat komit ke dalam komit pertama dalam daftar. Setelah ini selesai dan disimpan, editor lain muncul dengan yang berikut:
Karena kita menggabungkan begitu banyak komit, Git mengijinkan Anda untuk mengubah pesan komit baru berdasarkan komit lainnya yang terlibat dalam proses. Edit pesan sesuai keinginan Anda, lalu simpan dan keluar. Setelah selesai, komit Anda berhasil dihilangkan!
Dan jika kita melihat sejarah lagi…
Jadi, sejauh ini relatif tidak menimbulkan rasa sakit. Jika Anda mengalami konflik selama rebase, itu biasanya cukup mudah untuk diselesaikan dan Git menuntun Anda sebanyak mungkin. Dasar-dasarnya adalah memperbaiki konflik yang dimaksud,
git add
file, dan kemudiangit rebase --continue
melanjutkan proses. Tentu saja, melakukan agit rebase --abort
akan membawa Anda kembali ke keadaan sebelumnya jika Anda mau. Jika karena alasan tertentu Anda kehilangan komit di rebase, Anda dapat menggunakan reflog untuk mendapatkannya kembali.Detail dapat ditemukan di tautan ini .
sumber
Itu berarti menggabungkan beberapa komit menjadi satu. Lihat di:
https://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one/
Squash X terakhir saya melakukan bersama-sama menggunakan Git
sumber