Git dengan Github - Manajemen-Cerdas-Informasi/materi-oprec-2022 GitHub Wiki

Perkenalan

Mengenal Git

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.

Apa yang dilakukan Git

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.

Git Config

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

Membuat Repositori Baru Dalam Proyek

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.

Membuat Repositori

Pembuatan repositori dapat dilakukan dengan perintah git init nama-dir. Contoh:

git init proyek-01

image

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.

Cara lain

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

.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.

Simpan Perubahan Revisi dengan Git Commit

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.

image

Berdasarkan keterangan di atas, saat ini kita berada cabang (branch) master dan ada dua file yang belum ditambahkan ke Git.

Tiga Kelompok Kondisi File dalam Git

Modified

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

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

Commited adalah kondisi dimana revisi sudah disimpan di version control. perintah untuk mengubah kondisi file dari staged ke commited adalah git commit.

Melakukan Revisi Pertama

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.

image

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.

image

Selamat, revisi pertama sudah kita buat. Selanjutnya cobalah untuk membuat revisi kedua.

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.

image

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.

Melihat Catatan Log Revisi

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.

Beberapa opsi lain

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

Melihat Perbandingan Revisi dengan Git Diff

Sekarang kita kan peljari perintah git diff, fungsinya untuk melihat perbedaan perubahan di revisi.

Melihat Perbandingan Perubahan yang Dilakukan pada Revisi

Gunakan perintah berikut ini untuk melihat perubahan yang dilakukan pada revisi tertentu.

git diff ffdc9c7c44a9aefeea4db0fb7d0cfe8c87a67ac1

ffdc9c7c44a9aefeea4db0fb7d0cfe8c87a67ac1adalah nomer revisi yang ingin dilihat.

image

Lihatlah hasil di atas, simbol plus (+) artinya kode yang ditambahkan. Sedangkan kalau ada kode yang dihapus simbolnya akan menggunakan minus (-).

Melihat Perbandingan pada File

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.

Melihat Perbandingan antar Revisi/Commit

Perintah untuk membandingkan perubahan pada revisi dengan revisi yang lain adalah sebagai berikut.

git diff contoh:

git diff cf08ca0837cf26f1c595be36bb3a6b815e311be1 06f735af7724558164c87f6b1ce3ca7778eb1c1b

Perbandingan antar cabang

git diff <nama cabang> <nama cabang>

Perintah untuk Membatalkan Revisi

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.

Membatalkan Perubahan

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.

image

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.

Membatalkan Perubahan File yang Sudah dalam Kondisi staged

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.

Membatalkan Perubahan File yang Sudah dalam Kondisi Commited

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.

image

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.

Membatalkan Semua Perubahan yang ada

Jika kita ingin mengembalikan semua file ke suatu commit, kita bisa melakukannya dengan perintah:

git revert -n <nomer commit>

Contoh:

git revert -n ffdc9c7c44a9aefeea4db0fb7d0cfe8c87a67ac1

Menggunakan Percabangan untuk Mencegah Konflik

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).

Cara Membuat Cabang Baru

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.

image

Sekarang setiap orang memiliki cabangnya masing-masing. Mereka bebas bereksperimen.

Untuk melihat cabang apa saja yang ada di repositori, gunakan perintah git branch.

Contoh: image

Tanda bintang (*) artinya cabang yang sedang aktif atau Kita sedang berada di sana.

Contoh

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.

image

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?

image

Ternyata ada. Yep! kita bisa mengambil kesimpulan, kalau perubahan pada cabang halaman_login tidak akan berpengaruh di cabang master.

Menggabungkan Cabang

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.

Mengatasi Conflict

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.

image

Nah, kita disuruh perbaiki kode yang bentrok. Sekarang buka index.html dengan teks editor.

image

Kedua kode cabang dipisahkan dengan tanda ======. Sekarang.. tugas kita adalah memperbaikinya.

Silahkan eliminasi salah satu dari kode tersebut.

image

Setelah itu lakukan commit untuk menyimpan perubahan ini.

git add index.html
git commit -m "perbaiki konflik"

Bagus! bentrokan antar ormas programmer sudah beres.

Menghapus Cabang

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

Bekerja dengan Remote Repositori

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.

Membuat Repository di Github

Silahkan buka Github, kemudian buat sebuah repository dengan nama belajar-git seperti berikut ini.

Maka sekarang kita punya repository kosong di Github.

image

Jangan diapa-apakan dulu.

Silahkan buka kembali repository lokal yang pernah kita buat, yaitu project-01.

Kita akan upload ke Github.

Menambahkan dan Menghapus Remote

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.

image

Bagus, sekarang kita sudah menambahkan remote di dalam repository lokal.

Selanjutnya kita bisa melakukan push atau mengirim revisi ke repository remote (Github).

Mengirim Revisi ke Remote Repository

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.

image

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.

image

Mengambil Revisi dari Remote Repository

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 Remote Repository

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.

image

image

⚠️ **GitHub.com Fallback** ⚠️