Clean History dengan Git Squash
Tags: git, computerscience
Published: 2020-09-24 11:29:23

Kali ini saya akan membahas salah satu command git yaitu fixup & squash, fitur ini sangat bermanfaat untuk membuat history git kita bersih dan mudah di maintain.

Dibawah ini adalah contoh workflow yang biasanya kita lakukan dalam development suatu fitur.

1. Buat perubahan di dalam code, commit, lalu push ke remote repository
2. Buat perubahan lagi, commit, ... 
(*sebaiknya setiap selesai melakukan perubahan, push ke remote repository, selain sebagai backup juga sebagai report apa yg kita kerjakan perhari)
3. Done, Buat PR lalu minta review dari teammate kita
4. Push lagi dengan commit message "fix", "wrong" atau mungkin dengan message yg sama dengan sebelumnya
5. review lagi ...
6. Buat PR lagi ...
7. PR Approved and ready to merge
8. Merge. Done.

dengan flow seperti ini, ketika fitur akan di-merge maka akan ada banyak commit yang sebenarnya tidak terlalu penting untuk disimpan dibaca sebagai history, misanya saja commit yang berisi perubahan typo atau memperbaiki indentasi di sebagian baris kode.

Sekarang kita coba menggunakan fitur git squash dalam flow diatas,

Pada step ke-7 ketika PR kita sudah di approved oleh teammate, kita bisa lakukan squash menjadi 1 commit dengan commit message yg rapi, misalnya log kita setelah PR seperti dibawah,

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/yw2iyd4e16di3d6smdqc.png)

contoh log, dengan command `git log --oneline`

Kita ingin agar 4 commit terakhir dari `8fc49c9` ke `342b7cc` jadi satu dengan commit message `'[Donald][TASK-14045] add very cool sso feature'` , stepnya

1. `git rebase -i HEAD~4` 
-i : interactive mode
HEAD~N : ambil N commit terakhir
2. setelah itu akan ada tampilan interactive mode dari git rebase seperti dibawah ini, seperti yang kalian lihat di bagian yang di comment, ada banyak command yang bisa digunakan dalam interactive mode git rebase, namun disini kita hanya akan menggunakan 2 saja, yaitu `reword` dan `squash`
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/m7u5r9r9gflpb3xyciaj.png)

3. sekarang kita ubah commitnya sesuai tujuan kita,
    - `reword` commit pertama dengan message `'[Donald][TASK-14045] add very cool sso feature'`
    - `squash` commit-commit lainnya.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/q0v61xmu4efxtvyqp0q2.png)

> kita bisa juga menggunakan shorcut misalnya `r : reword, s : squash` untuk lebih jelas disini saya menggunakan full word.

karena disini saya menggunakan vim, maka type `:wq` untuk save.

4. setelah itu akan ada tampilan interactive mode lagi untuk `reword` commit message yang sebelumnya kita tandai akan kita reword

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/ta55yzpgplrqj02hsykf.png)
lalu hapus dan ganti dengan message `'[Donald][TASK-14045] add very cool sso feature'` `:wq` lagi untuk save.

5. lalu akan ada tampilan interactive mode untuk terakhir kalinya, disini kita hanya perlu mematikan comment message yg tidak kita perlukan dengan menambahkan 
tanda `#` didepan. 
lalu `:wq` untuk save.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/g2u00i516unbiyljww8w.png)

6. Dan selesai, commit yang sebelumnya ada 4, sekarang seharusnya sudah squash menjadi jadi, check dengan `git log --oneline`

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/cwx6wuarc7brtt8064jw.png)

---

Step ini memang membutuhkan habits agar dapat optimal, namun ini akan sangat mempermudah kita dalam development sehari-hari.

> gunakan rebase ini pada branch yg belum pernah merge di branch remote, dan jangan rebase branch yang digunakan bersama-sama misalnya branch master, feature, hotfix, staging dll.