<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Merge on kenji.blog</title><link>http://kenji.blog/id/tags/merge/</link><description>Recent content in Merge on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>id</language><copyright>kenjinote</copyright><lastBuildDate>Sun, 13 Sep 2026 09:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/id/tags/merge/index.xml" rel="self" type="application/rss+xml"/><item><title>【Perintah Git】Perbedaan antara rebase dan merge, serta penggunaan yang tepat dalam praktik</title><link>http://kenji.blog/id/p/git-rebase-vs-merge-practical-guide/</link><pubDate>Sun, 13 Sep 2026 09:00:00 +0900</pubDate><guid>http://kenji.blog/id/p/git-rebase-vs-merge-practical-guide/</guid><description>&lt;img src="http://kenji.blog/p/git-rebase-vs-merge-practical-guide/img/eyecatch.jpg" alt="Featured image of post 【Perintah Git】Perbedaan antara rebase dan merge, serta penggunaan yang tepat dalam praktik" />&lt;h1 id="1-pendahuluan-mengapa-merge-atau-rebase-menjadi-perdebatan-abadi">1. Pendahuluan: Mengapa &amp;ldquo;merge atau rebase&amp;rdquo; menjadi perdebatan abadi
&lt;/h1>&lt;p>Git adalah sistem pengontrol versi yang sangat penting dalam pengembangan perangkat lunak modern. Saat beberapa pengembang mengubah basis kode secara bersamaan, model cabang (branching) Git yang kuat akan sangat berguna. Namun, dalam pengembangan tim, perdebatan tentang &amp;ldquo;apakah harus menggunakan merge atau rebase&amp;rdquo; merupakan salah satu topik yang selalu membingungkan pengembang, mulai dari pemula hingga ahli.&lt;/p>
&lt;p>Artikel ini akan mengupas perbedaan mekanisme antara &lt;code>git merge&lt;/code> dan &lt;code>git rebase&lt;/code> secara mendalam, mulai dari struktur internal Git yaitu DAG (Directed Acyclic Graph) dan sifat matematis dari hash komit. Selain itu, artikel ini juga akan menjelaskan secara menyeluruh bagaimana cara menggunakan keduanya secara tepat dalam praktik, disertai dengan alur kerja (workflow) yang konkret. Dengan memahami tidak hanya sekadar pengenalan perintah, tetapi juga perhitungan apa yang dilakukan Git di balik layar, Anda akan menghilangkan ketakutan terhadap konflik dan mampu membangun riwayat yang bersih serta mudah dilacak.&lt;/p>
&lt;hr>
&lt;h1 id="2-struktur-internal-git-hash-komit-dan-model-objek">2. Struktur Internal Git: Hash Komit dan Model Objek
&lt;/h1>&lt;p>Untuk memahami bagaimana Git mengintegrasikan riwayat, pertama-tama kita perlu mengetahui bagaimana Git menyimpan data. Git tidak sekadar menyimpan perbedaan (patch) dari perubahan file, melainkan menyimpan cuplikan (snapshot) dari seluruh sistem file pada suatu titik waktu.&lt;/p>
&lt;h2 id="21-sifat-kriptografi-dari-hash-komit">2.1 Sifat Kriptografi dari Hash Komit
&lt;/h2>&lt;p>Setiap komit Git diidentifikasi secara unik dengan 40 digit heksadesimal yang dihasilkan oleh fungsi hash SHA-1 (Secure Hash Algorithm 1) berdasarkan isinya. Objek komit terdiri dari elemen-elemen berikut:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Pointer ke objek Tree&lt;/strong>: Cuplikan struktur direktori dan file (Blob) pada saat itu.&lt;/li>
&lt;li>&lt;strong>Pointer ke komit induk (parent)&lt;/strong>: Nilai hash dari satu atau lebih komit induk (komit pertama tidak memiliki induk, sedangkan komit merge memiliki dua induk atau lebih).&lt;/li>
&lt;li>&lt;strong>Informasi pembuat (Author)&lt;/strong>: Orang yang menulis kode beserta tanggal dan waktunya.&lt;/li>
&lt;li>&lt;strong>Informasi committer (Committer)&lt;/strong>: Orang yang membuat/menerapkan komit beserta tanggal dan waktunya.&lt;/li>
&lt;li>&lt;strong>Pesan komit&lt;/strong>: Teks yang menjelaskan maksud perubahan.&lt;/li>
&lt;/ol>
&lt;p>Secara matematis, nilai hash $H(C)$ untuk objek komit $C$ didefinisikan sebagai berikut:&lt;/p>
$$
H(C) = \text{SHA-1}( \text{tree} \parallel \text{parent} \parallel \text{author} \parallel \text{committer} \parallel \text{message} )
$$&lt;p>Di sini, $\parallel$ merepresentasikan penggabungan data. Karena karakteristik fungsi hash, meskipun hanya mengubah satu karakter pada pesan komit, atau jika komit induknya berbeda, nilai hash yang dihasilkan akan benar-benar berbeda. Artinya, &lt;strong>komit bersifat tidak dapat diubah (Immutable)&lt;/strong>. Alasan mengapa &lt;code>rebase&lt;/code> yang akan dibahas nanti sering disebut &amp;ldquo;menulis ulang riwayat&amp;rdquo; sebenarnya adalah karena Git &amp;ldquo;membuat komit baru yang isinya mirip tetapi memiliki nilai hash yang berbeda&amp;rdquo;.&lt;/p>
&lt;p>Ukuran ruang hash adalah $2^{160}$, dan probabilitas $P$ terjadinya tabrakan (dua komit berbeda memiliki nilai hash yang sama) dapat diaproksimasi menggunakan teori Paradoks Ulang Tahun (Birthday Paradox) sebagai berikut ($n$ adalah jumlah komit):&lt;/p>
$$
P(\text{collision}) \approx 1 - \exp\left(-\frac{n^2}{2 \times 2^{160}}\right)
$$&lt;p>Probabilitas ini sangat rendah, sehingga secara praktis hampir tidak mungkin terjadi tabrakan hash komit pada Git.&lt;/p>
&lt;hr>
&lt;h1 id="3-teori-graf-dan-dag-model-matematis-riwayat-git">3. Teori Graf dan DAG: Model Matematis Riwayat Git
&lt;/h1>&lt;p>Riwayat komit Git dimodelkan sebagai &amp;ldquo;Directed Acyclic Graph (DAG)&amp;rdquo; dalam teori graf.&lt;/p>
&lt;h2 id="31-apa-itu-dag-directed-acyclic-graph">3.1 Apa itu DAG (Directed Acyclic Graph)?
&lt;/h2>&lt;p>Dalam graf $G = (V, E)$, $V$ adalah himpunan komit (simpul/vertex), dan $E$ adalah himpunan edge berarah yang menunjukkan hubungan induk-anak antar komit. Pada Git, arah edge menuju dari &amp;ldquo;komit anak ke komit induk&amp;rdquo;. Hal ini karena komit baru menyimpan pointer ke komit sebelumnya.&lt;/p>
&lt;pre class="mermaid">
graph BT
A[&amp;#34;Komit A (Awal)&amp;#34;]
B[&amp;#34;Komit B&amp;#34;]
C[&amp;#34;Komit C (Main)&amp;#34;]
D[&amp;#34;Komit D (Fitur)&amp;#34;]
E[&amp;#34;Komit E (Merge)&amp;#34;]
B --&amp;gt; A
C --&amp;gt; B
D --&amp;gt; B
E --&amp;gt; C
E --&amp;gt; D
&lt;/pre>
&lt;p>Fitur utama DAG adalah &amp;ldquo;tidak adanya siklus (putaran)&amp;rdquo;. Dengan ini, algoritma yang menelusuri riwayat komit tidak akan terjebak dalam loop tak terbatas, dan pasti akan mencapai titik akhir (komit awal).&lt;/p>
&lt;h2 id="32-topological-sort-dan-urutan-riwayat">3.2 Topological Sort dan Urutan Riwayat
&lt;/h2>&lt;p>Saat menampilkan riwayat menggunakan perintah &lt;code>git log&lt;/code>, DAG diurutkan sebagai daftar 1 dimensi menggunakan algoritma Topological Sort (Pengurutan Topologi). Untuk setiap edge berarah $u \to v$ dalam DAG ($u$ adalah anak dari $v$), daftar disusun sedemikian rupa sehingga $u$ selalu berada sebelum $v$.&lt;/p>
&lt;hr>
&lt;h1 id="4-mekanisme-dan-jenis-git-merge">4. Mekanisme dan Jenis git merge
&lt;/h1>&lt;p>Perintah paling dasar untuk mengintegrasikan perubahan pada cabang adalah &lt;code>git merge&lt;/code>. Namun, bergantung pada status saat ini, Git secara otomatis akan memilih strategi merge yang berbeda.&lt;/p>
&lt;h2 id="41-merge-fast-forward---ff">4.1 Merge Fast-Forward (&amp;ndash;ff)
&lt;/h2>&lt;p>Jika cabang tujuan integrasi (misalnya: &lt;code>main&lt;/code>) adalah leluhur langsung dari cabang sumber integrasi (misalnya: &lt;code>feature&lt;/code>), Git akan menjalankan merge &amp;ldquo;Fast-Forward&amp;rdquo;. Ini adalah operasi yang tidak membuat komit baru, melainkan hanya memajukan pointer cabang ke depan.&lt;/p>
&lt;pre class="mermaid">
gitGraph
commit id: &amp;#34;A&amp;#34;
commit id: &amp;#34;B&amp;#34;
branch feature
checkout feature
commit id: &amp;#34;C&amp;#34;
commit id: &amp;#34;D&amp;#34;
checkout main
merge feature
&lt;/pre>
&lt;p>Merge Fast-Forward menjaga riwayat tetap dalam satu garis lurus, namun memiliki kelemahan yaitu hilangnya konteks &amp;ldquo;kelompok komit mana yang digabungkan sebagai satu pengembangan fitur (feature)&amp;rdquo;.&lt;/p>
&lt;h2 id="42-merge-non-fast-forward---no-ff">4.2 Merge Non-Fast-Forward (&amp;ndash;no-ff)
&lt;/h2>&lt;p>Jika Anda secara eksplisit menentukan &lt;code>git merge --no-ff&lt;/code>, Git akan selalu membuat &amp;ldquo;komit merge&amp;rdquo; baru meskipun situasi tersebut memungkinkan Fast-Forward. Komit merge adalah komit khusus yang memiliki dua induk.&lt;/p>
&lt;pre class="mermaid">
gitGraph
commit id: &amp;#34;A&amp;#34;
commit id: &amp;#34;B&amp;#34;
branch feature
checkout feature
commit id: &amp;#34;C&amp;#34;
commit id: &amp;#34;D&amp;#34;
checkout main
commit id: &amp;#34;Main Work 1&amp;#34;
merge feature type: NORMAL
&lt;/pre>
&lt;p>Keuntungan dari metode ini adalah bahwa keberadaan dan riwayat cabang fitur tetap terekam dengan jelas pada DAG. Saat terjadi masalah, Anda dapat membatalkan (revert) seluruh fitur sekaligus dengan aman dengan menjalankan &lt;code>git revert -m 1 &amp;lt;hash komit merge&amp;gt;&lt;/code>.&lt;/p>
&lt;h2 id="43-algoritma-3-way-merge">4.3 Algoritma 3-Way Merge
&lt;/h2>&lt;p>Ketika cabang tujuan dan cabang sumber masing-masing memiliki komitnya sendiri, Git akan menjalankan 3-Way Merge (merge 3 arah). Pada saat ini, Git menelusuri DAG dan menemukan &amp;ldquo;leluhur umum (Lowest Common Ancestor, LCA)&amp;rdquo; dari kedua cabang tersebut.&lt;/p>
&lt;p>Kompleksitas perhitungan algoritma untuk menemukan LCA, $T_{\text{LCA}}$, dapat dieksekusi dalam waktu linear terhadap jumlah simpul $|V|$ dan jumlah edge $|E|$:&lt;/p>
$$
T_{\text{LCA}} = \mathcal{O}(|V| + |E|)
$$&lt;p>Git membandingkan tiga hal: &amp;ldquo;status LCA&amp;rdquo;, &amp;ldquo;status cabang saat ini&amp;rdquo;, dan &amp;ldquo;status cabang lawan&amp;rdquo;. Jika tidak ada konflik perubahan, Git secara otomatis akan menghasilkan komit merge.&lt;/p>
&lt;hr>
&lt;h1 id="5-mekanisme-git-rebase-dan-rekonstruksi-riwayat">5. Mekanisme git rebase dan Rekonstruksi Riwayat
&lt;/h1>&lt;p>Jika &lt;code>git merge&lt;/code> &amp;ldquo;mengintegrasikan&amp;rdquo; riwayat, maka &lt;code>git rebase&lt;/code> &amp;ldquo;merekonstruksi (memindahkan)&amp;rdquo; riwayat.&lt;/p>
&lt;h2 id="51-pergerakan-di-balik-rebase">5.1 Pergerakan di Balik Rebase
&lt;/h2>&lt;p>Operasi internal saat melakukan rebase pada cabang &lt;code>feature&lt;/code> ke cabang &lt;code>main&lt;/code> (&lt;code>git rebase main&lt;/code>) adalah sebagai berikut:&lt;/p>
&lt;ol>
&lt;li>Menemukan leluhur umum (LCA) antara cabang &lt;code>feature&lt;/code> dan cabang &lt;code>main&lt;/code>.&lt;/li>
&lt;li>Menyimpan sementara perbedaan komit dari LCA hingga ujung cabang &lt;code>feature&lt;/code>.&lt;/li>
&lt;li>Memindahkan pointer cabang &lt;code>feature&lt;/code> ke ujung cabang &lt;code>main&lt;/code>.&lt;/li>
&lt;li>Menerapkan (Cherry-Pick) perbedaan yang disimpan tadi satu per satu secara berurutan ke atas base baru (ujung &lt;code>main&lt;/code>), dan membuat komit baru.&lt;/li>
&lt;/ol>
&lt;pre class="mermaid">
graph TD
A[&amp;#34;Komit A&amp;#34;] --&amp;gt; B[&amp;#34;Komit B&amp;#34;]
B --&amp;gt; C[&amp;#34;Komit C (Main)&amp;#34;]
B --&amp;gt; D[&amp;#34;Komit D (Fitur Lama)&amp;#34;]
D -.-&amp;gt; E[&amp;#34;Komit D&amp;#39; (Fitur Baru)&amp;#34;]
C --&amp;gt; E
style D stroke-dasharray: 5 5, fill: #f9f9f9, color: #999
&lt;/pre>
&lt;p>Hal penting di sini adalah komit yang dihasilkan oleh rebase $D'$ memiliki &lt;strong>induk komit yang berbeda dari komit aslinya $D$, sehingga memiliki nilai hash yang benar-benar berbeda&lt;/strong> (merujuk pada definisi fungsi hash $H(C)$ yang disebutkan sebelumnya).&lt;/p>
&lt;h2 id="52-rebase-interaktif-interactive-rebase">5.2 Rebase Interaktif (Interactive Rebase)
&lt;/h2>&lt;p>Dengan menggunakan &lt;code>git rebase -i&lt;/code> (atau &lt;code>--interactive&lt;/code>), Anda dapat memanipulasi riwayat komit sesuka hati. Ini adalah alat paling ampuh untuk merapikan riwayat lokal.&lt;/p>
&lt;ul>
&lt;li>&lt;code>pick&lt;/code> : Menerima komit apa adanya&lt;/li>
&lt;li>&lt;code>reword&lt;/code> : Hanya mengubah pesan komit&lt;/li>
&lt;li>&lt;code>edit&lt;/code> : Menjeda untuk memodifikasi isi komit&lt;/li>
&lt;li>&lt;code>squash&lt;/code> : Menggabungkan komit ini dengan komit sebelumnya, dan juga menggabungkan pesannya&lt;/li>
&lt;li>&lt;code>fixup&lt;/code> : Sama seperti &lt;code>squash&lt;/code>, tetapi membuang pesan dari komit ini&lt;/li>
&lt;li>&lt;code>drop&lt;/code> : Menghapus komit sepenuhnya&lt;/li>
&lt;/ul>
&lt;p>Secara matematis, jika sebuah cabang memiliki $N$ komit, variasi (permutasi) riwayat linear $P$ yang dapat dihasilkan dengan mengubah urutan rebase adalah sebagai berikut:&lt;/p>
$$
P = N!
$$&lt;p>Git memberikan $N!$ macam kebebasan kepada pengembang, memungkinkan mereka untuk menjaga riwayat dalam kondisi yang logis dan indah.&lt;/p>
&lt;hr>
&lt;h1 id="6-aturan-emas-rebase-the-golden-rule-of-rebase">6. Aturan Emas Rebase (The Golden Rule of Rebase)
&lt;/h1>&lt;p>&lt;code>rebase&lt;/code> sangatlah kuat, namun terdapat satu aturan mutlak.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>&amp;ldquo;Jangan pernah melakukan rebase pada riwayat publik yang telah dibagikan.&amp;rdquo;&lt;/strong>
&lt;em>(Never rebase public history)&lt;/em>&lt;/p>
&lt;/blockquote>
&lt;h2 id="61-mengapa-kita-tidak-boleh-melakukan-rebase-pada-riwayat-publik">6.1 Mengapa Kita Tidak Boleh Melakukan Rebase pada Riwayat Publik?
&lt;/h2>&lt;p>Git bersifat terdistribusi. Komit yang Anda dorong (push) ke &lt;code>origin/main&lt;/code> juga di-kloning (disalin) ke repositori lokal milik pengembang lain. Jika Anda merebase komit yang sudah di-push untuk menulis ulang riwayat, dan memaksakan penimpaan dengan &lt;code>git push --force&lt;/code>, apa yang akan terjadi?&lt;/p>
&lt;p>DAG lokal milik pengembang lain dan DAG jarak jauh (remote) akan bercabang secara mendasar. Ketika pengembang lain menjalankan &lt;code>git pull&lt;/code>, Git akan mencoba memaksa penggabungan sekelompok komit yang memiliki sejarah berbeda. Hal ini akan menyebabkan banyak konflik dan komit duplikat (komit dengan perubahan yang sama tetapi hash yang berbeda), sehingga membuat repositori menjadi berantakan.&lt;/p>
&lt;p>Aturan emasnya adalah rebase &lt;strong>hanya boleh dilakukan pada &amp;ldquo;cabang lokal yang belum dibagikan kepada siapa pun&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h1 id="7-penyelesaian-konflik-dan-git-rebase---continue">7. Penyelesaian Konflik dan git rebase &amp;ndash;continue
&lt;/h1>&lt;p>Ketika beberapa orang mengubah bagian yang sama dari file yang sama, konflik akan terjadi. Proses penyelesaian konflik antara &lt;code>merge&lt;/code> dan &lt;code>rebase&lt;/code> berbeda.&lt;/p>
&lt;h2 id="71-penyelesaian-konflik-pada-merge">7.1 Penyelesaian Konflik pada Merge
&lt;/h2>&lt;p>Pada &lt;code>git merge&lt;/code>, penyelesaian konflik hanya terjadi &lt;strong>satu kali&lt;/strong>. Sesaat sebelum membuat komit merge akhir, Anda memperbaiki semua bagian yang konflik sekaligus.&lt;/p>
&lt;h2 id="72-penyelesaian-konflik-pada-rebase">7.2 Penyelesaian Konflik pada Rebase
&lt;/h2>&lt;p>Pada &lt;code>git rebase&lt;/code>, karena sifatnya yang menerapkan ulang komit satu per satu, ada kemungkinan &lt;strong>konflik terjadi pada setiap komit&lt;/strong>.&lt;/p>
&lt;p>Jika konflik terjadi selama rebase, Git akan menjeda prosesnya. Alur penyelesaiannya adalah sebagai berikut:&lt;/p>
&lt;ol>
&lt;li>Buka editor atau IDE (seperti VS Code) dan perbaiki penanda konflik (seperti &lt;code>&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/code>, &lt;code>======&lt;/code>, &lt;code>&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/code>) secara manual.&lt;/li>
&lt;li>Tambahkan file yang telah diperbaiki ke dalam indeks:
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git add &amp;lt;file yang diperbaiki&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/li>
&lt;li>Tanpa membuat komit baru, lanjutkan proses rebase:
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git rebase --continue
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>Jika Anda ingin membatalkan rebase itu sendiri dan kembali ke keadaan semula, jalankan perintah berikut:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git rebase --abort
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>（&lt;em>Jika penyelesaian konflik tidak diperlukan dan Anda ingin melewati komit tersebut, gunakan &lt;code>git rebase --skip&lt;/code>&lt;/em>)&lt;/p>
&lt;hr>
&lt;h1 id="8-penggunaan-yang-tepat-dalam-praktik-praktik-workflow">8. Penggunaan yang Tepat dalam Praktik (Praktik Workflow)
&lt;/h1>&lt;p>Lalu, bagaimana sebaiknya kita menggunakan &lt;code>merge&lt;/code> dan &lt;code>rebase&lt;/code> dalam praktik pengembangan yang sebenarnya? Di sini kita akan memperkenalkan pendekatan yang paling standar dan aman.&lt;/p>
&lt;h2 id="81-skenario-1-merapikan-riwayat-pekerjaan-lokal-menggunakan-rebase">8.1 【Skenario 1】 Merapikan Riwayat Pekerjaan Lokal (Menggunakan Rebase)
&lt;/h2>&lt;p>Misalkan saat mengembangkan di cabang fitur, banyak komit kecil menumpuk (seperti &amp;ldquo;Perbaikan typo&amp;rdquo; atau &amp;ldquo;Simpan sementara&amp;rdquo;). Sebelum membuat Pull Request (PR), gunakan rebase interaktif untuk merapikannya ke dalam unit-unit yang bermakna.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Jalankan saat berada di cabang feature&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git rebase -i HEAD~5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># (Editor akan terbuka, gunakan squash atau fixup untuk membersihkan riwayat)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Dengan melakukan ini, Anda dapat membuat riwayat komit yang indah dan maksudnya mudah dipahami oleh pengulas (reviewer).&lt;/p>
&lt;h2 id="82-skenario-2-mengikuti-pembaruan-cabang-main-terbaru-menggunakan-rebase">8.2 【Skenario 2】 Mengikuti Pembaruan Cabang main Terbaru (Menggunakan Rebase)
&lt;/h2>&lt;p>Jika pengembangan memakan waktu lama dan perubahan dari orang lain terus menerus di-merge ke cabang &lt;code>main&lt;/code>, cabang &lt;code>feature&lt;/code> milik Anda akan menjadi usang. Dalam kasus ini, lakukan rebase cabang &lt;code>feature&lt;/code> Anda ke cabang &lt;code>main&lt;/code> terbaru agar tetap sinkron.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Dapatkan informasi terbaru dari main&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git fetch origin
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Pindahkan cabang feature ke atas main terbaru&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git rebase origin/main
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Dengan cara ini, riwayat menjadi satu garis lurus dan dapat mencegah konflik pada merge selanjutnya. Selain itu, Anda juga mencegah pembuatan komit merge yang tidak perlu (seperti &amp;ldquo;Merge branch &amp;lsquo;main&amp;rsquo; into feature&amp;rdquo;).&lt;/p>
&lt;h2 id="83-skenario-3-mengintegrasikan-fitur-yang-telah-selesai-menggunakan-merge">8.3 【Skenario 3】 Mengintegrasikan Fitur yang Telah Selesai (Menggunakan Merge)
&lt;/h2>&lt;p>Pengembangan pada cabang &lt;code>feature&lt;/code> telah selesai, dan sekarang saatnya memasuki fase integrasi ke cabang &lt;code>main&lt;/code>. Di sini kita menggunakan &lt;strong>&lt;code>git merge --no-ff&lt;/code>&lt;/strong> (sama seperti memilih &amp;ldquo;Create a merge commit&amp;rdquo; di Pull Request pada GitHub, dll.).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git checkout main
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git merge --no-ff feature -m &lt;span class="s2">&amp;#34;Merge feature: Implementasi fitur login pengguna&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git push origin main
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Dengan ini, sebuah titik sejarah (komit merge) yang menunjukkan &amp;ldquo;satu fitur digabungkan di sini&amp;rdquo; akan tertinggal pada DAG cabang &lt;code>main&lt;/code>. Saat Anda melihat riwayat di kemudian hari, akan lebih mudah untuk menelusuri kode berdasarkan unit fitur.&lt;/p>
&lt;hr>
&lt;h1 id="9-kesimpulan-ringkasan">9. Kesimpulan (Ringkasan)
&lt;/h1>&lt;p>Dalam pengoperasian Git, pendekatan ekstrem seperti &amp;ldquo;selesaikan semuanya dengan Merge&amp;rdquo; atau &amp;ldquo;buat semuanya lurus dengan Rebase&amp;rdquo; masing-masing memiliki kelebihan dan kekurangan.&lt;/p>
&lt;p>Praktik terbaik (best practice) dalam bekerja adalah pendekatan hibrida: &lt;strong>&amp;ldquo;Rapikan riwayat pribadi lokal dengan rebase, dan pertahankan konteks riwayat integrasi publik menggunakan merge &amp;ndash;no-ff.&amp;rdquo;&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Lokal (Ruang Kerja Pribadi)&lt;/strong>: Gunakan &lt;code>rebase&lt;/code> untuk membuang komit yang tidak perlu dan mengikuti mainline terbaru agar riwayat tetap lurus.&lt;/li>
&lt;li>&lt;strong>Global (Ruang Kerja Bersama)&lt;/strong>: Gunakan &lt;code>merge --no-ff&lt;/code> untuk mencatat keberadaan cabang fitur sebagai komit merge pada DAG, sehingga memudahkan revert dan pelacakan.&lt;/li>
&lt;/ul>
&lt;p>Dengan memahami latar belakang matematis dan arsitektural, seperti struktur DAG dan mekanisme fungsi hash, perintah Git akan meningkat dari sekadar hafalan menjadi &amp;ldquo;desain riwayat yang memiliki tujuan&amp;rdquo;. Sambil mematuhi aturan emas rebase, pilihlah perintah yang paling tepat sesuai situasi untuk membangun riwayat komit yang bersih, mudah dibaca, dan mudah dipelihara bagi seluruh tim.&lt;/p></description></item></channel></rss>