Siklus giliran di Bagian 2 mulus karena para kontributornya sopan bergantian. Bagian ini menyelidiki apa yang terjadi bila keduanya bekerja bersamaan: Budi dan Siti menyunting paragraf yang sama pada README.md dari titik commit yang sama, Budi push lebih dulu, dan push Siti ditolak mentah-mentah oleh pusat. Penolakan seperti ini adalah pengalaman universal setiap orang yang berkolaborasi di Git — dan penyelesaiannya justru menjadi momen paling mendidik dalam proyek ini: fetch, konflik, urai bersama, kirim ulang.
Reproduksi: Dua Suntingan dari Titik yang Sama #
Kondisi awal: kedua clone sejajar di commit ae8e469. Budi membuka budi/kas dan memperjelas paragraf deskripsi README — sasarannya pemilik warung kecil:
cat > README.md <<'EOF'
# Aplikasi Kas
Kas warung sederhana berbasis teks untuk warung kecil —
latihan kolaborasi untuk Course Git Proyek 03.
## Struktur
- `src/app.txt` — isi aplikasi kas
## Cara Pakai
Tambahkan baris transaksi pada `src/app.txt` dengan format
tanggal — keterangan: jumlah.
## Kontributor
- Budi Santoso — perintis aplikasi
- Siti Rahma — fitur transaksi
EOF
git add README.md
git commit -m "Perjelas sasaran aplikasi pada README"Output yang Dihasilkan (perintah git commit):
[main c7999c4] Perjelas sasaran aplikasi pada README
1 file changed, 2 insertions(+), 2 deletions(-)Budi belum menarik apa pun dari pusat, jadi push-nya berangkat dari posisi terakhir yang ia ketahui:
git pushOutput yang Dihasilkan:
To /home/z/my-project/tutorial-extracted/work/sandbox/proyek-git/proyek-03/kolaborasi-kas/budi/../pusat-kas.git
ae8e469..c7999c4 main -> mainPush Budi lulus — pusat kini berada di c7999c4. Sementara itu, tanpa sepengetahuan Budi, Siti sedang menyunting paragraf yang sama dengan isi berbeda — ia menegaskan jumlah kontributor. Dari siti/kas:
cat > README.md <<'EOF'
# Aplikasi Kas
Kas warung sederhana berbasis teks — latihan kolaborasi
dua kontributor untuk Course Git Proyek 03.
## Struktur
- `src/app.txt` — isi aplikasi kas
## Cara Pakai
Tambahkan baris transaksi pada `src/app.txt` dengan format
tanggal — keterangan: jumlah.
## Kontributor
- Budi Santoso — perintis aplikasi
- Siti Rahma — fitur transaksi
EOF
git add README.md
git -c user.name="Siti Rahma" -c user.email="[email protected]" commit -m "Sebutkan dua kontributor pada README"Output yang Dihasilkan (perintah git commit):
[main d8f1081] Sebutkan dua kontributor pada README
1 file changed, 1 insertion(+), 1 deletion(-)Riwayat Siti kini memuat commit yang tidak dimiliki pusat — dan sebaliknya. Giliran push-nya tiba:
git pushOutput yang Dihasilkan:
To /home/z/my-project/tutorial-extracted/work/sandbox/proyek-git/proyek-03/kolaborasi-kas/siti/../pusat-kas.git
! [rejected] main -> main (fetch first)
error: failed to push some refs to '/home/z/my-project/tutorial-extracted/work/sandbox/proyek-git/proyek-03/kolaborasi-kas/siti/../pusat-kas.git'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally. This is usually caused by another repository pushing to
hint: the same ref. If you want to integrate the remote changes, use
hint: 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.Push gagal dengan kode keluar 1 — tidak ada setengah terkirim; main di pusat tidak bergeser sedikit pun.
Membaca Pesan Penolakan #
Inti penolakan ada di baris ! [rejected] main -> main (fetch first): pusat memegang commit c7999c4 milik Budi yang tidak dimiliki Siti, dan menggeser main ke d8f1081 tanpa memuat commit Budi akan menguburnya dari jalur utama. Git menolak menebak, jadi ia menolak seluruh permintaan — diagnosis lengkapnya dibedah di Push Rejected
dan alasannya di Non-Fast-Forward Push
.
Empat baris hint: adalah panduan jujur yang layak dibaca pelan-pelan: penolakan seperti ini biasanya terjadi karena repository lain mendorong ke penunjuk yang sama, dan jalan keluarnya adalah menggabungkan perubahan remote — git pull — sebelum push ulang. Rujukan git push --help pada hint terakhir terbaca penuh di dokumentasi git push
.
Penyelesaian Siti: fetch, merge, konflik #
Siti mengikuti hint — tarik dulu, jangan tebak. Fetch memperlihatkan apa yang sebenarnya terjadi di pusat:
git fetch originOutput yang Dihasilkan:
From /home/z/my-project/tutorial-extracted/work/sandbox/proyek-git/proyek-03/kolaborasi-kas/siti/../pusat-kas
ae8e469..c7999c4 main -> origin/mainorigin/main di clone Siti kini menunjuk c7999c4 — commit Budi sudah berada di genggamannya. Saatnya menggabungkan:
git merge origin/mainOutput yang Dihasilkan:
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.Kedua suntingan mendarat di paragraf yang sama, jadi Git menyerahkan keputusan kepada Siti. Status menunjukkan daerah yang harus diurai:
git statusOutput yang Dihasilkan:
On branch main
Your branch and 'origin/main' have diverged,
and have 1 and 1 different commits each, respectively.
(use "git pull" if you want to integrate the remote branch with yours)
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: README.md
no changes added to commit (use "git add" and/or "git commit -a")Isi berkasnya kini menyimpan kedua versi sekaligus, disekat penanda:
cat README.mdOutput yang Dihasilkan:
# Aplikasi Kas
<<<<<<< HEAD
Kas warung sederhana berbasis teks — latihan kolaborasi
dua kontributor untuk Course Git Proyek 03.
=======
Kas warung sederhana berbasis teks untuk warung kecil —
latihan kolaborasi untuk Course Git Proyek 03.
>>>>>>> origin/main
## Struktur
- `src/app.txt` — isi aplikasi kas
## Cara Pakai
Tambahkan baris transaksi pada `src/app.txt` dengan format
tanggal — keterangan: jumlah.
## Kontributor
- Budi Santoso — perintis aplikasi
- Siti Rahma — fitur transaksiTiga penanda itu membaca seperti notulen pertemuan. Sekatan <<<<<<< HEAD sampai ======= memuat versi Siti — pihak yang menjalankan merge; sekat ======= sampai >>>>>>> origin/main memuat versi Budi yang datang dari pusat; sisanya — Struktur, Cara Pakai, Kontributor — berada di luar daerah tabrakan dan sudah digabung otomatis. Ritual empat langkahnya sama dengan yang dibedah di Menyelesaikan Konflik Kolaborasi
: baca status, sunting berkas, git add, git commit.
Mengurai dan Menutup Konflik #
Langkah penyuntingan adalah keputusan, bukan mekanik. Kedua suntingan sama-sama bernilai — Budi menegaskan sasaran, Siti menegaskan jumlah kontributor — jadi resolusinya menggabungkan keduanya, bukan memenangkan salah satu. Sunting README.md di editor hingga berisinya:
# Aplikasi Kas
Kas warung sederhana berbasis teks untuk warung kecil —
latihan kolaborasi dua kontributor untuk Course Git Proyek 03.
## Struktur
- `src/app.txt` — isi aplikasi kas
## Cara Pakai
Tambahkan baris transaksi pada `src/app.txt` dengan format
tanggal — keterangan: jumlah.
## Kontributor
- Budi Santoso — perintis aplikasi
- Siti Rahma — fitur transaksiSeluruh penanda hilang, kedua gagasan bertahan. Tandai selesai, lalu lahirkan commit merge — --no-edit memakai pesan yang sudah Git siapkan di MERGE_MSG, tanpa membuka editor:
git add README.md
git commit --no-editOutput yang Dihasilkan:
[main c27773b] Merge remote-tracking branch 'origin/main'Satu baris itu adalah commit berparent dua: induk pertama commit Siti, induk kedua commit Budi. Push ulang kini berangkat dari posisi yang sudah memuat seluruh riwayat pusat:
git pushOutput yang Dihasilkan:
To /home/z/my-project/tutorial-extracted/work/sandbox/proyek-git/proyek-03/kolaborasi-kas/siti/../pusat-kas.git
c7999c4..c27773b main -> mainPenerimaan tanpa syarat — karena pusat tidak lagi punya commit yang tak dimiliki Siti.
Dua Clone, Satu Graf #
Budi menutup lingkaran dengan menarik hasil urai Siti, dari budi/kas:
git pullOutput yang Dihasilkan:
From /home/z/my-project/tutorial-extracted/work/sandbox/proyek-git/proyek-03/kolaborasi-kas/budi/../pusat-kas
c7999c4..c27773b main -> origin/main
Updating c7999c4..c27773b
Fast-forward
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)Kini tiga salinan sejajar kembali. Graf riwayatnya dibaca dari kedua clone:
git log --oneline --graph --decorateOutput yang Dihasilkan (di clone Budi):
* c27773b (HEAD -> main, origin/main) Merge remote-tracking branch 'origin/main'
|\
| * c7999c4 Perjelas sasaran aplikasi pada README
* | d8f1081 Sebutkan dua kontributor pada README
|/
* ae8e469 Tambah daftar kontributor
* 33144cd Tambah daftar transaksi harian
* 03322c3 Rintis aplikasi kas v1Output yang Dihasilkan (di clone Siti):
* c27773b (HEAD -> main, origin/main, origin/HEAD) Merge remote-tracking branch 'origin/main'
|\
| * c7999c4 Perjelas sasaran aplikasi pada README
* | d8f1081 Sebutkan dua kontributor pada README
|/
* ae8e469 Tambah daftar kontributor
* 33144cd Tambah daftar transaksi harian
* 03322c3 Rintis aplikasi kas v1Enam commit, bentuk percabangan, hingga posisi HEAD — semuanya identik. Satu-satunya beda hiasan: clone Siti menampilkan origin/HEAD, penunjuk default pusat yang ikut ter-salin saat clone. Pertabrakan dua suntingan tadi kini terbaca sebagai sejarah: dua jalur yang lahir dari ae8e469, kembali menyatu di gelembung c27773b.
Pelajaran bagian ini ringkas: kunci kolaborasi adalah tarik sebelum kirim — git pull (atau git fetch + git merge) sebelum setiap git push — dan ketika konflik muncul, kedua sisi diselesaikan bersama di satu commit yang mencatat keputusannya. Fitur berikutnya menaikkan levelnya: branch fitur dikerjakan berdua di dua clone sebelum digabungkan ke main — Bagian 4: Sinkronisasi Branch
.