Git tidak dirancang sebanyak berevolusi .
Lihatlah sendiri. Kloning repositori git resmi , buka di gitk
(atau viewer git log grafis favorit Anda), dan lihat revisi yang paling awal.
Anda akan melihatnya pada awalnya hanya memiliki fungsionalitas inti (database objek dan indeks). Segala sesuatu yang lain dilakukan dengan tangan . Namun, inti kecil ini dirancang agar mudah diotomatisasi melalui skrip shell. Pengguna awal git menulis skrip shell mereka sendiri untuk mengotomatisasi tugas-tugas umum; sedikit demi sedikit, skrip ini dimasukkan ke dalam distribusi git (lihat contoh awal 839a7a0 ). Setiap kali ada kebutuhan baru, skrip diadaptasi untuk memungkinkannya. Beberapa saat kemudian, beberapa skrip ini akan ditulis ulang dalam C.
Kombinasi dari inti yang bersih dan ortogonal (yang masih dapat Anda gunakan secara langsung jika Anda membutuhkannya), dengan lapisan atas yang tumbuh secara organik di atasnya, adalah yang memberi git kekuatannya. Tentu saja, itu juga yang memberikan sejumlah besar perintah dan opsi yang diberi nama aneh.
Kompresi, grafik, menghilangkan angka revisi, menekankan percabangan, menyembunyikan, remote ... Dari mana semua itu berasal?
Banyak yang tidak ada di awal.
Sementara setiap objek dikompresi secara individual, dan duplikat dihindari dengan penamaan mereka, file "paket" yang bertanggung jawab atas kompresi tinggi yang biasa kita lihat di git tidak ada. Filosofi pada awalnya adalah "ruang disk murah".
Jika dengan "grafik" yang Anda maksud seperti pemirsa grafis gitk
, mereka muncul kemudian (AFAIK, yang pertama adalah gitk
). AFAIK, BitKeeper juga memiliki penampil riwayat grafis.
Menyingkirkan nomor versi, sebenarnya konsep inti git menggunakan filesystem yang ditujukan untuk menyimpan objek, sebagian besar berasal dari monoton . Pada saat itu, monoton lambat; jika ini tidak terjadi, mungkin Linus akan menggunakannya alih-alih membuat git.
Menekankan percabangan agak tidak dapat dihindari pada sistem kontrol versi terdistribusi, karena setiap klon bertindak sebagai cabang terpisah.
Stashing ( git stash
) adalah, IIRC, cukup baru. Reflog, yang digunakannya, tidak ada di awal.
Bahkan remote awalnya tidak ada di sana. Awalnya, Anda menyalin objek menggunakan tangan rsync
.
Satu per satu, masing-masing fitur ini ditambahkan oleh seseorang. Tidak semua dari mereka - mungkin bahkan tidak sebagian besar dari mereka - ditulis oleh Linus. Setiap kali ada yang merasa kebutuhan yang tidak dipenuhi git, seseorang dapat membuat fitur baru di atas lapisan "plumbing" inti git, dan mengusulkannya untuk dimasukkan. Jika itu baik, itu mungkin akan diterima, meningkatkan utilitas git (dan kompleksitas baris perintahnya) lebih jauh.