> ## Documentation Index
> Fetch the complete documentation index at: https://docs.skanesgalab.my.id/llms.txt
> Use this file to discover all available pages before exploring further.

# Operasi Lanjutan Git (Advanced)

> Praktek tingkat lanjut: rebase, stash, cherry-pick, reset vs revert, merge conflict resolution, dan git bisect.

Setelah menguasai alur kerja dasar (`add`, `commit`, `push`, `pull`), seorang DevOps engineer dan developer profesional wajib menguasai perintah tingkat lanjut untuk menangani skenario kolaborasi yang rumit.

***

## 1. Git Rebase (Merampingkan Riwayat Komit)

`git rebase` memindahkan titik pangkal branch fitur ke ujung commit terbaru branch `main`. Tujuannya adalah menghasilkan riwayat komit yang lurus, bersih, dan rapi tanpa banyak *merge commit* yang berantakan.

```bash theme={null}
# Berada di branch fitur kamu
git switch fitur-baru

# Rebase terhadap commit terbaru dari main
git rebase main
```

### Interactive Rebase (`git rebase -i`)

Digunakan untuk membersihkan, menggabungkan (*squash*), atau mengubah pesan commit sebelum digabung ke branch utama:

```bash theme={null}
# Mengedit 3 commit terakhir
git rebase -i HEAD~3
```

Editor teks akan terbuka dengan pilihan instruksi seperti:

* `pick`: Gunakan commit apa adanya.
* `reword`: Ubah pesan commit.
* `squash`: Gabungkan commit ini ke commit sebelumnya.
* `drop`: Hapus commit ini secara permanen.

***

## 2. Menyimpan Pekerjaan Sementara (`git stash`)

Sering kali saat kamu sedang mengedit kode di sebuah branch, tiba-tiba ada bug darurat di branch `main` yang harus segera kamu perbaiki. Kamu belum siap melakukan `commit` karena kodemu masih setengah jadi.

Gunakan **Git Stash** untuk menyimpan perubahan tersebut ke "laci penyimpanan rahasia":

```bash theme={null}
# Simpan perubahan yang belum di-commit dan bersihkan working directory
git stash push -m "setengah jalan bikin form pembayaran"

# Melihat daftar pekerjaan yang tersimpan di laci stash
git stash list

# Mengambil kembali perubahan terakhir dan menghapusnya dari stash
git stash pop

# Mengambil perubahan tanpa menghapusnya dari daftar stash
git stash apply stash@{0}

# Menghapus seluruh isi laci stash
git stash clear
```

***

## 3. Mengambil Komit Tertentu (`git cherry-pick`)

`git cherry-pick` memungkinkanmu memilih satu commit tertentu dari branch lain tanpa harus menggabungkan seluruh branch tersebut.

```bash theme={null}
# Ambil commit spesifik berdasarkan hash ID commit-nya
git cherry-pick 7a8b9c1
```

*Skenario umum: Rekan kerjamu membuat perbaikan bug penting di branch `fitur-eksperimen`, kamu hanya butuh perbaikan bug itu saja di branch `hotfix`.*

***

## 4. Membatalkan Perubahan: `git reset` vs `git revert`

Memahami perbedaan kedua perintah ini sangat krusial agar tidak menghapus riwayat tim secara tidak sengaja:

| Perintah | Cara Kerja | Kapan Digunakan |
| :- | :- | :- |
| **`git revert <commit_id>`** | Membuat commit BARU yang membalikkan efek dari commit lama. Riwayat tetap utuh. | **Aman untuk public / remote branch** yang sudah di-push ke GitHub. |
| **`git reset <commit_id>`** | Memundurkan penunjuk HEAD ke commit lama dan menghapus riwayat setelahnya. | Hanya aman untuk commit lokal di laptopmu yang **belum pernah di-push**. |

### Jenis-Jenis `git reset`:

```bash theme={null}
# Soft Reset: Memundurkan commit, perubahan file tetap berada di Staging Area
git reset --soft HEAD~1

# Mixed Reset (Default): Memundurkan commit & unstage file, file masih ada di Working Directory
git reset HEAD~1

# Hard Reset (BAHAYA!): Memundurkan commit dan MENGHAPUS seluruh perubahan file secara permanen
git reset --hard HEAD~1
```

***

## 5. Menangani Konflik Penggabungan (Merge Conflict)

Konflik terjadi ketika dua orang mengedit baris kode yang sama pada file yang sama di dua branch berbeda.

Saat terjadi konflik, Git akan menghentikan proses merge dan menambahkan tanda pembatas pada file:

```text theme={null}
<<<<<<< HEAD (Branch Saat Ini)
console.log("Port aplikasi: 8080");
=======
console.log("Port aplikasi: 3000");
>>>>>>> fitur-port (Branch yang Digabungkan)
```

### Cara Menyelesaikan:

1. Buka file yang berkonflik di editor kodemu (seperti VS Code).
2. Tentukan baris mana yang ingin dipertahankan dan hapus tanda pembatas (`<<<<<<<`, `=======`, `>>>>>>>`).
3. Tandai konflik telah selesai dan simpan perubahan:
   ```bash theme={null}
   git add file_yang_konflik.js
   git commit -m "fix: menyelesaikan merge conflict pada konfigurasi port"
   ```

***

## 6. Mencari Bug dengan `git bisect`

Jika aplikasimu tiba-tiba rusak dan kamu tidak tahu commit mana yang menyebabkannya di antara ratusan commit terakhir:

```bash theme={null}
# 1. Mulai proses pencarian biner
git bisect start

# 2. Tandai commit saat ini rusak (bad)
git bisect bad

# 3. Beri tahu commit versi berapa saat aplikasi masih berjalan lancar (good)
git bisect good v1.0.0

# 4. Git akan memindahkan HEAD ke titik tengah riwayat secara otomatis.
# Uji aplikasimu, lalu beri tahu Git hasilnya:
git bisect good  # (jika aman)
# atau
git bisect bad   # (jika rusak)

# Ulangi sampai Git menemukan commit persis yang menjadi biang kerok bug!
# 5. Selesai dan kembali ke posisi semula:
git bisect reset
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.