Today I Learned - *Alternatif nge-rebase

Photo by Yancy Min on Unsplash

Today I Learned - *Alternatif nge-rebase

Ketika pusing nge-resolve conflict commit yang banyak 1-by-1

Lanjutan dari postingan di linkedin: https://www.linkedin.com/posts/mochadwi_rebase-alternative-use-drop-commit-instead-activity-7047770226758729728-p1Fb


Bismillah was shalatu was salamu ‘ala Rasulillah, amma ba’du”

Referensi: konsultasisyariah.com/25372-kalimat-amma-ba..

Jadi, di Android Studio itu sebenernya ada fitur keren maasyaallah yang akan nge-open semacam dialog/tool windows ketika ada Merge Conflict.

Nah, proses rebase ini biasanya terjadi kalo ada kasus, misalkan:

Kita punya 1 branch namanya: branch-a, sebelum mau Open PR, ternyata commit dan/atau changes-nya kebanyakan (anggaplah X totalnya). Qadarullah, misalkan ada guidelines (di Open Source atau Company kita kerja) untuk ga boleh lebih dari X file/changes/commit ketika Open PR. Akhirnya kita perlu breakdown Commit kita dan pecahin jadi 2 branch misalkan. Jadi ada 2 branch: branch-a & branch-b.

Bismillah, kita open PR deh untuk branch-a, di-review sama tim kita, approved, dan merged ke public / protected branch (e.g: develop branch).

Let's checkout back to branch-b, di sini commit2-nya jadi obsolete, karena sebagian commit udah merged ke develop

Nah solusi yang kepikiran sejauh ini: Drop changes yg kita butuhin di branch-b, yang already merged to develop.

Gimana2?

Let's go into screenshot and detailed step bismillah here:

FYI: screenshot-nya pake branch name yang berbeda dari branch-b, atau branch-a, penamaan branch di artikel ini biar ga panjang dan confusing :)

Cara Rebase (then)

Screen Shot 2022-09-27 at 1.50.09 PM.png

Terus kita pilih public/protected branch yang mau kita rebase

Screen Shot 2022-09-27 at 10.15.18 AM.png

Setelah kita Pull into current Using Rebase di atas, kita akan bertemu dengan dialog berikut:

2022-09-27 10.04.28.gif

Kenapa pake Pull into current Using Rebase karena untuk menghindari Merge Commit kalo pake Pull into current Using Merge

Karena commit-nya udah banyak yang obsolete, Android Studio akan run through 1-per-satu tiap X commit, untuk cocokin commit yg di branch-b dengan yg merged di develop (commit yg di-highlight biru)

Namanya manusia tempat salah, qadarullah biasa dihadapi dengan ujian seperti ini:

Screen Shot 2022-09-27 at 10.13.27 AM.png

Jadi beberapa commit yang merged masih muncul di branch-b ini sebenernya unintended/undesired behaviour. Kalo pun harus ulang dari awal akan melelahkan :(

Cara Drop Commit + Rebase

DISCLAIMER: Hati2 pake cara ini, karena bisa aja kita malah nge-hapus commit yang kita butuhin

Jadi kita highlight commit yang ada dan merged di develop (kita sisain commit untuk di branch-b)

Screen Shot 2022-09-27 at 10.33.26 AM.png

Hasil:

Screen Shot 2022-09-27 at 10.21.57 AM.png

Commit yang kita harapkan ada, tanpa ada commit redundant, changes-nya pun exist dan juga clean

FYI: approach ini akan munculin rebase popup dialog lagi, karena bisa jadi commit yang kita sisain itu ada changes yang depends on commit yang kita drop. Additional overhead :(

Cara Drop Commit + Cherry-Pick (my personal preferences)

DISCLAIMER: branch-b harus udah di push ke remote dulu, karena akan digunakan sebagai backup, atau bisa bikin branch baru di local, e.g: backup/branch-b sebelum ngelakuin dangerous approach ini!

Kita drop semua commit yang baru since latest dev, e.g kita highlight:

Screen Shot 2022-09-27 at 1.19.22 PM.png

Baru kita lakuin Pull into current Using Rebase, insyaallah gakan ada conflict (karena commit-nya udah kita delete semua)

Setelah itu kita Cherry-Pick changes yang relevant untuk branch-b dari origin/branch-b (remote) atau backup/branch-b (local)

Done, biidznillah, no additional overhead to resolve conflict :yeay:

Screen Shot 2022-09-27 at 1.24.01 PM.png

Screen Shot 2022-09-27 at 1.24.27 PM.png


Ohya semua approach di atas butuh kita Force Push yah kalo udah, soalnya untuk nimpa changes yang ada di remote branch-b, misalkan khawatir ilang, better di backup dulu origin/branch-b-nya ke local branch, e.g:

Screen Shot 2022-09-27 at 10.23.36 AM.png

Screen Shot 2022-09-27 at 10.23.55 AM.png

Rest assure, karena udah di-backup, baru deh insyaaallah lebih pede buat di Force Push

QnA:

Jadi kita ga perlu rebase dong kalo gini?

Di semua approach mentioned above, itu tetep melakukan aktivitas rebase, tapi yang ditekankan lebih ke Drop Commit. Jadi Rebase itu ada banyak opsi sebenernya, misalkan:

pick 07c5abd Introduce OpenPGP and teach basic usage
pick de9b1eb Fix PostChecker::Post#urls
pick 3e7ee36 Hey kids, stop all the highlighting
pick fa20af3 git interactive rebase, squash, amend

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

ref: thoughtbot.com/blog/git-interactive-rebase-..

Karena problem yang di-raise itu lebih ke proses daunting pas resolving conflict, dan cara di atas lebih ke "quick" alternative buat nge-avoid process tadi dan nge-reduce potential human error

Git tools di Android Studio alhamdulillah udah smart banget, jadi kita bisa rely on them biidznillah.

That's TIL