SSD Nodes Learn 🎉 VPS mulai $5.50/bln
Panduan Matt ConnorOleh Matt Connor · Diperbarui 2026-08-13

Apa Itu GitHub? Git vs Git untuk Pemilik VPS

Pahami perbedaan Git dan GitHub: Git berjalan di komputer atau VPS, sedangkan GitHub adalah layanan terkelola untuk menyimpan repositori dan kolaborasi.

Apa itu GitHub?

GitHub adalah layanan terkelola yang menyimpan repositori Git dan menyediakan situs web untuk repositori tersebut. Git adalah program pengelolaan versi yang berjalan pada komputer atau server Anda sendiri. GitHub adalah produk milik satu perusahaan yang dibangun di atas Git dan dimiliki oleh Microsoft sejak 2018. Anda dapat menggunakan Git setiap hari tanpa pernah membuka GitHub. Anda tidak dapat menggunakan GitHub tanpa Git.

Perbedaan ini penting segera setelah Anda memiliki VPS (virtual private server). Git mencatat riwayat file konfigurasi dan skrip deployment Anda. GitHub menjadi tempat penyimpanan salinan riwayat tersebut saat server tidak menyimpannya, sekaligus tempat untuk menjalankan build dan melakukan review. Panduan ini mengikuti satu contoh, mulai dari folder kosong hingga deployment pada server, serta menjelaskan setiap istilah baru saat istilah tersebut pertama kali digunakan.

Apa yang dilakukan Git secara otomatis

Git adalah sistem kontrol versi. Git mencatat keadaan sebuah direktori dari waktu ke waktu agar Anda dapat melihat apa yang berubah, kapan perubahan terjadi, dan alasannya. Git dibuat pada 2005 untuk pengembangan kernel Linux. Git bersifat terdistribusi. Artinya, setiap salinan repositori menyimpan seluruh riwayat. Dalam desain ini, tidak ada server pusat. Laptop milik kolega memiliki salinan yang sama lengkapnya dengan server mana pun.

Instal Git, lalu tetapkan identitas Anda. Git menolak merekam commit tanpa nama dan alamat email karena keduanya ditulis ke dalam commit itu sendiri.

sudo apt update && sudo apt install -y git
git --version
git config --global user.name "Your Name"
git config --global user.email "you@example.com"

Pada Ubuntu 24.04, git --version mencetak git version 2.43.0. Rilis apa pun dari beberapa tahun terakhir berperilaku sama untuk semua hal berikutnya.

Contoh: repository untuk file deploy VPS Anda

Repository, yang biasanya disingkat menjadi "repo", adalah direktori yang dipantau oleh Git. Direktori menjadi repository setelah Anda menjalankan git init, yang membuat folder tersembunyi .git di dalamnya. Folder tersebut adalah repository. Hapus .git, dan yang tersisa adalah direktori biasa tanpa riwayat.

mkdir vps-deploy && cd vps-deploy
git init -b main
printf '.env\n*.key\n' > .gitignore

-b main memberi nama main pada branch pertama. Jika opsi tersebut tidak digunakan, Git akan menampilkan petunjuk panjang tentang nama branch default. .gitignore mencantumkan path yang tidak boleh dilacak Git. Masukkan file rahasia Anda ke dalamnya sejak hari pertama, karena file yang pernah di-commit akan tetap berada dalam riwayat setelah Anda menghapusnya. Menghapusnya dengan benar berarti menulis ulang setiap commit yang dibuat setelahnya.

Commit: unit riwayat

Sekarang tambahkan sebuah skrip dan catat perubahan tersebut.

printf '#!/bin/sh\nsudo systemctl restart caddy\n' > restart.sh
git add restart.sh .gitignore
git commit -m "Add restart script and gitignore"
git log --oneline

git add memindahkan perubahan ke staging area, yaitu daftar perubahan yang akan dimasukkan ke commit berikutnya. git commit menulis daftar tersebut ke dalam riwayat sebagai satu entri. Commit berisi snapshot setiap file yang dilacak, pesan, penulis, stempel waktu, dan penunjuk ke commit sebelumnya. git log --oneline mencetak satu baris untuk setiap commit. Setiap baris diawali hash singkat seperti a1b2c3d. Hash tersebut adalah nama commit, dan hampir semua perintah Git menerimanya.

Lewati langkah git add, lalu git commit menjawab no changes added to commit (use "git add" and/or "git commit -a"). Tidak ada yang rusak. Git memberi tahu bahwa staging area kosong sehingga tidak ada yang dapat dibuat snapshot-nya. git status adalah perintah yang harus dijalankan setiap kali Anda tidak yakin: perintah ini menampilkan nama branch saat ini, perubahan yang sudah di-stage, dan file yang dapat dilihat Git tetapi belum dilacak.

Branch: jalur riwayat kedua

Branch adalah pointer yang bergerak ke sebuah commit. main adalah branch, dan tidak memiliki keistimewaan apa pun di Git. Membuat branch tidak memerlukan biaya karena Git menulis pointer baru, bukan menyalin file Anda.

git switch -c add-backup
printf '#!/bin/sh\nrestic backup /srv\n' > backup.sh
git add backup.sh
git commit -m "Add nightly backup"
git switch main
ls

Setelah git switch main, backup.sh tidak lagi muncul dalam daftar. Tidak ada yang dihapus. File tersebut ada pada branch add-backup, sedangkan main tidak pernah memilikinya. Karena itu, Git menghapusnya dari direktori kerja saat Anda berpindah branch. Hal ini biasanya hanya mengejutkan sekali. git switch add-backup mengembalikannya.

Remotes: lokasi GitHub akhirnya muncul

Semua langkah sebelumnya dijalankan pada satu mesin tanpa jaringan sama sekali. Remote adalah URL bernama untuk salinan lain dari repositori yang sama. GitHub meng-host salah satu salinan tersebut untuk Anda. Nama konvensional untuk remote utama adalah origin.

Buat repositori kosong melalui situs web GitHub, lalu hubungkan ke repositori tersebut. Di sini, gunakan SSH daripada HTTPS jika memungkinkan: kunci SSH adalah file yang Anda kendalikan dan tidak kedaluwarsa seperti personal access token.

ssh-keygen -t ed25519 -C "vps-deploy"
cat ~/.ssh/id_ed25519.pub
ssh -T git@github.com

Tempelkan kunci publik yang tercetak ke halaman SSH keys pada akun GitHub Anda, lalu jalankan kembali pengujian tersebut. Kunci yang berfungsi akan menjawab Hi yourname! You've successfully authenticated, but GitHub does not provide shell access. GitHub tidak memberi Anda shell, sehingga penolakan tersebut menandakan keberhasilan. git@github.com: Permission denied (publickey). berarti kunci Anda tidak pernah ditawarkan atau tidak diterima. Periksa apakah Anda menempelkan file .pub, bukan private key yang berada di sebelahnya.

git remote add origin git@github.com:yourname/vps-deploy.git
git push -u origin main

git push mengirim commit Anda ke remote. -u mencatat bahwa main lokal melacak main remote, sehingga nantinya git push saja sudah cukup. git clone <url> adalah kebalikannya pada mesin baru: perintah ini menyalin seluruh repositori beserta riwayatnya dan menetapkan origin untuk Anda. Remote HTTPS juga dapat digunakan dan berjalan melalui protokol yang sama seperti halaman web mana pun. Hal ini membantu pada jaringan yang memblokir port keluar 22. Jika kalimat tersebut perlu dijelaskan lebih lanjut, komponen yang sebenarnya terdapat dalam permintaan HTTP membahas mekanismenya.

Pull request, issue, dan fork: bagian yang merupakan GitHub, bukan Git

Semua hal di atas adalah Git dan dapat digunakan pada server apa pun. Tiga istilah berikut adalah fitur GitHub. Host lain menirunya, sedangkan Git sendiri tidak mengenal fitur-fitur tersebut.

Pull request (PR) adalah permintaan untuk menggabungkan satu branch ke branch lain, yang disertai halaman untuk diskusi. Anda melakukan push add-backup, membuka PR terhadap main, lalu situs menampilkan perbedaan commit demi commit. Orang lain dapat memberikan komentar pada baris tertentu. Pemeriksaan otomatis melaporkan apakah branch tersebut lulus atau gagal. Klik merge, lalu GitHub melakukan merge pada salinannya sendiri dan memperbarui main. Nama ini berasal dari alur kerja awal, ketika Anda meminta maintainer untuk pull branch Anda ke branch mereka.

Issue adalah thread bernomor untuk bug atau tugas. Issue disimpan dalam database GitHub, bukan di repository Anda. Hal ini penting diketahui sebelum memilih host: setelah melakukan clone terhadap repo, Anda memiliki semua commit, tetapi tidak memiliki satu pun issue. Untuk mengambil issue, Anda harus memanggil API.

Fork adalah salinan repository milik orang lain di sisi server Anda sendiri. Anda memiliki akses tulis ke salinan tersebut, melakukan push branch ke sana, lalu membuka pull request dari salinan Anda ke repository asal. Dengan cara ini, Anda dapat berkontribusi pada project yang maintainer-nya belum pernah mengenal Anda. Fork adalah clone yang berada di GitHub dan menyimpan informasi tentang asalnya.

Software membaca ketiganya melalui API yang sama dengan yang digunakan oleh pengguna. Agen peninjau pull request yang Anda jalankan di server sendiri memantau PR baru, membaca diff, dan menambahkan komentar pada baris tertentu. Konvensi seperti file AGENTS.md di root repository ada karena repo kini dibaca oleh tools dan juga oleh manusia.

Apa yang sebenarnya dilakukan GitHub bagi pemilik VPS

Mulai dengan penyimpanan di luar server. Skrip deployment dan playbook Anda harus disimpan di tempat yang bukan server yang dikonfigurasinya. Bangun ulang VPS dari image baru, lakukan clone, lalu jalankan. Jadikan repository tersebut privat dan berikan deploy key kepada server: SSH key yang didaftarkan untuk satu repository, bukan seluruh akun Anda, dan diatur sebagai read-only. Jika deploy key read-only bocor, hanya satu repository yang terekspos. Jika account key bocor, semua repository yang dapat Anda push akan terekspos.

sudo git clone git@github.com:yourname/vps-deploy.git /srv/vps-deploy
cd /srv/vps-deploy
git pull --ff-only

--ff-only menolak membuat merge commit. Pada server yang hanya mengambil perubahan, merge selalu merupakan kesalahan. Karena itu, flag ini mengubah riwayat yang membingungkan menjadi error sederhana, fatal: Not possible to fast-forward, aborting. Ada perubahan pada server yang seharusnya tidak ada. Temukan perubahan tersebut sebelum melakukan pull lagi.

Lakukan clone sebagai root, lalu jalankan Git sebagai pengguna lain, dan Anda akan mendapatkan fatal: detected dubious ownership in repository at '/srv/vps-deploy'. Git menolak membaca repository yang dimiliki pengguna lain karena .git/config yang berbahaya dapat membuat Git menjalankan perintah. Perbaiki kepemilikan dengan chown, bukan dengan menambahkan pengecualian safe.directory, karena pengecualian tersebut hanya menonaktifkan pemeriksaan tanpa menghilangkan penyebabnya.

Pipeline build dan deployment GitHub Actions

Actions adalah sistem CI/CD (continuous integration dan continuous delivery) milik GitHub. Commit file YAML di bawah .github/workflows/, lalu GitHub menjalankannya ketika peristiwa yang Anda tentukan terjadi.

name: check
on:
  push:
    branches: [main]
jobs:
  shellcheck:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      - run: sudo apt-get update && sudo apt-get install -y shellcheck
      - run: shellcheck *.sh

File tersebut disebut workflow. Sebuah job berjalan pada satu mesin. Sebuah step berisi satu perintah atau satu action yang dipublikasikan. uses: mengambil action dari repository lain, sedangkan @v7 menetapkan versi mayor action tersebut (v7 adalah versi saat ini untuk actions/checkout per Agustus 2026). Selalu tetapkan versinya, karena action tanpa versi yang ditetapkan dapat menjalankan kode yang belum Anda tinjau dengan akses ke secret Anda.

runs-on: ubuntu-latest meminta virtual machine baru dari GitHub. Virtual machine tersebut dihapus ketika job selesai. Runner standar gratis pada repository publik, dan paket gratis mencakup 2,000 menit per bulan untuk repository privat per Agustus 2026. Periksa halaman harga terbaru sebelum menyusun anggaran berdasarkan angka tersebut.

Secret disimpan dalam pengaturan repository dan dibaca sebagai ${{ secrets.DEPLOY_KEY }}. Workflow yang dipicu oleh pull request dari fork memperoleh token read-only dan tidak memiliki akses ke secret tersebut. Jika tidak, orang asing dapat membuka PR yang hanya bertugas mencetak secret itu.

Menjalankan runner Actions di VPS milik sendiri

runs-on: self-hosted mengirimkan job ke mesin yang Anda miliki. Halaman pengaturan runner repositori menyediakan baris unduhan, alamat web repositori, dan token pendaftaran yang berlaku selama satu jam. Masukkan dua item terakhir ke dalam REPO_URL dan RUNNER_TOKEN, lalu penyiapannya cukup dengan tiga perintah.

./config.sh --url "$REPO_URL" --token "$RUNNER_TOKEN"
sudo ./svc.sh install
sudo ./svc.sh start
./svc.sh status

svc.sh status seharusnya melaporkan service sebagai aktif dan menampilkan baris log terbaru. Runner membuka koneksi HTTPS keluar ke GitHub dan meminta pekerjaan, sehingga Anda tidak perlu membuka port masuk untuk runner tersebut. svc.sh install menulis unit systemd, dan langkah ini sering dilewati: tanpa unit tersebut, runner berhenti ketika sesi SSH Anda berakhir dan setiap job berikutnya tetap berada dalam antrean tanpa penjelasan. penyiapan lengkap self-hosted runner pada VPS menjelaskan hardening dan pembersihan yang diperlukan runner yang berjalan dalam jangka panjang.

Keuntungannya, deploy tidak lagi memerlukan kunci SSH masuk yang dapat dijangkau dari Internet, karena job sudah berjalan di server tersebut. Cache build juga tetap tersedia di antara eksekusi, dan tidak ada penghitung menit yang berjalan.

Ada satu peringatan yang wajib diperhatikan. Dokumentasi GitHub sendiri merekomendasikan self-hosted runner hanya untuk repositori privat, karena fork dari repositori publik dapat menjalankan kode berbahaya pada runner Anda dengan membuka pull request. Runner menjalankan apa pun yang ditentukan file workflow pada branch tersebut. Pada repositori privat, jika Anda mengendalikan pihak yang dapat melakukan push, risikonya kecil. Pada repositori publik, perlakukan setiap self-hosted runner sebagai mesin tempat orang yang tidak dikenal dapat menjalankan kode.

Apakah Anda benar-benar membutuhkan GitHub?

Tidak. Git adalah standar, sedangkan GitHub adalah kemudahan. Forgejo dan Gitea adalah forge yang di-host sendiri; forge adalah host Git dengan issue dan pull request yang terkait. Keduanya didistribusikan sebagai satu binary Go, keduanya dapat berjalan pada VPS kecil, dan Forgejo adalah fork Gitea pada 2022 yang kini mendukung Codeberg. Pemindahan repository hanya memerlukan satu perintah karena protokol wire-nya identik.

git remote -v
git remote set-url origin git@git.example.com:you/vps-deploy.git
git push origin main

Setiap commit ikut berpindah karena setiap clone sudah menyimpan seluruh histori. Yang tidak ikut berpindah adalah lapisan yang dibangun GitHub di atasnya: issue dan thread pull request. CI juga tidak ikut berpindah. Forgejo memiliki implementasi Actions sendiri yang membaca YAML serupa dari .forgejo/workflows/, dan dokumentasinya menjelaskan batasan ini secara langsung: GitHub Actions dan Forgejo Actions tidak sama, dan beberapa hal mungkin tidak langsung berfungsi. Forgejo juga memerlukan runner sendiri. Rencanakan langkah tersebut sebagai migrasi, bukan penyalinan.

Alasan sebenarnya sebagian besar proyek tetap menggunakan GitHub adalah kontributor. Kode publik harus ditempatkan di layanan yang sudah memiliki akun para penggunanya. Script deploy privat Anda tidak harus demikian. Keduanya merupakan keputusan yang terpisah, dan Anda boleh memberikan jawaban yang berbeda untuk masing-masing.

Hal yang pertama rusak dan makna pesan error

Push ditolak. Anda akan melihat:

 ! [rejected]        main -> main (fetch first)
error: failed to push some refs to 'github.com:yourname/vps-deploy.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally.

Ada push yang dilakukan sejak pull terakhir Anda, sering kali berupa edit yang Anda buat di editor web. Jalankan git pull --rebase untuk memutar ulang commit Anda di atas commit tersebut, lalu lakukan push lagi. Hindari git push --force pada branch bersama karena perintah itu menghapus commit lain dari branch tersebut di server.

fatal: refusing to merge unrelated histories. Anda menjalankan git init secara lokal dan juga membiarkan GitHub membuat repository dengan README. Kedua riwayat tersebut tidak memiliki commit yang sama, sehingga Git tidak dapat menentukan tindakan yang benar. Solusi yang bersih adalah melakukan clone terhadap salinan di GitHub ke folder baru, lalu memindahkan file Anda ke dalamnya.

error: src refspec main does not match any. Branch yang Anda sebutkan tidak ada di sini. Biasanya repository belum memiliki commit sama sekali, atau branch Anda bernama master. git branch --show-current akan memastikan penyebabnya.

Sebuah secret masuk ke dalam commit. Segera rotasi kredensial tersebut. Anggap kredensial itu sudah menjadi informasi publik sejak pertama kali di-push karena fork, mirror, dan tampilan yang tersimpan di cache dapat menyimpan salinan yang tidak dapat Anda hapus.

FAQ

Apakah GitHub sama dengan Git?

Tidak. Git adalah program pengendali versi yang Anda instal pada mesin, dan dapat bekerja tanpa jaringan maupun akun. GitHub adalah layanan hosting komersial yang menyimpan repositori Git serta menyediakan antarmuka web, issue, pull request, dan CI. Git dirilis pada 2005, sedangkan GitHub diluncurkan pada 2008 dengan Git sebagai fondasinya. Anda dapat menggunakan Git selamanya tanpa GitHub. Setiap fitur GitHub bergantung pada Git.

Apakah saya memerlukan akun GitHub untuk menggunakan Git pada VPS saya?

Tidak. git init, git commit, dan git log dapat digunakan pada server tanpa remote yang dikonfigurasi sama sekali. Itu sudah cukup untuk melacak perubahan pada file /etc atau skrip deployment. Akun berguna jika Anda ingin memiliki salinan riwayat yang tetap tersedia meskipun server bermasalah, atau jika Anda membutuhkan mesin kedua yang dapat melakukan clone. Forge yang di-host sendiri, seperti Forgejo dan Gitea, menyediakan kebutuhan yang sama pada perangkat keras milik Anda. Remote SSH biasa yang mengarah ke bare repository pada mesin lain juga dapat digunakan tanpa perangkat lunak forge.

Apa itu pull request?

Pull request adalah permintaan untuk menggabungkan satu branch ke branch lain, disertai halaman diskusi. Anda melakukan push pada sebuah branch, membuka PR terhadap main, lalu host menampilkan perubahan commit demi commit. Dengan demikian, reviewer dapat mengomentari baris tertentu, dan pemeriksaan otomatis dapat melaporkan hasil lulus atau gagal. Pull request adalah fitur GitHub, bukan fitur Git. Karena itu, Git sendiri tidak memiliki perintah untuk membuatnya. Host lain menerapkan konsep yang sama dan terkadang menyebutnya merge request.

Apakah saya sebaiknya menjalankan runner GitHub Actions pada VPS sendiri?

Untuk repositori privat, sering kali ya. Job berjalan pada perangkat keras yang sudah Anda biayai, tidak ada penghitungan menit, cache build tetap tersedia, dan deployment tidak lagi memerlukan kunci SSH masuk yang terekspos ke Internet. Runner terhubung keluar ke GitHub dan meminta pekerjaan. Untuk repositori publik, GitHub menyarankan agar Anda tidak melakukannya. Siapa pun dapat melakukan fork pada repositori Anda dan membuka pull request yang workflow-nya menjalankan kode pada mesin Anda.

Apakah saya dapat memindahkan repositori dari GitHub nanti?

Kode, ya, dengan mudah. Setiap clone menyimpan seluruh riwayat, sehingga git remote set-url origin <new url> yang diikuti push akan memindahkan semua hal yang terdapat dalam sebuah commit. Yang tertinggal adalah lapisan yang dikelola GitHub. Issue, diskusi pull request, dan riwayat Actions tersimpan dalam basis data GitHub, bukan dalam folder .git Anda. Alat migrasi dapat menyalin issue melalui API, dan file workflow biasanya perlu diedit agar sesuai dengan CI milik host baru. Hal ini perlu dipertimbangkan saat menempatkan dokumentasi penting di repositori, bukan dalam thread issue.

#github#git#version-control#ci-cd#developer-tools