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:

bash
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):

text
[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:

bash
git push

Output yang Dihasilkan:

text
To /home/z/my-project/tutorial-extracted/work/sandbox/proyek-git/proyek-03/kolaborasi-kas/budi/../pusat-kas.git
   ae8e469..c7999c4  main -> main

Push 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:

bash
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):

text
[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:

bash
git push

Output yang Dihasilkan:

text
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:

bash
git fetch origin

Output yang Dihasilkan:

text
From /home/z/my-project/tutorial-extracted/work/sandbox/proyek-git/proyek-03/kolaborasi-kas/siti/../pusat-kas
   ae8e469..c7999c4  main       -> origin/main

origin/main di clone Siti kini menunjuk c7999c4 — commit Budi sudah berada di genggamannya. Saatnya menggabungkan:

bash
git merge origin/main

Output yang Dihasilkan:

text
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:

bash
git status

Output yang Dihasilkan:

text
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:

bash
cat README.md

Output yang Dihasilkan:

text
# 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 transaksi

Tiga 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:

text
# 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 transaksi

Seluruh 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:

bash
git add README.md
git commit --no-edit

Output yang Dihasilkan:

text
[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:

bash
git push

Output yang Dihasilkan:

text
To /home/z/my-project/tutorial-extracted/work/sandbox/proyek-git/proyek-03/kolaborasi-kas/siti/../pusat-kas.git
   c7999c4..c27773b  main -> main

Penerimaan 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:

bash
git pull

Output yang Dihasilkan:

text
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:

bash
git log --oneline --graph --decorate

Output yang Dihasilkan (di clone Budi):

text
*   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 v1

Output yang Dihasilkan (di clone Siti):

text
*   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 v1

Enam 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 .