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:
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 mainOutput yang Dihasilkan (perintah git switch main):
Switched to branch 'main'Sekarang kita berdiri di main. Isi berita.md di sisi ini masih versi tanpa Opini:
cat berita.mdOutput yang Dihasilkan:
# Berita
Edisi 1Pindah ke fitur-opini dan baca ulang berkas yang sama:
git switch fitur-opiniOutput yang Dihasilkan:
Switched to branch 'fitur-opini'cat berita.mdOutput yang Dihasilkan:
# Berita
Edisi 1
## Opini
Kolom opini edisi 1Berkas 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:
git switch main
printf 'Kontak: [email protected]\nRedaktur: Budi\n' > kontak.md
git switch fitur-opiniOutput yang Dihasilkan (perintah git switch fitur-opini):
Switched to branch 'fitur-opini'
M kontak.mdPerpindahan 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:
git statusOutput yang Dihasilkan:
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")git diffOutput yang Dihasilkan:
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: BudiKetika 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:
git switch main
printf '# Berita\nEdisi 1\nSuntingan liar di main\n' > berita.md
git switch fitur-opiniOutput yang Dihasilkan (perintah git switch fitur-opini):
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.
AbortingPerintah 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 keluar | Perintah | Kapan dipakai |
|---|---|---|
| Catat di branch sekarang | git add + git commit | Suntingan memang selesai dan layak disimpan |
| Simpan sementara di luar branch | git stash | Suntingan belum selesai, ingin dipindah nanti |
| Buang permanen | git restore berita.md | Suntingan 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:
git restore berita.md
git switch fitur-opiniOutput yang Dihasilkan (perintah git switch fitur-opini):
Switched to branch 'fitur-opini'
M kontak.mdPerpindahan 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
.