Git, Kenapa?
Apa sih yang membuat Git berbeda dengan Version Control yang lainnya? Perbedaan antara Git dengan VCS lainnya terlihat pada data apa yang disimpan sebagai pencatatan perubahan file. Pada VCS yang lainnya, data akan disimpan berupa list dari perubahan file-based. Maksudnya adalah sistem ini akan menyimpan informasi berupa sekumpulan file lalu perubahan apa saja yang kita lakukan terhadap file tersebut.
Sementara itu, apa yang dilakukan oleh Git dalam pencatatan perubahan pada file? Berbeda dengan sistem VCS lainnya, Git akan menyimpan data yang ada sebagai snapshots miniatur keseluruhan sistem file. Maksudnya, ketika melakukan commit atau menyimpan state dari project kedalam Git, maka keseluruhan file yang ada akan disimpan gambarannya kedalam sebuah snapshots. Tentu saja terdapat penghematan dari sisi penyimpanan yang dilakukan Git, yaitu untuk file yang sama tidak akan disimpan ulang, melainkan hanya akan disimpan reference link menuju file sebelumnya.
Hal inilah yang menjadi pembeda antara Git dengan VCS lainnya, dimana Git akan menyerupai mini file system yang dapat dilengkapi dengan tools keren lainnya, dibandingkan dengan VCS sederhana lainnya.
Git Workflow
Hal yang sangat penting untuk dipahami dari Git adalah workflow dari Git itu sendiri. Terdapat tiga keadaan yang harus diingat pada Git yaitu: commited, modified, dan staged. Commited adalah ketika data yang ada sudah secara aman disimpan pada database local git. Modified adalah kondisi dimana kita melakukan perubahan terhadap data yang ada tetapi belum melakukan commit. Staged adalah kondisi dimana kita sudah menandai data yang diubah pada versi saat ini, untuk menjadi commit snapshot selanjutnya.
Setelah memahami ketiga keadaan diatas, maka kita akan mendapatkan tiga bagian utama dari Git project, yaitu Git Directory, working tree, dan staging area.
Git directory merupakan tempat dimana Git menyimpan metadata dan object database untuk project kita. Ini adalah bagian terpenting dari Git dan ini adalah hal yang kita pindahkan ketika kita melakukan clone repository.
Working tree adalah sebuah checkout dari suatu versi project yang ada. File yang ada akan di-pull dari Git directory dan ditempatkan pada folder dimana kita akan bekerja untuk melakukan modifikasi file.
Staging area adalah sebuah file, biasanya berada pada Git directory. File ini akan menyimpan informasi mengenai data mana saja yang akan masuk kedalam commit berikutnya. File ini biasanya disebut “index”, tapi biasa juga disebut staging area.
Apabila dirangkum, secara umum berikut adalah workflow dari Git:
- Melakukan modifikasi terhadap file yang ada pada working tree.
- Melakukan staging terhadap file yang dimodifikasi, menambahkan snapshots pada staging area.
- Melakukan commit, dimana akan menyimpan data snapshot yang ada pada staging area untuk disimpan secara permanent pada Git directory.
Apabila terdapat suatu versi file pada Git directory, maka file itu dinyatakan commited. Apabila file yang tadinya dimodifikasi dan ditambahkan ke staging area, maka file tersebut dinyatakan staged. Apabila file tersebut belum di staged, maka dia dinyatakan modified.
I know the theory, then?
Setelah mengetahui teori penggunaan dari Git, saya akan menjelaskan beberapa hal dasar yang harus dipahami dari Git. Bisa dikatakan ini adalah cheatsheet Git sederhana.
Setup
- Untuk mengetahui lokasi Git diinstal
which git
- Mengetahui versi Git terinstall
git --version
- Help
git help
General
- Melakukan inisialisasi
git init
- Melakukan staging terhadap seluruh file
git add .
- Melakukan staging terhadap file tertentu
git add index.html
- Melakukan commit terhadap perubahan yang ada
git commit -m "Message"
- Menghapus file dari Git
git rm index.html
- Melakukan undo terhadap commit yang sudah dilakukan
git checkout -- index.html
- Melakukan restore file dari commit tertenti
git checkout 6eb715d -- index.html
Reset
- Kembali pada commit tertentu
git revert 073791e7dd71b90daa853b2c5acc2c925f02dbc6
- Undo commit terakhir yang dilakukan
git reset --soft ~HEAD
Branch
- Melihat branch apa saja yang ada
git branch
- Membuat sebuah branch baru
git branch branchname
- Pindah ke branch tertentu
git checkout branchname
- Membuat dan pindah ke branch baru
git checkout -b branchname
- Melakukan penamaan ulang pada suatu branch
git branch -m branchname new_branchname
ataugit branch --move branchname new_branchname
- Menghapus branch yang ada
git branch -D branch_to_delete
Merge
- Melakukan merge (apabila terjadi fast forward)
git merge branchname
- Merge ke master (jika fast forward)
git merge --ff-only branchname
- Merge ke master (mode paksa)
git merge --no-ff branchname
- Menghentikan merge (jika konflik)
git merge --abort
- Menghentikan merge (jika konflik)
git reset --merge
// untuk v1.7.4 - Melakukan merge hanya pada commit tertentu
git cherry-pick 073791e7
Stash
- Memasukkan file ke dalam stash
git stash save "Message"
- Melihat stash
git stash list
- Melihat status stash
git stash show stash@{0}
- Melihat perubahan stash
git stash show -p stash@{0}
- Menghapus item custom stash
git stash drop stash@{0}
- Menghapus stash keseluruhan
git stash clear
Compare
- Melakukan komparasi atas file yang dimodifikasi
git diff
- Melakukan komparasi pada modified file dan memberikan highlight pada perubahan yang ada
git diff --color-words index.html
- Komparasi modified file pada tahap staging
git diff --staged
- Melakukan komparasi branch
git diff master..branchname
- Melakukan komparasi commit
git diff 6eb715d
git diff 6eb715d..HEAD
git diff 6eb715d..537a09f
- Komparasi file pada suatu commit
git diff 6eb715d index.html
git diff 6eb715d..537a09f index.html
Gitignore
Adalah sekumpulan file yang akan di ignore oleh Git. Template yang biasa digunakan dalam Gitignore ada di https://github.com/github/gitignore
Kesimpulan
Penggunaan Git akan sangat membantu pekerjaan terutama programmer dan designer ataupun pekerjaan lainnya yang membutuhkan versioning dalam pekerjaannya sehingga mempermudah pekerjaan apabila ingin melakukan perubahan atau memperhatikan perubahan yang ada dari file-file yang digunakan.
Referensi: https://git-scm.com/book/en/v2/Getting-Started-About-Version-Control