Kolaborasi Git tidak memerlukan server mahal untuk bisa dipelajari. Cukup satu folder bare repository yang berperan sebagai titik temu, ditambah dua clone milik dua kontributor — dan semua mekanisme push, fetch, serta konflik yang muncul di GitHub bekerja persis sama di atasnya. Bagian ini memasang tiga bagian panggung itu: pusat pusat-kas.git, clone Budi yang merintis aplikasi kas, dan clone Siti yang membuktikan riwayat bisa menyebar sendirian.
Menyiapkan Repository Pusat #
Repository pusat dibuat dengan opsi --bare. Mulai dari folder kerja kosong, buat folder panggung sekaligus pusatnya:
mkdir kolaborasi-kas && cd kolaborasi-kas
git init --bare pusat-kas.gitOutput yang Dihasilkan:
Initialized empty Git repository in /home/z/my-project/tutorial-extracted/work/sandbox/proyek-git/proyek-03/kolaborasi-kas/pusat-kas.git/Kata bare berarti telanjang: repository ini tidak punya working tree untuk disunting. Isinya persis isi folder .git pada repository biasa — boleh diperiksa langsung:
ls pusat-kas.gitOutput yang Dihasilkan:
HEAD
branches
config
description
hooks
info
objects
refsDelapan entri itu adalah jeroan repository: objects/ menampung snapshot, refs/ menampung penunjuk branch, config berisi pengaturan. Yang tidak ada justru README.md, src/, atau berkas kerja lain — memang disengaja, karena tidak ada siapa pun yang menyunting berkas di server. Repository pusat hanya menjadi tempat bertukar commit, dan bentuk bare adalah konvensi untuknya; alasannya dibahas tuntas di Konsep Remote
. Server Git di dunia nyata — GitHub, GitLab, Bitbucket — menyimpan repository dalam bentuk yang serupa. Rujukan lengkap opsi --bare tersedia di dokumentasi git init
.
Clone Pertama dan Identitas Budi #
Gelar peran pertama: Budi. Kontributor meng-clone pusat ke folder kerjanya sendiri — perintah ini otomatis memasang remote bernama origin yang menunjuk ke pusat, perilaku yang dibedah di git clone
:
mkdir budi && cd budi
git clone ../pusat-kas.git kas
cd kas
git config user.name "Budi Santoso"
git config user.email "[email protected]"Output yang Dihasilkan (perintah git clone):
Cloning into 'kas'...
warning: You appear to have cloned an empty repository.
done.Peringatan itu bukan kegagalan. done. menandakan clone sukses; hanya saja pusat belum memuat satu commit pun, jadi tidak ada apa pun untuk disalin. Jalur remote disimpan sebagai ../pusat-kas.git — jalur relatif dari folder budi/, cukup jujur untuk dilatih tanpa jaringan. Identitas Budi dipasang lokal di repo ini tanpa --global, kebiasaan yang dijelaskan di Konfigurasi Identitas
.
Isi Awal dan Commit Rintisan #
Budi mengisi aplikasi kas versi 1 — satu README.md yang menjelaskan proyek dan satu src/app.txt sebagai isi aplikasinya:
mkdir src
printf '# Aplikasi Kas\n\nKas warung sederhana berbasis teks — latihan kolaborasi\nuntuk Course Git Proyek 03.\n\n## Struktur\n\n- `src/app.txt` — isi aplikasi kas\n' > README.md
printf 'Aplikasi Kas v1\n===============\n\nCatat pemasukan dan pengeluaran warung setiap hari.\n' > src/app.txt
cat src/app.txtOutput yang Dihasilkan (perintah cat):
Aplikasi Kas v1
===============
Catat pemasukan dan pengeluaran warung setiap hari.Periksa keadaan sebelum mencatat:
git statusOutput yang Dihasilkan:
On branch main
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md
src/
nothing added to commit but untracked files present (use "git add" to track)Kedua berkas masih untracked. Angkat semuanya ke staging area, lalu commit rintisan:
git add .
git commit -m "Rintis aplikasi kas v1"Output yang Dihasilkan:
[main (root-commit) 03322c3] Rintis aplikasi kas v1
2 files changed, 12 insertions(+)
create mode 100644 README.md
create mode 100644 src/app.txtTanda (root-commit) menandai commit pertama yang tidak punya parent. Hash 03322c3 akan berbeda di mesin kita — hash dipengaruhi isi, pesan, dan waktu pembuatan. Sejak commit ini, main di clone Budi berdiri sendiri; pusat masih kosong.
Push Pertama ke Pusat #
Commit Budi perlu dikirim agar rekan bisa menjangkaunya. Push pertama sekaligus memasang ikatan upstream dengan flag -u:
git push -u origin mainOutput yang Dihasilkan:
To /home/z/my-project/tutorial-extracted/work/sandbox/proyek-git/proyek-03/kolaborasi-kas/budi/../pusat-kas.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.Mari bedah tiga barisnya. Baris To ... menyebut tujuan — jalur relatif ../pusat-kas.git ditampilkan terurai dari posisi clone. Baris * [new branch] main -> main melaporkan kelahiran branch main di pusat, sejajar dengan milik Budi. Baris terakhir adalah kerja flag -u: main lokal diikat mengikuti origin/main, salinan penunjuk pusat milik clone — efek ikatan ini dibedah di Upstream Branch
. Sejak ikatan ini terpasang, git push polos sudah tahu harus ke mana.
Giliran Siti: Clone dan Bukti Riwayat Menyebar #
Sekarang giliran kontributor kedua. Dari folder budi/kas, naik dua tingkat ke panggung, buat folder Siti, lalu clone pusat yang sudah berisi:
cd ../..
mkdir siti && cd siti
git clone ../pusat-kas.git kas
cd kasOutput yang Dihasilkan (perintah git clone):
Cloning into 'kas'...
done.Perhatikan bedanya: tidak ada lagi peringatan repository kosong. Verifikasi dengan membaca riwayat:
git logOutput yang Dihasilkan:
commit 03322c3d7069bd87e7774b7df5e4146383cedf84
Author: Budi Santoso <[email protected]>
Date: Mon Nov 16 09:00:00 2026 +0700
Rintis aplikasi kas v1Inilah bukti riwayat menyebar: clone Siti memuat commit Budi lengkap dengan nama penulisnya, meskipun Siti tidak pernah bertanya langsung ke clone Budi. Pusuhan transfernya adalah pusat-kas.git — itulah tugas titik temu. Git yang terdistribusi menyalin riwayat utuh ke setiap clone, sehingga git log Siti, git log Budi, dan isi pusat kini menunjuk database commit yang sama. Inilah fondasi yang dipakai sepanjang proyek — tiga salinan yang saling bertukar lewat satu pintu:
Diagram itu dibaca dua arah: setiap kontributor mengirim pekerjaannya lewat panah push ke pusat, dan mengambil pekerjaan rekan lewat panah fetch atau pull. Kedua clone tidak pernah berhubungan langsung — semua pertukaran melewati pusat.
Panggung terpasang: satu pusat, dua clone, satu commit milik Budi yang sudah menyebar. Bagian berikutnya menghidupkan siklus kolaborasi — Siti mengirim fitur pertamanya, dan Budi menariknya sambil membuktikan bahwa git fetch tidak menyentuh branch lokal: Bagian 2: Push dan Fetch
.