Chapter git clone
menutup dengan sebuah jejak misterius: clone kita tiba-tiba mengenal sebuah remote bernama origin, dan branch main lokal langsung terikat padanya. Saat bekerja sendirian, jejak itu tidak terasa manfaatnya — semua commit tersimpan rapi di folder .git kita sendiri. Namun begitu Siti perlu melihat pekerjaan Budi, atau begitu proyek harus selamat ketika laptop Budi rusak, satu salinan saja tidak lagi cukup. Section ini membahas bagaimana Git menjembatani salinan-salinan tersebut lewat konsep remote.
Remote adalah Salinan Repository di Lokasi Lain #
Remote adalah salinan repository Git yang berada di lokasi lain — di luar repository lokal tempat kita bekerja. Kata “lokasi lain” mencakup banyak bentuk: server hosting seperti GitHub, GitLab, atau Bitbucket; server internal di kantor; bahkan komputer seorang rekan satu tim. Bentuk yang paling sederhana untuk dipahami adalah bare repository — repository yang hanya berisi database riwayat Git, tanpa working tree untuk disunting.
Perlu kita luruskan satu anggapan umum: pada Git yang terdistribusi (baca kembali chapter Distributed Version Control
), remote bukanlah “pusat kebenaran wajib” yang harus selalu online. Setiap salinan membawa riwayat lengkap, sehingga commit, branch, dan git log tetap bekerja tanpa koneksi. Remote berperan sebagai titik temu — tempat para kontributor bertukar commit — bukan tuan yang memberi perintah. Karena itu pula, satu repository boleh punya lebih dari satu remote, dan sebuah remote bisa berupa server besar maupun folder di komputer sebelah.
Menyiapkan Titik Temu di Sandbox #
Seluruh demo pada section ini memakai remote lokal berupa bare repository — jujur sama seperti remote sungguhan di jaringan, hanya berupa folder di komputer kita sehingga bisa direproduksi tanpa akun dan tanpa jaringan. Pola pembuatannya tiga langkah: git init --bare, clone oleh tiap anggota tim, lalu push. Kita bangun repository pusat proyek-utama.git lalu Budi meng-clone-nya:
mkdir latihan-konsep && cd latihan-konsep
git init -b main --bare proyek-utama.git
git clone proyek-utama.git budi
cd budi
git config user.name "Budi Santoso"
git config user.email "[email protected]"Repository pusat masih kosong, dan Git memberi tahu kita secara terbuka:
Output yang Dihasilkan:
Cloning into 'budi'...
warning: You appear to have cloned an empty repository.
done.Budi kemudian membuat commit pertama dan mengirimkannya ke titik temu — perintah git push ini akan kita bedah tuntas pada chapter git push
:
printf '# Toko Budi\n' > README.md
git add README.md
git commit -m "Buat README toko"
git push -u origin mainOutput yang Dihasilkan:
To /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-a/latihan-konsep/proyek-utama.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.Baris * [new branch] memberitahu bahwa branch main baru saja lahir di remote; baris terakhir mencatat ikatan tracking yang terbentuk. Setelah pusat terisi, Siti tinggal meng-clone dengan perintah yang sama seperti yang sudah kita kenal. Kini ada tiga salinan penuh: milik Budi, milik Siti, dan titik temu di tengah.
Melihat Isi Remote dari dalam Clone #
Bagaimana wujud remote itu? Dari dalam clone Budi, daftar remote cukup pendek:
git remoteOutput yang Dihasilkan:
originSatu nama: origin — sumber clone kita, persis seperti yang diperkenalkan chapter git clone
. Alamat lengkapnya dilihat dengan flag -v:
git remote -vOutput yang Dihasilkan:
origin /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-a/latihan-konsep/proyek-utama.git (fetch)
origin /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-a/latihan-konsep/proyek-utama.git (push)Dua baris itu memuat nama, alamat, dan arah: fetch untuk mengambil, push untuk mengirim. Pada mesin pengujian, alamat remote berupa jalur folder lokal — pada kerja nyata posisinya digantikan URL seperti https://github.com/budi/toko-budi.git atau [email protected]:budi/toko-budi.git; jalur pada keluaran juga menyesuaikan lokasi direktori masing-masing. Adapun isi folder remote itu sendiri bisa kita intip dari luar clone:
ls ../proyek-utama.gitOutput yang Dihasilkan:
HEAD
branches
config
description
hooks
info
objects
refsTidak ada README.md di sana — hanya mesin Git: HEAD, config, objects, refs. Inilah bare repository: remote menyimpan database riwayat dan tidak menyunting berkas. Di terminal, ls biasa menampilkan daftar ini dalam beberapa kolom; keluaran di atas ditampilkan satu kolom karena ditangkap ke berkas.
Peta Pertukaran Perubahan #
Hubungan ketiga salinan di lab kita tergambar berikut ini:
Budi dan Siti masing-masing membawa branch main sendiri plus salinan penunjuk origin/main yang mengingat posisi main di titik temu sebagaimana terakhir diketahui — penunjuk salinan inilah yang disebut remote-tracking branch. Panah git push mengirim commit dari clone ke remote; panah git fetch mengambil posisi terbaru ke penunjuk salinan tanpa menyentuh branch lokal. Kedua arah ini dibedah satu per satu pada chapter git fetch
dan git push
, sedangkan cara Git mengikat main lokal dengan origin/main dibahas khusus pada chapter Upstream Branch
.
Nama-nama itu — remote, origin, tracking — sebenarnya bisa kita baca langsung dari posisi para branch. Berikut riwayat yang dilihat Budi dan Siti dari clone masing-masing:
git log --oneline --decorate --allOutput yang Dihasilkan (di clone budi):
2bd3e21 (HEAD -> main, origin/main) Buat README tokoOutput yang Dihasilkan (di clone siti):
2bd3e21 (HEAD -> main, origin/main, origin/HEAD) Buat README tokoDekorasi (HEAD -> main, origin/main) di clone Budi memperlihatkan dua penunjuk berimpit: branch lokal miliknya dan salinan posisi remote milik Git. Clone Siti memuat dekorasi tambahan origin/HEAD — penanda cabang bawaan remote yang ikut terbaca ketika repository sumber sudah berisi commit saat di-clone. Alur kerja terdistribusi seperti ini — termasuk alasan mengapa pola banyak remote sah secara desain — diuraikan lebih jauh di Pro Git: Distributed Workflows
.
Konsepnya sudah di tangan; sisanya perkakas. Chapter berikutnya memperkenalkan git remote — perintah untuk melihat, menambah, mengganti nama, dan menghapus salinan-salinan tempat kita bertukar commit.