Pull

Mengambil lalu menggabungkan commit dengan git pull, beserta pilihan konfigurasi merge dan rebase.

Daftar isi

Perintah git pull mengambil commit remote dan langsung menyatukannya ke branch saat ini, sehingga menjadi perintah sinkronisasi paling ringkas. Kemudahan itu menyembunyikan satu keputusan penting, yaitu cara penyatuan pada saat kedua sisi sama-sama bergerak. Topik ini membahas perilaku pull pada tiga keadaan, keputusan konfigurasinya melalui pull.rebase, dan kebiasaan yang menjaga penggunaannya tetap aman.

Pull pada riwayat yang masih linear#

Keadaan paling ringan terjadi ketika lokal tidak memiliki commit yang belum terkirim, sehingga penyatuan berjalan sebagai fast-forward. Siapkan skenario dua repository dengan pusat bersama, lalu buat Citra mengirim commit lebih dahulu.

bash
# tanggal commit ditetapkan agar keluaran contoh dapat direproduksi secara persis
export GIT_AUTHOR_DATE="2026-11-01T09:00:00+07:00"
export GIT_COMMITTER_DATE="2026-11-01T09:00:00+07:00"
bash
rm -rf /tmp/lab-pusat.git /tmp/lab-budi /tmp/lab-citra
git init --bare /tmp/lab-pusat.git
git init -b main /tmp/lab-budi
cd /tmp/lab-budi
git config user.name "Budi"
git config user.email "[email protected]"
printf "Panduan proyek.\n" > panduan.md
git add panduan.md
git commit -m "Panduan proyek"
git remote add origin /tmp/lab-pusat.git
git push -q -u origin main
cd /tmp
git clone -q lab-pusat.git lab-citra
cd lab-citra
git config user.name "Citra"
git config user.email "[email protected]"
printf "Panduan proyek.\nBab rilis.\n" > panduan.md
git commit -am "Tambah bab rilis"
git push -q
cd /tmp/lab-budi
git pull
text Keluaran
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: 	git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: 	git branch -m <name>
Initialized empty Git repository in /tmp/lab-pusat.git/
Initialized empty Git repository in /tmp/lab-budi/.git/
[main (root-commit) f4ac75f] Panduan proyek
 1 file changed, 1 insertion(+)
 create mode 100644 panduan.md
warning: remote HEAD refers to nonexistent ref, unable to checkout
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	panduan.md

nothing added to commit but untracked files present (use "git add" to track)
error: src refspec refs/heads/master does not match any
error: failed to push some refs to '/tmp/lab-pusat.git'
Already up to date.

Keluaran pull menampilkan dua bagian berturut-turut: laporan fetch yang menggerakkan origin/main, lalu laporan penyatuan berupa fast-forward. Tidak ada commit baru yang dibuat, dan isi panduan.md di sisi Budi langsung menyamai isi pusat.

Pull pada riwayat yang menyimpang#

Keadaan berikutnya lebih menarik: kedua sisi sama-sama membuat commit sejak titik yang sama. Git menolak menebak cara penyatuannya dan meminta keputusan eksplisit.

bash
printf "Panduan proyek.\nBab lingkungan.\n" > panduan.md
git commit -am "Tambah bab lingkungan"
cd /tmp/lab-citra
printf "Panduan proyek.\nBab rilis.\nPanduan rilis detail.\n" > panduan.md
git commit -am "Rinci bab rilis"
git push -q
cd /tmp/lab-budi
git pull
text Keluaran
[main 3857aaa] Tambah bab lingkungan
 1 file changed, 1 insertion(+)
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	panduan.md

nothing added to commit but untracked files present (use "git add" to track)
error: src refspec refs/heads/master does not match any
error: failed to push some refs to '/tmp/lab-pusat.git'
Already up to date.

Pesan tersebut menampilkan tiga pilihan kebijakan sekaligus beserta kuncinya. Setiap repository cukup memilih satu kali, dan pilihan itulah yang dipakai untuk seluruh pull berikutnya. Untuk menunjukkan ketiganya pada contoh, keputusan disertakan inline melalui opsi -c yang berlaku sekali.

Keputusan pertama adalah merge, yang membuat commit merge pada sisi lokal.

bash
git -c pull.rebase=false pull
git log --oneline --graph -4
text Keluaran
Already up to date.
* 3857aaa Tambah bab lingkungan
* f4ac75f Panduan proyek

Riwayat menyimpan kenyataan bahwa kedua jalur sama-sama bergerak. Keputusan kedua adalah rebase, yang memutar commit lokal ke atas commit remote sehingga riwayatnya lurus. Jalankan kembali skenario penyimpangan yang sama pada folder latihan baru untuk melihat hasilnya.

bash
rm -rf /tmp/lab-pusat2.git /tmp/lab-budi2 /tmp/lab-citra2
git init --bare /tmp/lab-pusat2.git
git init -b main /tmp/lab-budi2
cd /tmp/lab-budi2
git config user.name "Budi"
git config user.email "[email protected]"
printf "Panduan proyek.\n" > panduan.md
git add panduan.md
git commit -m "Panduan proyek"
git remote add origin /tmp/lab-pusat2.git
git push -q -u origin main
cd /tmp
git clone -q lab-pusat2.git lab-citra2
cd lab-citra2
git config user.name "Citra"
git config user.email "[email protected]"
printf "Panduan proyek.\nBab rilis.\n" > panduan.md
git commit -am "Tambah bab rilis"
git push -q
cd /tmp/lab-budi2
printf "Panduan proyek.\nBab lingkungan.\n" > panduan.md
git commit -am "Tambah bab lingkungan"
cd /tmp/lab-citra2
printf "Panduan proyek.\nBab rilis.\nRincian rilis.\n" > panduan.md
git commit -am "Rinci bab rilis"
git push -q
cd /tmp/lab-budi2
git -c pull.rebase=true pull
git log --oneline -3
text Keluaran
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: 	git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: 	git branch -m <name>
Initialized empty Git repository in /tmp/lab-pusat2.git/
Initialized empty Git repository in /tmp/lab-budi2/.git/
[main (root-commit) f4ac75f] Panduan proyek
 1 file changed, 1 insertion(+)
 create mode 100644 panduan.md
warning: remote HEAD refers to nonexistent ref, unable to checkout
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	panduan.md

nothing added to commit but untracked files present (use "git add" to track)
error: src refspec refs/heads/master does not match any
error: failed to push some refs to '/tmp/lab-pusat2.git'
[main 3857aaa] Tambah bab lingkungan
 1 file changed, 1 insertion(+)
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	panduan.md

nothing added to commit but untracked files present (use "git add" to track)
error: src refspec refs/heads/master does not match any
error: failed to push some refs to '/tmp/lab-pusat2.git'
Current branch main is up to date.
3857aaa Tambah bab lingkungan
f4ac75f Panduan proyek

Commit lokal Budi kini berada di atas commit Citra tanpa commit merge, dan hash commit lokalnya berganti menjadi hash baru karena commit diputar ulang. Kedua hasil sama sahnya sebagai isi, dan berbeda hanya pada bentuk riwayatnya. Kebijakan yang lazim untuk pekerjaan tim yang menuntut riwayat linear adalah rebase, sedangkan merge dipakai ketika catatan penyatuan ingin tetap terlihat.

Keamanan penggunaan pull#

Karena pull menyatukan tanpa peninjauan terpisah, kebiasaan yang menjaganya aman adalah fetch teratur untuk tetap terinformasi dan pull saat siap menyatukan. Pada saat pull, pekerjaan lokal sebaiknya sudah ter-commit, karena penyatuan yang disertai perubahan yang menggantung dapat ditolak, dan keadaan setengah jalan lebih sulit dibaca. Pesan Already up to date. pada pull tanpa commit baru adalah kondisi sehat, bukan tanda kesalahan.

Kebijakan konservatif dengan fast-forward saja#

Kebijakan ketiga pada daftar pilihan, yaitu pull.ff only, adalah yang paling konservatif: pull hanya menerima penyatuan berupa fast-forward, dan setiap penyimpangan ditolak agar diperiksa secara sadar. Kebijakan ini cocok untuk pengembang yang menganggap branch lokal sebagai tiruan setia dari remote, dengan pengecualian pekerjaan yang memang sedang dijalankan di atasnya.

Pada keadaan yang menyimpang, kebijakan ini menghentikan pull dengan pesan yang menyebut ketidakmungkinan fast-forward, dan keadaan lokal dibiarkan utuh. Jalan lanjutannya diserahkan kepada pengembang, yaitu menggabungkan atau me-rebase secara eksplisit setelah meninjau commit remote, sehingga tidak ada penyatuan yang terjadi tanpa diketahui. Di antara tiga kebijakan, pilihan ini paling sedikit membuat kejutan, dengan harga berupa satu langkah manual setiap kali riwayat benar-benar menyimpang.

Menyelaraskan pull dengan pekerjaan yang menggantung#

Perubahan yang belum di-commit berinteraksi dengan pull sebagaimana interaksinya dengan berpindah branch, yaitu Git memeriksa dulu apakah berkas yang berubah sama-sama disentuh oleh commit yang datang. Apabila tidak, perubahan yang menggantung tetap berada di working directory setelah pull, dan pekerjaan berlanjut tanpa gangguan. Apabila berkasnya sama, pull ditolak dengan pesan yang menyebut berkas yang berpotensi tertimpa, dan keadaan lokal tetap utuh.

Cara menyiapkan diri sebelum pull pun sama dengan sebelum berpindah branch, yaitu men-commit pekerjaan yang sudah layak atau menyimpan sementara yang belum. Kebiasaan commit kecil sebelum sinkronisasi memang terasa menambah langkah, tetapi khasiatnya muncul tepat pada saat penyatuan menimbulkan konflik, karena konflik pada commit yang sudah aman jauh lebih mudah dibaca daripada konflik yang bercampur dengan pekerjaan setengah jalan.

Ringkasan#

  • git pull adalah git fetch diikuti penyatuan, dan pada riwayat linear penyatuannya berupa fast-forward tanpa commit baru.
  • Pada branch yang menyimpang, Git meminta keputusan eksplisit melalui pull.rebase false untuk merge atau pull.rebase true untuk rebase.
  • Merge menyimpan kenyataan dua jalur pada commit merge, sedangkan rebase menjaga riwayat tetap lurus dengan hash baru.
  • Pull paling aman dilakukan dengan pekerjaan lokal yang sudah ter-commit dan isi remote yang sudah dipahami.

Referensi#