Membuat branch itu murah, tetapi branch belum terasa berguna sampai kita benar-benar berpindah ke sana dan bekerja. Perpindahan inilah momen di mana mental model “penunjuk” diuji: ketika HEAD berganti branch, isi working tree ditukar mengikuti commit yang ditunjuk — berkas muncul, hilang, atau berubah isinya. Ada pula aturan main untuk suntingan yang belum di-commit: sebagian dibawa ikut, sebagian membuat Git menolak perpindahan demi keselamatan pekerjaan. Chapter ini menguji kedua situasi itu secara nyata, termasuk menyalin pesan galat yang ditampilkan Git 2.47.3.

Working Tree Mengikuti Commit yang Ditunjuk #

Repository latihan memuat dua berkas di commit pertama, lalu branch fitur-opini menambahkan bagian Opini pada berita.md — satu berkas yang isi beda antar branch:

bash
mkdir latihan-pindah && cd latihan-pindah
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf '# Berita\nEdisi 1\n' > berita.md
printf 'Kontak: [email protected]\n' > kontak.md
git add berita.md kontak.md
git commit -m "Rilis edisi 1"
git switch -c fitur-opini
printf '# Berita\nEdisi 1\n\n## Opini\nKolom opini edisi 1\n' > berita.md
git add berita.md
git commit -m "Tambah kolom opini"
git switch main

Output yang Dihasilkan (perintah git switch main):

text
Switched to branch 'main'

Sekarang kita berdiri di main. Isi berita.md di sisi ini masih versi tanpa Opini:

bash
cat berita.md

Output yang Dihasilkan:

text
# Berita
Edisi 1

Pindah ke fitur-opini dan baca ulang berkas yang sama:

bash
git switch fitur-opini

Output yang Dihasilkan:

text
Switched to branch 'fitur-opini'
bash
cat berita.md

Output yang Dihasilkan:

text
# Berita
Edisi 1

## Opini
Kolom opini edisi 1

Berkas yang sama, path yang sama, isinya berganti — karena Git menukar seluruh snapshot working tree sesuai commit yang ditunjuk branch tujuan. Berlaku juga sebaliknya: berkas yang hanya ada di satu sisi akan hilang dan muncul kembali, dibuktikan nyata di chapter Branch dan Commit . Perhatikan pula kontak.md yang tidak disentuh di kedua branch — isinya identik di kedua sisi, dan kefaktaan ini penting untuk bagian berikutnya.

Suntingan yang Ikut Terbawa #

Kita kembali ke main lalu menyunting kontak.md tanpa staging atau commit:

bash
git switch main
printf 'Kontak: [email protected]\nRedaktur: Budi\n' > kontak.md
git switch fitur-opini

Output yang Dihasilkan (perintah git switch fitur-opini):

text
Switched to branch 'fitur-opini'
M	kontak.md

Perpindahan berhasil — dan Git mencetak dua baris. Baris pertama konfirmasi biasa; baris kedua, M diikuti nama berkas, adalah daftar suntingan yang ikut terbawa ke branch tujuan. Suntingan itu bukan milik branch mana pun selagi belum di-commit; Git membawanya menyusuri perpindahan karena menukar isi kontak.md tidak diperlukan — kedua branch menunjuk versi berkas yang identik. Status di fitur-opini mengonfirmasi:

bash
git status

Output yang Dihasilkan:

text
On branch fitur-opini
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   kontak.md

no changes added to commit (use "git add" and/or "git commit -a")
bash
git diff

Output yang Dihasilkan:

text
diff --git a/kontak.md b/kontak.md
index c0bcc5f..2ed755d 100644
--- a/kontak.md
+++ b/kontak.md
@@ -1 +1,2 @@
 Kontak: [email protected]
+Redaktur: Budi

Ketika Git Menolak: Tabrakan dengan Perubahan Lokal #

Perilaku berbeda terjadi ketika suntingan lokal menyentuh berkas yang beda isi antar branch. berita.md adalah kandidatnya. Kita sunting di main tanpa commit, lalu coba pindah:

bash
git switch main
printf '# Berita\nEdisi 1\nSuntingan liar di main\n' > berita.md
git switch fitur-opini

Output yang Dihasilkan (perintah git switch fitur-opini):

text
error: Your local changes to the following files would be overwritten by checkout:
	berita.md
Please commit your changes or stash them before you switch branches.
Aborting

Perintah gagal dan Git menolak keras: error: Your local changes to the following files would be overwritten by checkout: diikuti nama berita.md, lalu saran resmi “Please commit your changes or stash them before you switch branches.” dan penutup Aborting. Penyebabnya lugas — pindah ke fitur-opini menuntut Git menukar berita.md menjadi versi berisi kolom Opini, padahal suntingan lokal kita belum tercatat di mana pun. Melakukan penukaran berarti menghapus pekerjaan yang belum tersimpan, jadi Git memilih berhenti dan menyerahkan keputusan kepada kita.

Pesan ini menyebut kata checkout meski perintahnya git switch — keduanya berbagi mesin internal yang sama, warisan sejarah yang dibahas di chapter git checkout .

Tiga Jalan Keluar #

Saran Git sendiri mengarah ke tiga pilihan, dan pilihan mana yang tepat bergantung pada nilai suntingannya:

Jalan keluarPerintahKapan dipakai
Catat di branch sekaranggit add + git commitSuntingan memang selesai dan layak disimpan
Simpan sementara di luar branchgit stashSuntingan belum selesai, ingin dipindah nanti
Buang permanengit restore berita.mdSuntingan salah arah dan tidak bernilai

Untuk latihan ini suntingan memang ceroboh, jadi kita buang dengan git restore — perilaku restore yang sama dengan chapter Membuang Perubahan Lokal — lalu ulangi perpindahan:

bash
git restore berita.md
git switch fitur-opini

Output yang Dihasilkan (perintah git switch fitur-opini):

text
Switched to branch 'fitur-opini'
M	kontak.md

Perpindahan kini lancar: berkas tidak lagi menabrak, dan working tree tertukar mulus ke versi fitur-opini. Pola “Git menolak, kita putuskan, baru pindah” ini akan berulang sepanjang hidup branch — bukan gangguan, melainkan rem keselamatan yang bekerja.

Perintah git switch yang kita pakai sepanjang chapter ini baru berumur relatif pendek. Sebelumnya ada git checkout yang sama sekali berbeda karakter — serba bisa tapi mudah salah paham. Chapter berikutnya mengulas git switch secara utuh: kelahirannya, variannya, dan satu pintu daruratnya yang perlu diperlakukan dengan hormat: git switch .