Git dengan Github - Manajemen-Cerdas-Informasi/materi-oprec-2022 GitHub Wiki
Git adalah salah satu sistem pengontrol versi (Version Control System) pada proyek perangkat lunak yang diciptakan oleh Linus Torvalds.
Pengontrol versi bertugas mencatat setiap perubahan pada file proyek yang dikerjakan oleh banyak orang maupun sendiri.
Git dikenal juga dengan distributed revision control (VCS terdistribusi), artinya penyimpanan database Git tidak hanya berada dalam satu tempat saja.
Semua orang yang terlibat dalam pengkodean proyek akan menyimpan database Git, sehingga akan memudahkan dalam mengelola proyek baik online maupun offline.
Git sebenarnya akan memantau semua perubahan yang terjadi pada file proyek. Lalu menyimpannya ke dalam database.
Saat kita ingin menyimpan semua perubahan pada file, biasanya kita membuat file baru dengan “save as”. Lalu, file akan menumpuk dalam direktori proyek seperti pada ilustrasi di atas.
Tapi setelah menggunakan Git…
Hanya akan ada satu file dalam proyek dan perubahannya disimpan dalam database.
Git hanya akan menyimpan delta perubahannya saja, dia tidak akan menyimpan seluruh isi file yang akan memakan banyak memori.
Git memungkinkan kita kembali ke versi revisi yang kita inginkan.
Ada beberapa konfigurasi yang harus dupersiapakan sebelum mulai menggunakan Git, seperti name dan email.
Silahkan lakukan konfigurasi dengan perintah berikut ini.
git config --global user.name "Camin MCI"
git config --global user.email [email protected]
Kemudian periksa konfigurasinya dengan perintah:
git config --list
Repositori (repository) dalam bahasa indonesia artinya gudang. Repositori merupakan istilah yang digunakan untuk direktori proyek yang menggunakan Git.
Jika kita memiliki sebuah direktori dengan nama proyek-01 dan di dalamnya sudah menggunakan git, maka kita sudah punya repositori bernama proyek-01.
Pembuatan repositori dapat dilakukan dengan perintah git init nama-dir. Contoh:
git init proyek-01
Perintah tersebut akan membuat direktori bernama proyek-01. Kalau direktorinya sudah ada, maka Git akan melakukan inisialisasi di dalam direktori tersebut.
Perintah git init akan membuat sebuah direktori bernama .git di dalam proyek kita. Direktori ini digunakan Git sebagai database untuk menyimpan perubahan yang kita lakukan.
Hati-hati!
Kalau kita menghapus direktori ini, maka semua rekaman atau catatan yang dilakukan oleh Git akan hilang.
Perintah berikut ini akan membuat repositori pada direktori saat ini (working directory).
git init .
Tanda titik (.) artinya kita akan membuat repository pada direktori tempat kita berada saat ini.
Perintah berikut ini akan membuat repositori pada direktori /var/www/html/camin/.
git init /var/www/html/camin
.gitignore merupakan sebuah file yang berisi daftar nama-nama file dan direktori yang akan diabaikan oleh Git.
Perubahan apapun yang kita lakukan terhadap file dan direktori yang sudah masuk ke dalam daftar .gitignore tidak akan dicatat oleh Git.
Cara mengunakan .gitignore, buat saja sebuah file bernama .gitignore dalam root direktori proyek/repositori.
/cache
test.php
Pada contoh file .gitignore di atas, saya memasukan direktori cache dan file test.php. File dan direktori tersebut akan diabaikan oleh Git.
Pembuatan file .gitignore sebaiknya dilakukan di awal pembuatan repositori.
Sekarang coba tambahkan sebuah file baru. Sebagai contoh, saya akan menambahkan dua file HTML kosong.
Setalah ditambahkan, coba ketik perintah git status
untuk melihat status repositorinya.
Berdasarkan keterangan di atas, saat ini kita berada cabang (branch) master dan ada dua file yang belum ditambahkan ke Git.
Modified adalah kondisi dimana revisi atau perubahan sudah dilakukan, tetapi belum ditandai dan belum disimpan di version control. Contohnya pada gambar di atas, ada tiga file HTML yang dalam kondisi modified.
Staged adalah kondisi dimana revisi sudah ditandai, tetapi belum disimpan di version control. Untuk mengubah kondisi file dari modified ke staged gunakan perintah git add nama_file. Contoh:
git add index.html
Commited adalah kondisi dimana revisi sudah disimpan di version control. perintah untuk mengubah kondisi file dari staged ke commited adalah git commit.
Baiklah, sekarang kita akan sudah tahu kondisi-kondisi file dalam Git. Selanjutnya, silahkan ubah kondisi tiga file HTML tadi menjadi staged dengan perintah git add.
git add index.html
git add about.html
git add contact.html
Atau kita bisa melakukannya seperti ini:
git add index.html about.html contect.html
atau:
git add *.html
Atau seperti ini (semua file dan direktori):
git add .
Setelah itu, cobalah ketik perintah git status lagi. Kondisi filenya sekarang akan menjadi staged.
Setelah itu, ubah kondisi file tersebut ke commited agar semua perubahan disimpan oleh Git.
git commit -m "Commit pertama"
Setelah itu, coba cek dengan perintah git status lagi.
Selamat, revisi pertama sudah kita buat. Selanjutnya cobalah untuk membuat revisi kedua.
Ceritanya ada perubahan yang akan kita lakukan pada file apa saja. Pada contoh ini, pada file index.html.
Setelah itu ketik lagi perintah git status.
Terilhat di sana, file index.html sudah dimodifikasi. Kondisinya skarang berada dalam modified. Lakukan commit lagi seperti revisi pertama.
git add index.html
git commit -m "ditambahkan isi"
Dengan demikian, revisi kedua sudah disipan oleh Git. Mungkin anda belum tahu maksud dari argumen -m, argumen tersebut untuk menambahkan pesan setiap menyimpan revisi.
Sekarang Git sudah mencatat dua revisi yang sudah kita lakukan. Kita bisa ibaratkan revisi-revisi ini sebagai checkpoint pada Game. Apabila nanti ada kesalahan, kita bisa kembali ke checkpoint ini.
Git sudah menyediakan perintah git log untuk melihat catatan log perubahan pada respositori. Contoh penggunaannya:
git log
Maka kita akan melihat log perubahan apa saja yang sudah dilakukan dalam repositori.
Untuk menampilkan log yang lebih pendek, kita bisa menambahkan argumen --oneline.
git log --oneline
Untuk melihat log pada revisi tertentu, kita bisa memasukan nomer revisi/commit.
git log ffdc9c7c44a9aefeea4db0fb7d0cfe8c87a67ac1
Untuk melihat revisi pada file tertentu, kita dapat memasukan nama filenya.
git log index.html
Sekarang kita kan peljari perintah git diff, fungsinya untuk melihat perbedaan perubahan di revisi.
Gunakan perintah berikut ini untuk melihat perubahan yang dilakukan pada revisi tertentu.
git diff ffdc9c7c44a9aefeea4db0fb7d0cfe8c87a67ac1
ffdc9c7c44a9aefeea4db0fb7d0cfe8c87a67ac1adalah nomer revisi yang ingin dilihat.
Lihatlah hasil di atas, simbol plus (+) artinya kode yang ditambahkan. Sedangkan kalau ada kode yang dihapus simbolnya akan menggunakan minus (-).
Apa bila kita melakukan banyak perubahan, maka akan banyak sekali tampil output. Karena itu, kita mungkin hanya perlu melihat perubahan untuk file tertentu saja. Untuk melihat perbandingan perubahan pada file tertentu, gunakan perintah berukut.
git diff index.html
Perintah di atas akan melihat pebedaan perubahan pada file index.html saja.
Perintah untuk membandingkan perubahan pada revisi dengan revisi yang lain adalah sebagai berikut.
git diff contoh:
git diff cf08ca0837cf26f1c595be36bb3a6b815e311be1 06f735af7724558164c87f6b1ce3ca7778eb1c1b
git diff <nama cabang> <nama cabang>
Terkadang pada perubahan yang kita lakukan terjadi kesalahan dan kita ingin mengembalikannya seperti keadaan sebelumnya. Maka kita perlu menyuruh git untuk megembalikannya. Ada beberapa perintah yang digunakan diantaranya: git checkout, git reset, dan git revert.
Jika revisi kita belum staged ataupun committed, kita bisa mengembalikannya menggunakan perintah git checkout nama_file.html.
Contoh: Misalkan kita akan merubah isi dari file index.html pada repositori project-01.
Sekarang kita akan membatalkan perubahan tersebut. Karena kita belum melakukan stage dan commit, maka kita bisa menggnakan perintah:
git checkout index.html
Perubahan yang baru saja kita lakukan akan dibatalkan. Kalau tidak percaya, coba saja periksa file yang sudah dirubah tadi atau cek dengan perintah git status.
$ git status
On branch master
nothing to commit, working directory clean
Hati-hati! Terkadang perintah ini sangat berbahaya, karena akan menghapus perubahan yang baru saja dilakukan.
Bila kita sudah merubah banyak hal, maka itu akan sia-sia setelah menjalankan perintah ini.
Kondisi staged merupakan kondisi file yang sudah di add (git add), namun belum disimpan (git commit) ke dalam Git.
Sebagai contoh, kita lakukan perubahan lagi di file index.html seperti pada contoh sebelumnya.
Setelah itu, kita ubah kondisi file menjadi staged dengan perintah:
git add index.html
Cek statunya dulu:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: index.html
Nah, file index.html sudah masuk ke dalam kondisi staged. Untuk mengubahnya menjadi kondisi modified, kita bisa menggunakan perintah git reset.
git reset index.html
Cek statusnya lagi:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: index.html
no changes added to commit (use "git add" and/or "git commit -a")
Sekarang file index.html sudah dalam kondisi modified, kita bisa membatalkan perubahannya dengan perintah git checkout seperti contoh sebelumnya.
git checkout index.html
Maka perubahan yang kita lakukan akan dibatalkan.
Sekarang bagaimana kalau filenya sudah dalam kondisi commited dan kita ingin mengembalikannya? Untuk melakukan ini, kita harus mengetahui nomer commit, kemudian mengembalikan perubahannya seperti pada nomer commit tersebut.
Misalkan, kita ubah kembali file index.html.
Kemudian kita melakukan commit.
git add index.html
git commit -m "belajar git greget!"
Sekarang kita akan melihat nomer commit dengan perintah git log.
Kita akan mengembalikan kondisi file index.html, seperti pada commit sebelumnya. Maka kita bisa menggunakan perintah:
git checkout ffdc9c7c44a9aefeea4db0fb7d0cfe8c87a67ac1 index.html
Seperti mesin waktu, kita sudah mengembalikan keadaan file index.html seperti keadaan saat commit tersebut. Namun, saat ini kondisi index.html dalam keadaan staged. Kita bisa kembalikan ke dalam kondisi modified dengan perintah git reset.
git reset index.html
Pada contoh tersebut, kita sudah berhasil mengembalikan file index.html ke dalam keadaan seperti commit sebelumnya.
Apabila kita ingin mengembalikan seluruh file dalam commit, kita cukup melakukan checkout ke nomer commit saja, tanpa diikuti nama file. Contoh:
git checkout f0c0d51828669236bd3f7628f3fe966b76c897c4
Catatan: Perintah ini akan mengembalikan semua file dalam kondisi pada nomer commit yang diberikan, namun bersifat temporer.
Jika kita ingin mengembalikan semua file ke suatu commit, kita bisa melakukannya dengan perintah:
git revert -n <nomer commit>
Contoh:
git revert -n ffdc9c7c44a9aefeea4db0fb7d0cfe8c87a67ac1
Bayangkan anda sedang bekerja dengan tim pada suatu repositori Git. Repositori ini dikerjakan secara bersama-sama.
Kadang… akan terjadi konflik, karena kode yang kita tulis berbeda dengan yang lain.
Misalnya, Si A menulis kode untuk fitur X dengan algoritma yang ia ketahui. Sedangkan si B menulis dengan algoritma yang berbeda.
Lalu mereka melakukan commit, dan kode sumber jadi berantakan. Anggota tim yang lain menjadi pusing.
Agar tidak terjadi hal yang seperti ini, kita harus membuat cabang (branch) tersendiri.
Misalnya, si A akan mengerjakan fitur X, maka dia harus membuat cabang sendiri. Si A akan bebas melakukan apapun di cabangnya tanpa menggangu cabang utama (master).
Perintah untuk membuat cabang adalah git branch, kemudian diikuti dengan nama cabangnya.
Contoh:
git branch fitur_register
Maka Git akan membuat cabang bernama fitur_register.
Sekarang setiap orang memiliki cabangnya masing-masing. Mereka bebas bereksperimen.
Untuk melihat cabang apa saja yang ada di repositori, gunakan perintah git branch.
Contoh:
Tanda bintang (*) artinya cabang yang sedang aktif atau Kita sedang berada di sana.
Pada repositori, buatlah sebuah cabang baru.
git branch halaman_login
Setelah itu, pindah ke cabang yang baru saja kita buat dengan perintah:
git checkout halaman_login
Lalu tambahkan file login.html, isinya terserah anda.
Kita sudah menambahkan file login.html. Selanjutnya kita lakukan commit.
git add login.html
git commit -m "membuat file login.html"
Bagus! revisi kita pada cabang halaman_login sudah disimpan. Sekarang coba kembali ke cabang master.
git checkout master
Apakah anda menemukan file login.html?
Pasti tidak!
Sekarang kembali lagi ke cabang halaman_login.
git checkout halaman_login
Cek lagi, apakah sekarang file login.html sudah ada?
Ternyata ada. Yep! kita bisa mengambil kesimpulan, kalau perubahan pada cabang halaman_login tidak akan berpengaruh di cabang master.
Anggaplah kita sudah selesai membuat fitur login di cabang halaman_login. Sekarang kita ingin Menggabungkannya denga cabang master (utama).
Pertama, kita harus pindah dulu ke cabang master.
git checkout master
Setelah itu, barulah kita bisa menggabungkan dengan perintah git merge.
git merge halaman_login
Sekarang lihat, file login.html sudah ada di cabang master.
Hati-hati! kadang sering terjadi conflict/bentrok ketika menggabungkan cabang.
Bentrok biasanya terjadi jika ada dua orang yang mengedit file yang sama.
Kenapa bisa begitu, ‘kan mereka sudah punya cabang masing-masing?
Bisa jadi, di cabang yang mereka kerjakan ada file yang sama dengan cabang lain. Kemudian, saat digabungkan terjadi bentrok.
Mengatasi bentrok adalah tugas dari pemilik atau pengelola repostiri. Dia harus bertindak adil, kode mana yang harus diambil.
Biasanya akan ada proses diskusi dulu dalam mengambil keputusan.
Baiklah, sekarang kita akan coba membuat bentrokan 😄.
Pindah dulu ke branch halaman_login…
git checkout halaman_login
Setela itu, edit file index.html, karena file tersebut ada di kedua cabang yang akan kita gabungkan.
Setelah itu, lakukan commit lagi:
git add .
git commit -m "conflict time"
Selanjutnya pindah ke cabang master dan lakukan perubahan juga di cabang ini. Ubah file yang sama seperti di cabang halaman_login.
Setelah itu, lakukan commit di cabang master
git add .
git commit -m "conflict di cabang master"
Terakhir, coba gabungkan cabang halaman_login dengan cabang master, maka akan terjadi bentrok.
Nah, kita disuruh perbaiki kode yang bentrok. Sekarang buka index.html dengan teks editor.
Kedua kode cabang dipisahkan dengan tanda ======. Sekarang.. tugas kita adalah memperbaikinya.
Silahkan eliminasi salah satu dari kode tersebut.
Setelah itu lakukan commit untuk menyimpan perubahan ini.
git add index.html
git commit -m "perbaiki konflik"
Bagus! bentrokan antar ormas programmer sudah beres.
Cabang yang sudah mati atau tidak ada pengembangan lagi, sebaiknya dihapus.
Agar repositori kita bersih dan rapi.
Cara menghapus cabang, gunakan perintah git branch dengan argumen -d dan diikuti dengan nama cabangnya.
Contoh:
git branch -d halaman_login
Pada proyek pengembangan software yang melibatkan banyak orang (tim), kita tidak hanya akan menyimpan sendiri repository proyeknya.
Semua tim yang terlibat dalam pengkodean (coding) akan menyimpan repository lokal di komputernya masing-masing.
Setelah itu, akan dilakukan penggabungan ke repository inti atau remote.
Biasanya akan ada repository pusat atau untuk menyimpan source code yang sudah digabungkan (merge) dari beberapa orang.
Bisa di server kantor atau bisa juga menggunakan layanan seperti Github, Gitlab, Bitbucket, dll.
Github adalah layanan yang paling populer untuk menyimpan (hosting) repository secara remote. Banyak proyek open source tersimpan di sana.
Kita akan menggunakan Github pada tutorial ini, pastikan kamu sudah memiliki akun Github.
Silahkan buka Github, kemudian buat sebuah repository dengan nama belajar-git seperti berikut ini.
Maka sekarang kita punya repository kosong di Github.
Jangan diapa-apakan dulu.
Silahkan buka kembali repository lokal yang pernah kita buat, yaitu project-01.
Kita akan upload ke Github.
Sebelum kita bisa upload semua revisi yang ada di repository lokal, kita harus menambahkan remote-nya terlebih dahulu.
Remote dapat kita tambahkan dengan perintah seperti ini:
git remote add https://github.com/Manajemen-Cerdas-Informasi/materi-oprec-2022.git
Ada dua pilihan URL remote yang bisa kita berikan:
Melalui HTTPS:
https://github.com/pisang/project-01.git
dan melalui SSH:
[email protected]:pisang/project-01.git
Apa bedanya?
Kalau kita menggunakan HTTPS, maka kita akan diminta password setiap kali melakukan push.
Sedangkan yang menggunakan SSH, kita tidak akan diminta password. Namun, kita harus melakukan konfigurasi SSH Key terlebih dahulu.
Terserah mau menggunakan yang mana
Maka perintah untuk menambahkan remotenya akan menjadi seperti ini:
git remote add origin [email protected]:pisang/project-01.git
Setelah itu, silahkan ketik perintah git remote -v untuk melihat remote apa saja yang sudah ditambahkan.
Bagus, sekarang kita sudah menambahkan remote di dalam repository lokal.
Selanjutnya kita bisa melakukan push atau mengirim revisi ke repository remote (Github).
Perintah yang kita gunakan untuk mengirim revisi ke repository remote adalah git push.
git push origin master
- github adalah nama remote.
- master adalah nama cabang tujuan.
Mari kita coba…
Pastikan repository lokal kita sudah memiliki remote.
Berhasil!
Setelah itu lakukan beberapa revisi atau commit.
git add .
git commit -m "menambahkan beberapa revisi"
Maka tinggal kita kirim saja dengan perintah git push github master.
Jika muncul seperti ini, artinya push sukses dilakukan.
Sekarang liat Github, pasti semuanya sudah ter-upload ke sana.
Saat kita bekerja dengan repository yang memiliki banyak kontributor, kita seharusnya mengambil dulu revisi terbaru dari repository inti agar tidak bentrok.
Misalnya begini.
Pada repository remote ada kontributor lain yang sudah menambahkan dan merubah sesuatu di sana.
Maka kita harus mengambil perubahan tersebut, agar repository lokal kita tetap ter-update atau sama persis seperti repository remote.
Ada dua perintah untuk mengambil revisi dari repository remote:
- git fetch [nama remote] [nama cabang]
- git pull [nama remote] [nama cabang]
Apa perbedaanya?
Perintah git fetch hanya akan mengambil revisi (commit) saja dan tidak langsung melakukan penggabungan (merge) terhadap repository lokal.
Sedangkan git pull akan mengambil revisi (commit) dan langsung melakukan penggabungan (merge) terhadap repository lokal.
Terus kita harus pakai yang mana?
Tergantung dari situasi dan kondisi.
Bila kita sudah membuat perubahan di repository lokal, maka sebaiknya menggunakan git fetch agar perubahan yang kita lakukan tidak hilang.
Namun, bila kita tidak pernah melakukan perubahan apapun dan ingin mengambil versi terakhir dari repository remote, maka gunakanlah git pull.
Clone repository bisa kita bilang seperti copy repository dari remote ke lokal.
Perintah untuk melakukan clone adalah git clone.
git clone https://github.com/Manajemen-Cerdas-Informasi/materi-oprec-2022.git [nama dir]
Keterangan:
https://... adalah URL repository remote, kita juga bisa menggunakan SSH. [nama dir] (opsional) adalah nama direktory yang akan dibuat. Jika kita tidak berikan nama direktori, maka akan otomatis menggunakan nama repository. Mari kita coba…
Lakukan clone.
git clone https://github.com/Manajemen-Cerdas-Informasi/materi-oprec-2022.git
Maka akan ada direktori baru di sana.