Sunday, April 30, 2017

Bekerja dalam tim dengan Git di Bitbucket

Tentang Git
Linus Torvalds merevolusi industri perangkat lunak dua kali, pertama dengan Linux kernel-nya, kedua dengan git. Git merupakan DVCS, distributed version control system, atau dalam man-page nya dikatakan: git - the stupid content tracker. Secara sederhana dapat dikatakan, jika anda mempunyai "sesuatu", entah itu tulisan, novel, source code, gambar, program, dll, yang anda ingin track perubahan tiap versinya, misal dari versi 0.1, 0.3, ... versi n, git-lah yang dapat melakukannya. Dengan git anda tidak perlu khawatir karya anda terhapus karena anda bisa kembali ke versi tertentu kapanpun!

Jika anda baru belajar git, saya sarankan untuk membaca tulisan-tulisan saya tentang pengenalan git sebelumnya:

Tentang Bitbucket
Bitbucket merupakan penyedia layanan git. Ada banyak penyedia layanan git: gitlab, gitorous, github bitbucket, dan bitbucket-lah yang terbaik. Kenapa? Karena bitbucket menyediakan layanan private repository free unlimited, layanan tim (maks 5 user) yang tidak disediakan penyedia lainnya. Dengan bitbucket, kita bisa meng-host karya kita di server cloud mereka secara free. Git akan menyinkronkan data dalam PC kita dan server bitbucket secara aman dengan protokol git, ssh ataupun https.

Anda bisa login dengan mendaftar (sign up) atau dengan menggunakan akun google.



Membuat Tim
Kelebihan git sebagai content tracker adalah kemampuannya bekerja secara simultan. Misal dalam suatu tim bekerja dalam suatu project. Project 1 di-inisiasi, si A melakukan rancangan awal, si B menambahkan, si C memberi tambahan, si D menyempurnakan dan si A merevisi kesalahan yang dibuat si B. Maka, pekerjaan tersebut dapat dengan mudah dilakukan dengan git.

Ilustrasi pekerjaan yang dilakukan secara tim

Saya asumsikan anda sudah bisa membuat repo sendiri. Kini saatnya membuat tim. Caranya, klik tanda plus (+) pada halaman bitbucket anda (saya asumsikan anda menggunakan tampilan baru bitbucket), klik "team" dan isikan data tim anda. Lebih jelasnya, perhatikan gambar di bawah ini.

Membuat tim dalam bit bucket


Menambahkan akses dalam repo
Ada dua cara menambahkan akses orang lain ke dalam repository kita:
  1. Menambahkan akun user lain
  2. Menambah grup/tim
Jadi, sebenarnya anda tidak harus membuat tim untuk menambah hak akses ke dalam repo anda, namun hal itu akan memudahkan kita dalam menambahkan akses ke user lain. Perhatikan gambar di bawah ini untuk lebih jelasnya.

Menambahkan user atau grup dalam repo


Branching dan Merging
Tahap ini merupakan kelanjutan dari tutorial git sebelumnya. By default, saat kita membuat repo baru, ada satu main branch, yang disebut master.

Isi branch master:
$ ls
readme.txt coba.txt 

Kemudian saya membuat "branch" baru dengan nama future-plans,
$ git branch future-plans 
$ echo "from bitbucket tutorial >> location.txt
$ echo "Earth's location" >> location.txt
$ ls
coba.txt  location.txt  readme.md 

Jika saya berpindah ke branch master, maka file location.txt tersebut tidak ada,
$ git checkout master
$ ls 
coba.txt  readme.md 

Maka dua branch tersebut saya gabung dengan perintah git merge
$ git checkout future-plans
$ git merge master future-plans

Maka branch future-plans akan dilebur menjadi satu dengan master. Perhatikan gambar diagram berikut untuk lebih jelasnya.
diagram branch future-plans dan master sebelum dan setelah merge
Jika hanya ingin memindahkan satu file dari branch satu ke branch yang lain, maka perintahnya berikut (asumsi posisi di branch yang dituju):
$ git checkout future-plans namafileygdipindah.txt 

Mengedit file di Bitbucket Cloud
Menambahkan file juga bisa dilakukan secara online melalui web Bitbucket. Misal kita membuat file baru melalui bitbucket, source >> new file.  Kita isi dengan content berikut,
<p>Bitbucket has the following space stations:</p>
<p>
<b>Earth's Moon</b><br>
Headquarters
</p>

Beri nama, misal, stationLocation, kemudian lakukan commit. Di local repo (PC), pull repo tsb untuk mendapatkan update terbaru.
$ git checkout master
$ git pull origin master

Sekarang kita berpindah ke branch future-plans kembali (di Bitbucket cloud sekrang branch ini sudah tidak aktif karena sudah di merge, tapi tetap ada di local PC kita),
$ git checkout future-plans
$ git merge master future-plans

Nah, sekarang file stationLocation.html (ekstensi.html otomatis dikenali dan ditambahkan oleh Bitbucket). Kita edit file tsb menjadi sbb,
<p>Bitbucket has the following space stations:</p>
<p>
<b>Earth's Moon</b><br>
Headquarters
</p>
<p>
<b>Mars</b><br>
Recreation Department
</p>

Save dan close (:wq pada Vim).

Sekarang pada branch "future-plans" telah terjadi perubahan. Bagaimana menggabungkannya dengan branch "master"? Dengan menggunakan merge seperti yang telah digunakan sebelumnya.
$ git status
$ git checkout master
$ git status
$ git merge future-plans
$ git push origin master

Beberepa keterangan saat checkout adalah sebagai berikut (singkatan),
M = modified
A = added
D = deleted
R = renamed
C = copied
U = updated but unmerged

Berikut diagram ilustrasi proses-proses di atas (sumber gambar: Bitbucket).
Proses perubahan dalam branch, merging dan pushing [5]

Repo kita (git-tutorial) sekarang sudah clean dan update. Jika ingin menghapus branch "future-plans" lakukan hal berikut.

git branch -d future-plans

Lebih lengkapnya berikut tentang merging dan rebase (akan diterangkan selanjutnya).
Visualiasi proses branching dan merging [4]



Menyelesaikan Konflik
Masalah yang sering pasti terjadi ketika bekerja dalam tim adalah: konflik. Bahkan, konflik ini pun sering terjadi ketika bekerja secara individu. Konflik dalam git meruapakan permasalahan yang terjadi ketika seorang atau beberapa user mengedit file yang sama, sehingga git bingung, mana yang dipakai. Misal si A dan si B mengedit file animal.txt dan keduanya merubah baris yang sama dengan isi masing-masing.

Persiapan: setting .gitconfig
Sebelum menyelesaikan konfilk, atur .gitconfig menjadi seperti ini (fokus pada merge). Baca setting .gitconfig jika anda baru pertama kali menge-set .gitconfig ini.
$ vim ~/.gitconfig 
[merge]
     tool=vimdiff
     conflictstyle=diff3
     prompt=false

Sekarang kembali ke repo (git-tutorial). Skenario konfliknya adalah sebagai berikut,
$ vim animals.txt
cat
dog
octopus
octocat
pinguing

Sekarang buat branch baru, octodog, dan edit octopus menjadi octodog.
$ git branch octodog
$ git checkout octodog
$ vim animals.txt #edit octopus dengan octodog 
$ git commit -am "change octopus to octodog"

Kemudian pindah ke branch master, edit octopus menjadi octoman, dan merge octodog dengan master.
$ git checkout master
$ vim animals.txt #edit octopus menjadi octoman
$ git commit -am "change octopus menjadi octoman"
$ git merge octodog

Apa yang terjadi? Terjadi konflik sebagai berikut.
Auto-merging animals.txt
CONFLICT (content): Merge conflict in animals.txt
Automatic merge failed; fix conflicts and then commit the result.

Solusi
Solusi dari konflik di atas adalah dengan merge tool. Berikut langkahnya,
$ git mergetool

Maka akan muncul tampilan terminal dengan beberapa tab sbb,
Tampilan git mergetool
Keterangan:
  • Local, merupakan versi yang ada di branch lokal (master) saat ini
  • Base, merupakan versi awal sebelum terjadi konflik
  • Remote, merupakan versi branch (octodog) yang ingin di-merge
Kita juga bisa melihat perbeedaan antar versi dengan perintah berkut.
:diffg RE  " menampilkan isi versi REMOTE
:diffg BA  " menampilkan isi versi BASE
:diffg LO  " menampilkan isi versi LOCAL

Misal, kita ingin memakai versi branch, yakni mengganti octopus dengan octodog, maka kita perlu berpindah ke versi remote (Ctrl + w, j pada vim) kemudian tutup semua tab (:wqa). Jika ingin mengedit lagi, maka edit pada tab paling bawah, misal ganti octodog dengan octo-pinguin, kemudian tutup semuanya. Konflik terselesaikan.

Sesuai alur git, kita dapat mempush origin master untuk mengupdate repo kita di bitbucket cloud.

Visualisasi version control
Sebaik apapun pekerjaan tim kita, jika tampilannya jelek akan dicap jelek pula (itulah realita!). Yang menarik dari version control system, kita bisa mem-visualisasikan kerja tim dalam suatu repository dengan sangat ciamik dengan bantual tool yang disebut gource. Beriut instalasinya pada Ubuntu,

sudo apt install gource
gource .

Perintah di atas akan menginstall gource kemudian mem-visualisasikan direktory repository (.). Berikut tampilan videonya.


Dengan cara ini, kita bisa mengukur kinerja tim, siapa yang paling aktif, file apa saja yang sering diupdate maupun informasi-informasi lainnya berkenaan dengan kerja tim. Untuk menyimpan visualisasi tersebut dalam video .mp4 gunakan perintah di bawah ini.

gource -1280x720 -o - | ffmpeg -y -r 60 -f image2pipe -vcodec ppm -i - -vcodec libx264 -preset ultrafast -pix_fmt yuv420p -crf 1 -threads 0 -bf 0 gource.mp4 

Membuat Bitbucket Page
Kelebihan lain yang ditawarkan Atlassian dalam layanan bitbukectnya adalah tersedianya web page untuk user (maupun untuk project di subdomainnya) yang bisa dimanfaatkan dengan nama domain sebagai berikut,
https://akunanda.bitbucket.io
Bagaimana cara membuatnya? Caranya adalah dengan membuat repo dengan nama yang sama dengan nama akun anda. Misal akun saya bagustris, maka saya membuat repo dengan nama bagustris,

$ mkdir bagustris
$ cd bagustris
$ git init
$ echo "tes" >> index.html
$ git add ./*
$ git remote add origin https://bagustris@bitbucket.org/bagustris/bagustris.bitbucket.org #buat dulu di bitbucket
$ git push origin master

Kemudian cek di bitbucket page, misal milik saya di http://bagustris.bitbucket.io. Berikut tampilannya.


Tampilan web page akun bitbucket dengan bootstrap

Bagaimana dengan repo project? Kita hanya perlu membuat sub-direktori dalam repo akunkita. Sebagai contoh saya punya project simulasi gerak planet di repo berikut, https://bitbucket.org/bagustris/planetsictp16, web page untuk project tersebut saya letakaan dalam folder/direktori "planetsictp16" didalam repo bagustris, sehingga alamat web page dari project tersebut menjadi https://bagustris.io/planetsictp16. Berikut contoh tampilannya.
Tampilan web repo project di bitbucket

Itulah pengalaman saya menggunakan bitbucket, khususnya dalam bekerja dalam tim dengan Git. Tidak hanya mempermudah pekerjaan tim (dan individu), git juga merevolusi cara bekerja kita.

Referensi:
  1. http://www.rosipov.com/blog/use-vimdiff-as-git-mergetool/
  2. https://developer.atlassian.com/blog/2015/12/tips-tools-to-solve-git-conflicts/
  3. https://www.sitepoint.com/getting-started-git-team-environment/
  4. https://gitforteams.com
  5. https://www.atlassian.com/git/tutorials/learn-git-with-bitbucket-cloud 
Related Posts Plugin for WordPress, Blogger...