Di Halaman Ini

Cara Menginisialisasi Repositori Git dengan git init

Jawaban singkat: Jalankan git init dari direktori proyek untuk membuat repositori Git lokal. Perintah ini membuat direktori tersembunyi .git/, tetapi tidak melakukan stage pada file, membuat commit, membuat repositori GitHub, atau mengunggah apa pun.

Default yang digunakan di halaman ini: output yang ditampilkan berasal dari repositori yang menggunakan format objek SHA-1 default Git dan backend referensi default files, sehingga Anda melihat .git/objects/ serta .git/refs/heads/. git init --object-format=sha256 dan git init --ref-format=reftable mengubah dua detail tersebut tanpa mengubah tata letak keseluruhan yang dijelaskan di sini.

Sintaks

git init                  # initialise the current directory
git init <directory>      # create the directory, then initialise it
git init --bare <dir>     # create a repository with no working tree
git init -b main          # set the initial branch name

Cara Menginisialisasi Repositori Git

Untuk proyek baru, buat folder, inisialisasikan folder tersebut, lalu lakukan stage dan commit pada sebuah file:

mkdir my-project
cd my-project
git init -b main
echo "# My project" > README.md
git add README.md
git commit -m "Initial commit"

Jika Anda sudah punya proyek, jalankan git init dari folder akarnya, bukan membuat folder baru. git init -b main menetapkan nama cabang awal pada versi Git yang mendukungnya; git init biasa memakai default yang sudah Anda konfigurasi. Git tidak melacak file sampai Anda melakukan stage dengan git add dan mencatat commit dengan git commit. Jika Git meminta detail penulis, ikuti panduan git config. Untuk menerbitkan repositori nanti, tambahkan remote dengan git remote lalu push secara terpisah.

Saat dijalankan di folder proyek yang sudah ada, git init membuat atau menyegarkan metadata repositori di .git/; perintah ini tidak melakukan stage atau commit pada file proyek Anda. git init <directory> juga membuat direktori tujuan jika belum ada, dan menginisialisasi ulang repositori dapat menyegarkan metadata atau templat hook. Setelah itu, urutan normalnya adalah git add untuk stage file, lalu git commit untuk mencatat snapshot pertama.


Apa yang Sebenarnya Dilakukan git init?

Pada intinya, filesystem komputer relatif sederhana: filesystem melacak nama file, isi file, ukuran file, dan hierarki direktori. Filesystem tidak secara bawaan memahami riwayat perubahan, identitas author, atau jalur percabangan.

Saat Anda menjalankan git init di sebuah folder, Git membuat database repositori lokal di direktori tersembunyi .git/. File yang sudah ada dibiarkan tanpa perubahan: file tersebut belum dilakukan stage atau commit, dan tidak ada server jarak jauh yang dihubungi.

Git membandingkan working tree dengan keadaan repositori saat Anda menjalankan perintah seperti git status. git init tidak memulai pemantau di latar belakang dan tidak melacak file; gunakan git add dan git commit untuk mencatat pekerjaan.


Apa yang Terjadi di Dalam .git/ (Eksplorasi langsung)

Untuk memahami cara kerja Git, Anda perlu melihat isi direktori .git/. Mari inisialisasikan repositori baru lalu periksa kerangka database internal Git.

Langkah 1: Inisialisasikan Direktori

Pertama, buat direktori baru dan inisialisasikan direktori tersebut:

Jalur, timestamp, kepemilikan, izin, dan pesan persis dalam output shell di bawah ini berbeda-beda bergantung pada sistem operasi, versi Git, pengguna, dan konfigurasi; anggap semuanya sebagai contoh representatif.

$ mkdir git-init-deepdive && cd git-init-deepdive
$ git init
Initialized empty Git repository in /home/admin/Code/git-init-deepdive/.git/

Sekarang mari tampilkan isi folder .git/ yang baru dibuat:

$ ls -al .git/
total 32
drwxr-xr-x 7 admin admin 4096 Jul  7 10:25 .
drwxr-xr-x 3 admin admin 4096 Jul  7 10:25 ..
-rw-r--r-x 1 admin admin   23 Jul  7 10:25 HEAD
-rw-r--r-x 1 admin admin   92 Jul  7 10:25 config
-rw-r--r-x 1 admin admin   73 Jul  7 10:25 description
drwxr-xr-x 2 admin admin 4096 Jul  7 10:25 hooks
drwxr-xr-x 2 admin admin 4096 Jul  7 10:25 info
drwxr-xr-x 4 admin admin 4096 Jul  7 10:25 objects
drwxr-xr-x 4 admin admin 4096 Jul  7 10:25 refs

Mari analisis fungsi setiap entri ini dalam repositori yang baru diinisialisasi:

1. HEAD (Pointer Aktif)

File HEAD adalah file teks biasa yang memberi tahu Git cabang atau commit mana yang sedang aktif. Mari baca isi file ini:

$ cat .git/HEAD
ref: refs/heads/main

Output ini menunjukkan bahwa HEAD menunjuk ke file referensi di refs/heads/main. Namun, jika kita melihat ke dalam repositori, file cabang refs/heads/main belum ada!

$ ls -R .git/refs
.git/refs:
heads/  tags/

.git/refs/heads:
# Empty!

Keadaan ini disebut Unborn Branch. Git mengarahkan HEAD ke target cabang awal (misalnya, main), tetapi tidak membuat referensi cabang sampai commit pertama. Dalam contoh SHA-1 halaman ini, ref tersebut berisi ID objek sepanjang 40 karakter heksadesimal; repositori SHA-256 menggunakan panjang ID yang berbeda.

2. config (Pengaturan Konfigurasi Lokal)

File ini berisi pengaturan tingkat repositori yang mengesampingkan konfigurasi sistem dan global (lihat git config untuk detailnya). Mari lihat pengaturan awal:

$ cat .git/config
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true

Variabel core ini menentukan cara Git berinteraksi dengan filesystem Anda:

  • repositoryformatversion = 0: Menentukan versi format database repositori. Jika Git menemukan versi repositori yang lebih tinggi daripada yang didukungnya, Git akan menolak membacanya.
  • filemode = true: Memberi tahu Git untuk melacak perubahan bit executable POSIX (misalnya, jika Anda membuat skrip dapat dieksekusi melalui chmod +x).
  • bare = false: Menyatakan bahwa ini adalah repositori working standar yang berisi file yang telah di-checkout di disk. Repositori “bare” hanya berisi direktori administratif Git (biasanya untuk server hosting remote) dan nilainya disetel ke true.
  • logallrefupdates = true: Menginstruksikan Git untuk memelihara reflog (riwayat terperinci tentang ke mana tip cabang dan HEAD pernah menunjuk, yang disimpan di .git/logs/).

3. description (Pembantu Web Lama)

Ini adalah file teks biasa yang berisi placeholder: Unnamed repository; edit this file 'description' to name the repository.. File ini digunakan oleh GitWeb (penampil berbasis web lama untuk repositori). Dalam pengembangan modern, file ini diabaikan dan boleh dihapus atau dibiarkan.

4. hooks/ (Otomatisasi Siklus Hidup)

Folder ini berisi templat skrip shell yang mengotomatiskan tugas saat terjadi peristiwa Git (misalnya pre-commit, commit-msg, dan pre-push). Templat ini disalin dari direktori templat instalasi sistem Anda selama inisialisasi.

Secara default, semua skrip di direktori ini berakhiran .sample, sehingga tidak dijalankan. Untuk mengaktifkan sebuah hook, hapus ekstensi .sample dan buat skrip dapat dieksekusi (chmod +x).

5. info/exclude (Daftar Abaikan Lokal Saja)

File ini digunakan untuk menentukan pola yang diabaikan, mirip dengan file .gitignore. Namun, .gitignore di-commit dan dibagikan kepada tim, sedangkan info/exclude hanya berlaku secara lokal. Gunakan file ini untuk mengabaikan file khusus mesin lokal Anda (seperti konfigurasi IDE lokal) tanpa memengaruhi environment developer lain.

6. objects/ (Database Objek)

Ini adalah database penyimpanan inti repositori Anda. Database ini menggunakan penyimpanan berbasis alamat konten untuk menyimpan objek, yang dikelompokkan menjadi:

  • Blob: Menyimpan isi file.
  • Tree: Menyimpan hierarki direktori.
  • Commit: Menyimpan metadata snapshot yang menunjuk ke tree dan parent.

Pada awalnya, database hanya berisi dua subdirektori kosong: info/ dan pack/ (digunakan untuk indeks packfile dan optimasi penyimpanan). Database ini kosong sampai Anda melakukan commit pertama.

7. refs/ (Referensi)

Direktori ini berfungsi sebagai indeks untuk pointer commit repositori Anda. Direktori ini berisi:

  • refs/heads/: Menyimpan pointer cabang lokal.
  • refs/tags/: Menyimpan tag (pointer tetap ke riwayat sebelumnya).
  • refs/remotes/: Menyimpan pointer yang melacak keadaan cabang di repositori remote (dibuat setelah remote ditambahkan).

Opsi Perintah Terperinci & Penggunaan Lanjutan

1. Menginisialisasi Ulang Repositori yang Sudah Ada

Apa yang terjadi jika Anda menjalankan git init di direktori yang sudah menjadi repositori Git?

$ git init
Reinitialized existing Git repository in /home/admin/Code/git-init-deepdive/.git/

Menjalankan git init pada repositori yang sudah ada itu aman. Perintah ini tidak menimpa commit, cabang, index, atau file konfigurasi Anda. Sebaliknya, perintah ini memeriksa direktori, memperbaiki folder metadata yang hilang jika terhapus tanpa sengaja, dan mengambil templat hook yang diperbarui dari direktori templat sistem.

2. Repositori Bare (git init --bare)

Di repositori normal, file proyek yang sudah di-checkout berada di working tree di samping direktori .git/. Repositori bare tidak memiliki working tree yang di-checkout: direktori Git repositori itu sendiri menjadi direktori tingkat atas. Repositori bare biasa dipakai sebagai remote bersama tempat kolaborator melakukan push dan clone.

# Initialize a bare repository
$ git init --bare my-project.git
Initialized empty Git repository in /home/admin/Code/my-project.git/

Mari lihat struktur direktori repositori bare:

$ ls -F my-project.git
HEAD  config  description  hooks/  info/  objects/  refs/

Tidak ada subdirektori .git/ atau file proyek yang di-checkout; entri-entri ini adalah repositori itu sendiri. Untuk pekerjaan sehari-hari, clone repositori bare ke repositori kerja normal. git init --bare memulai repositori kosong—perintah ini tidak menyalin commit dari proyek yang sudah Anda miliki. Untuk membuat salinan bare yang menyertakan riwayat repositori yang ada, gunakan git clone --bare <source> <target>.git. Lihat manual git init resmi dan panduan Pro Git tentang menyiapkan Git di server.

3. Menetapkan Nama Cabang Awal

Secara historis, Git menginisialisasi cabang utama default dengan nama master. Untuk menggunakan konvensi penamaan modern, Anda dapat menentukan nama cabang default saat inisialisasi:

# Initialize a repository with a default branch named "main"
$ git init --initial-branch=main

Anda juga dapat menetapkan nama cabang default ini secara global agar semua perintah git init berikutnya menerapkannya secara otomatis (lihat git config):

$ git config --global init.defaultBranch main

Skenario Dunia Nyata: Menyiapkan Repositori Bersih

Mari kita ikuti langkah untuk menginisialisasi proyek baru dan mengonfigurasinya dengan pengaturan standar sebelum mencatat commit pertama.

Langkah 1: Buat Direktori Proyek dan Inisialisasikan Git

$ mkdir team-portal && cd team-portal
$ git init --initial-branch=main
Initialized empty Git repository in /home/admin/Code/team-portal/.git/

Langkah 2: Tetapkan Konfigurasi Git

Verifikasi konfigurasi pengguna lokal untuk memastikan commit sesuai dengan identitas tim Anda:

$ git config --local user.name "Alex Developer"
$ git config --local user.email "alex@portalproject.com"

Langkah 3: Tentukan Aturan Pengabaian

Buat file .gitignore untuk mencegah file sementara atau cache sistem dilacak:

$ echo "node_modules/" > .gitignore
$ echo ".DS_Store" >> .gitignore
$ echo "*.log" >> .gitignore

Langkah 4: Tulis Kode Awal dan Catat Commit Pertama

Buat file, lakukan stage, lalu catat commit:

$ echo "<h1>Team Portal</h1>" > index.html
$ git add .
$ git commit -m "chore: initial repository layout"
[main (root-commit) f23c92e] chore: initial repository layout
 2 files changed, 4 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 index.html

Mari lihat isi .git/refs/heads/main sekarang setelah kita mencatat commit:

$ cat .git/refs/heads/main
f23c92e10db526ab1a9db3f28249a02ce5c144e1

Keadaan unborn branch telah terselesaikan. Dalam contoh SHA-1/backend files ini, refs/heads/main menunjuk ke ID commit ilustratif yang ditampilkan di atas; ID objek yang persis akan berbeda bergantung pada isi repositori dan metadata commit.


Jebakan dan Kesalahan Umum

1. Repositori Bersarang yang Tidak Sengaja

Kesalahan: Menjalankan git init di dalam subdirektori folder yang sudah dilacak oleh repositori Git.

/my-project/ (.git/ exists)
  └── /src/
        └── /components/ (runs git init here)

Mengapa ini masalah: Subdirektori tersebut menjadi repositori terpisah. Repositori induk biasanya melihatnya sebagai direktori yang tidak terlacak (kecuali diabaikan); repositori induk tidak otomatis menyerap riwayat repositori bagian dalam. Submodule memerlukan konfigurasi eksplisit.

Solusi: Periksa repositori mana yang mencakup direktori saat ini sebelum melakukan inisialisasi:

# This prints the root of the current repository, if there is one.
$ git rev-parse --show-toplevel

Jika Anda tidak sengaja membuat repositori bersarang, menghapus direktori .git/ miliknya akan mengubah file-file tersebut menjadi file biasa di working tree induk, tetapi riwayat dan metadata repositori bersarang akan hilang secara permanen. Verifikasi path persisnya sebelum menghapus:

$ rm -rf path/to/nested-project/.git

2. Menginisialisasi di Direktori Home Sistem

Kesalahan: Menjalankan git init di path default terminal (misalnya, C:\Users\Username\ atau /home/username/) secara tidak sengaja.

Mengapa ini masalah: Git akan mencoba melacak setiap file di komputer Anda, termasuk file desktop, unduhan, aplikasi, dan cache sistem. Hal ini memperlambat terminal dan menimbulkan konflik commit.

Solusi: Temukan dan hapus folder .git yang tidak sengaja dibuat di direktori home Anda:

# Navigate to home and delete the hidden .git directory
$ cd ~
$ rm -rf .git

(Perhatian: Pastikan lagi bahwa Anda berada di direktori home sebelum menjalankan rm -rf .git agar tidak menghapus riwayat proyek yang valid.)

3. Mengedit Objek Database Secara Manual

Kesalahan: Mencoba mengubah, mengganti nama, atau menulis file di dalam .git/objects/ atau .git/refs/ untuk memperbaiki masalah repositori.

Mengapa ini masalah: Database objek Git bergantung pada hashing kriptografis yang tepat. Mengubah satu karakter saja dalam file objek akan merusak hash dan membuat repositori tidak dapat dibaca.

Solusi: Gunakan API baris perintah Git untuk berinteraksi dengan isi repositori, bukan mengedit file di dalam .git/ secara langsung.


Referensi Cepat Perintah

PerintahTindakanKonteks Umum
git initMenginisialisasi repositori Git standarJalankan sekali di root proyek
git init --bareMenginisialisasi repositori tanpa working directoryServer remote / pusat bersama
git init -b <name>Menentukan default cabang khususMenggantikan penamaan master lama
git init --template=<dir>Menginisialisasi repositori dengan templat hook khususMenstandarkan hook tim
rm -rf .gitMembatalkan pelacakan proyek dengan menghapus seluruh riwayat lokalPeringatan: Destruktif dan tidak dapat dibatalkan

FAQ (Pertanyaan yang Sering Diajukan)

Apa yang dilakukan git init?

git init mengubah direktori saat ini menjadi repositori Git dengan membuat subdirektori .git/. Direktori itu menyimpan database objek, referensi cabang, dan konfigurasi lokal. Perintah ini tidak membuat commit dan belum melacak file apa pun, juga tidak menghubungi server. Anda tetap memerlukan git add dan git commit sebelum sesuatu tercatat dalam riwayat.

Apakah git init mengunggah kode saya ke GitHub?

Tidak. git init adalah perintah lokal yang sepenuhnya bekerja pada penyimpanan komputer Anda. Perintah ini menginisialisasi database versi lokal di direktori Anda, tetapi tidak terhubung ke internet atau menautkan ke host eksternal. Untuk mengunggah kode ke GitHub, Anda harus membuat repositori remote di GitHub, menautkannya secara lokal menggunakan git remote add, lalu melakukan push pada commit Anda.

Bagaimana cara membatalkan git init?

Untuk menghapus pelacakan Git dari proyek, hapus folder tersembunyi .git/. Tindakan ini menghapus seluruh riwayat commit, cabang, pengaturan konfigurasi, dan stash. File kerja Anda tetap berada di disk, tetapi tidak lagi dilacak:

$ rm -rf .git

Apa perbedaan repositori Git standar dan bare?

Repositori Git standar berisi folder .git/ di samping working copy file Anda, sehingga Anda dapat mengedit dan melakukan commit secara lokal. Repositori bare hanya berisi file database Git langsung di root (tanpa folder .git/) dan tidak memiliki working directory. Repositori bare digunakan di server remote untuk menyimpan commit yang di-push dengan aman.

Mengapa folder .git disembunyikan secara default?

Direktori .git/ disembunyikan secara default untuk mencegah isinya tidak sengaja diubah, dipindahkan, atau dihapus. Karena seluruh riwayat versi disimpan di folder ini, menghapusnya berarti menghapus seluruh riwayat repositori.


Uji Pengetahuan Anda

Memuat kuis…