Definisi dan Konteks
Git adalah sistem kontrol versi terdistribusi yang diciptakan oleh Linus Torvalds pada tahun 2005 untuk pengembangan kernel Linux. Sebagai VCS (Version Control System), Git melacak perubahan pada file kode sumber dari waktu ke waktu, memungkinkan banyak developer untuk bekerja secara paralel pada proyek yang sama tanpa saling menimpa pekerjaan satu sama lain. Setiap salinan repositori Git bersifat lengkap — berisi seluruh riwayat commit, branch, dan metadata — sehingga developer dapat bekerja offline dan menyinkronkan perubahan nanti. Git telah menjadi standar de facto untuk kontrol versi di seluruh dunia, didukung oleh platform hosting seperti GitHub, GitLab, dan Bitbucket.
Azure DevOps, di sisi lain, adalah rangkaian layanan kolaborasi pengembangan perangkat lunak berbasis cloud dari Microsoft yang diluncurkan pertama kali pada tahun 2018 sebagai evolusi dari Visual Studio Team Services (VSTS). Azure DevOps bukan sekadar kontrol versi — ia adalah platform DevOps menyeluruh yang mencakup perencanaan proyek (Azure Boards), repositori kode (Azure Repos yang menggunakan Git di bawahnya), pipeline CI/CD (Azure Pipelines), manajemen artefak (Azure Artifacts), dan pengujian terencana (Azure Test Plans). Dengan kata lain, Azure DevOps mengadopsi Git sebagai mesin kontrol versinya, lalu membungkusnya dalam ekosistem tooling yang jauh lebih luas.
Memahami perbedaan keduanya sangat penting karena kesalahan umum yang sering terjadi adalah membandingkan Git dan Azure DevOps seolah-olah keduanya berada pada kategori yang sama. Padahal, Git adalah tool spesifik untuk kontrol versi, sementara Azure DevOps adalah platform end-to-end yang di dalamnya sudah mengemas Git plus serangkaian layanan lain. Pemahaman ini menentukan apakah tim Anda cukup membutuhkan solusi kontrol versi yang ringan dan fleksibel, atau memerlukan orchestration penuh dari perencanaan hingga deployment.
Head-to-Head Berdasarkan Fitur:
| Aspek | Git | Azure DevOps |
|---|---|---|
| Kontrol Versi | ✅ Inti fungsi | ✅ via Azure Repos (Git-based) |
| Perencanaan/Agile | ❌ Tidak ada (butuh integrasi pihak ketiga) | ✅ Azure Boards (backlog, sprint, dashboards) |
| CI/CD Pipeline | ❌ Tidak ada (butuh GitHub Actions, Jenkins, dll.) | ✅ Azure Pipelines (YAML/classic, multi-agent) |
| Manajemen Artefak | ❌ Tidak ada | ✅ Azure Artifacts (NuGet, npm, Maven, Python) |
| Testing Terencana | ❌ Tidak ada | ✅ Azure Test Plans (manual & exploratory) |
| Self-hosted | ✅ Server lokal gratis | ✅ Azure DevOps Server (on-prem, berbayar) |
| Open Source | ✅ Sepenuhnya open source | ❌ Proprietary (tapi Repos-nya kompatibel Git) |
| Ekosistem & Integrasi | Luas via CLI, hooks, dan marketplace GitHub/GitLab | Kuat di ekosistem Microsoft (VS, Azure, Teams, AD) |
Head-to-Head Berdasarkan Harga:
Git itu sendiri sepenuhnya gratis dan open source. Namun jika kita mempertimbangkan platform hosting, GitHub menawarkan tier gratis untuk repositori publik dan private (dengan batasan menit CI/CD), lalu GitHub Pro seharga $4/bulan per user, dan GitHub Enterprise mulai $21/bulan per user. GitLab menyediakan tier gratis yang sangat generous (termasuk 400 menit CI/bulan), lalu Premium seharga $29/bulan per user, dan Ultimate seharga $99/bulan per user.
Azure DevOps mengikuti model harga yang berbeda. Azure DevOps Services (cloud) memberikan tier gratis yang mencakup lima user, repositori private tak terbatas, 1.800 menit CI/CD per bulan dengan satu parallel job, dan 2 GB artefak. Untuk tim yang lebih besar, Basic Plan seharga $6/bulan per user (atau $8/bulan jika termasuk Test Plans). Parallel jobs tambahan untuk CI/CD dikenakan biaya $40/bulan per parallel job. Azure DevOps Server (on-premises) memerlukan lisensi yang terpisah, meskipun Express edition-nya gratis untuk hingga lima user. Dibandingkan GitHub Enterprise, Azure DevOps seringkali lebih ekonomis untuk organisasi besar yang sudah terikat ekosistem Microsoft, terutama karena bundling layanan yang komprehensif dalam satu harga.
Mekanisme di Baliknya
Konsep Inti Git:
Git bekerja berdasarkan model snapshot, bukan delta. Setiap kali Anda membuat commit, Git mengambil snapshot lengkap dari seluruh file yang berubah dan menyimpan referensi ke snapshot tersebut sebagai objek commit. File yang tidak berubah tidak disimpan ulang — Git hanya menyimpan referensi ke versi sebelumnya. Tiga area utama dalam Git adalah working directory (di mana Anda mengedit file), staging area atau index (di mana Anda menandai perubahan yang akan di-commit), dan repository (di mana Git menyimpan seluruh metadata dan objek secara permanen). Branch di Git hanyalah pointer ringan berbentuk 40-karakter SHA-1 hash yang menunjuk ke commit tertentu, sehingga membuat branching dan merging sangat cepat dan murah secara komputasi.
Konsep Inti Azure DevOps:
Azure DevOps beroperasi pada konsep organisasi dan project. Organization adalah container tertinggi yang mengelola kebijakan keamanan, billing, dan koneksi ke Azure Active Directory. Di dalam organization, project merepresentasikan satu unit kerja yang bisa berisi satu atau lebih repositori di Azure Repos, satu atau lebih board di Azure Boards, definisi pipeline di Azure Pipelines, feed artefak di Azure Artifacts, dan rencana pengujian di Azure Test Plans. Azure Repos di bawah hood-nya adalah Git — ia menyimpan objek Git yang sama, menggunakan protokol yang sama, dan kompatibel penuh dengan Git CLI. Namun Azure DevOps menambahkan lapisan abstraksi untuk kebijakan branch (policy untuk enforce PR review, build validation, dan work item linking), permission yang terintegrasi dengan Active Directory, serta branch folderization untuk mengorganisir branch dalam hierarki visual.
Komponen Utama:
Pada sisi Git, komponen utama terdiri dari .git/objects (blob, tree, commit, dan tag objects), .git/refs (branch pointers, remote-tracking branches, dan tags), .git/HEAD (pointer ke branch aktif), dan remote repositories yang didefinisikan dalam .git/config. Git hook (pre-commit, post-merge, dll.) memungkinkan otomatisasi pada level lokal, sementara .gitignore dan .gitattributes mengontrol file mana yang dilacak dan bagaimana mereka ditangani.
Pada sisi Azure DevOps, komponen utama meliputi Azure Boards yang menyediakan epic, feature, user story, dan task hierarchi dengan hubungan traceability ke commit dan PR; Azure Repos yang menambahkan pull request dengan policy enforcement, code search, dan branch folderization di atas fungsionalitas Git standar; Azure Pipelines yang mendukung build dan release pipeline baik berbasis YAML (sebagai-code) maupun classic UI-defined, dengan agent pool yang bisa Microsoft-hosted atau self-hosted; Azure Artifacts yang berfungsi sebagai registry paket untuk berbagai ekosistem; dan Azure Test Plans yang mendukung manual test case management, exploratory testing, dan automated test integration dengan pipeline.
Skenario Penggunaan
Skenario 1: Inisialisasi Proyek dan Remote Setup
Sebuah tim startup ingin memulai proyek baru. Dengan Git murni, mereka cukup menginisialisasi repositori lokal dan mendorongnya ke remote mana pun (GitHub, GitLab, Bitbucket, atau server sendiri). Fleksibilitas ini menjadi kekuatan Git — tidak ada vendor lock-in.
# Inisialisasi repositori Git lokal
mkdir proyek-baru && cd proyek-baru
git init
# Buat commit pertama
echo "# Proyek Baru" > README.md
git add README.md
git commit -m "feat: inisialisasi proyek"
# Tambahkan remote dan push
git remote add origin https://github.com/tim/proyek-baru.git
git push -u origin main
Output:
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 251 bytes | 251.00 KiB/s, done.
To https://github.com/tim/proyek-baru.git
* [new branch] main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.
Dengan Azure DevOps, langkahnya serupa tetapi remote mengarah ke Azure Repos, dan secara bersamaan tim bisa mengonfigurasi Azure Boards untuk backlog dan sprint:
# Remote mengarah ke Azure DevOps
git remote add origin https://dev.azure.com/org/proyek/_git/proyek-baru
git push -u origin main
# Membuat work item via Azure DevOps CLI
az boards work-item create \
--title "Setup infrastruktur awal" \
--type "Task" \
--project "proyek-baru" \
--area "proyek-baru" \
--iteration "proyek-baru\\Sprint 1"
Output:
{
"id": 15,
"fields": {
"System.Title": "Setup infrastruktur awal",
"System.State": "To Do",
"System.WorkItemType": "Task"
}
}
Skenario 2: Feature Branch dan Pull Request
Developer ingin menambahkan fitur autentikasi. Di kedua sistem, alur branch-nya identik karena Azure Repos menggunakan Git:
# Buat feature branch
git checkout -b feature/auth-oauth2
# Kerjakan perubahan
echo "export function oauth2Login() { ... }" > src/auth/oauth2.ts
git add src/auth/oauth2.ts
git commit -m "feat: tambahkan login via OAuth2
- Implementasi authorization code flow
- Tambahkan token refresh mechanism
Relates: #42"
# Push branch ke remote
git push -u origin feature/auth-oauth2
Output:
remote:
remote: Create a pull request for 'feature/auth-oauth2' on Azure DevOps by visiting:
remote: https://dev.azure.com/org/proyek/_git/proyek/pullrequestcreate?sourceRef=feature/auth-oauth2&targetRef=main
remote:
To https://dev.azure.com/org/proyek/_git/proyek
* [new branch] feature/auth-oauth2 -> feature/auth-oauth2
Perbedaan signifikan muncul pada pull request. Di GitHub, PR adalah mekanisme review dengan approval dan comment. Di Azure DevOps, PR bisa dilengkapi dengan policy yang mewajibkan minimal dua reviewer, build validation yang menjalankan pipeline tertentu sebelum merge diizinkan, dan koneksi otomatis ke work item di Boards — sehingga traceability dari requirement hingga kode terjaga penuh.
Skenario 3: CI/CD Pipeline
Inilah area di mana Git murni memerlukan integrasi pihak ketiga, sementara Azure DevOps menyediakannya secara native. Dengan GitHub, Anda menulis GitHub Actions:
# .github/workflows/ci.yml (GitHub Actions)
name: CI Pipeline
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- run: npm test
- run: npm run build
Dengan Azure Pipelines, YAML-nya berbeda sintaksis tetapi konsepnya serupa:
# azure-pipelines.yml (Azure DevOps)
trigger:
branches:
include:
- main
paths:
exclude:
- README.md
pool:
vmImage: 'ubuntu-latest'
steps:
- task: NodeTool@0
inputs:
versionSpec: '20.x'
displayName: 'Install Node.js'
- script: |
npm ci
npm test
displayName: 'Install & Test'
- script: npm run