Kegunaan utama sebuah sistem kontrol versi ialah untuk mengelola kode yang kita miliki, dari versi ke versi. Tapi tentunya kontrol versi tidak akan begitu berguna jika tidak dapat digunakan secara kolaborasi, yaitu mengelola kode yang digunakan oleh tim. Seluruh kontrol versi yang ada, mulai dari cvs sampai dengan git memiliki fitur untuk membantu kolaborasi. Apa saja fitur-fitur kolaborasi yang ditawarkan oleh git? Bagaimana perbedaan git dengan kontrol versi lainnya dalam hal ini? Mari kita lihat.

Catatan: Tulisan ini merupakan bagian 2 dari seri tulisan. Baca bagian lainnya di:

Ebook dari seri tulisan ini juga dapat di-download di sini.

Kolaborasi Klasik: Sistem Terpusat

Model kolaborasi yang ada sejak lama ialah model kolaborasi dengan sistem terpusat. Seperti namanya, dalam model kolaborasi ini kita memiliki sebuah sistem pusat, yang adalah sumber dari seluruh data yang ada. Dalam konteks pengembangan, dalam sistem pusat ini tersimpan kode yang menjadi acuan dari seluruh anggota tim. Ketika ingin menambahkan, menghapus, atau mengubah kode, anggota tim harus mengambil kode dari pusat terlebih dahulu, dan kemudian mengirimkan kode kembali ke pusat setelah perubahan dilakukan.

Model Kolaborasi Terpusat

Model seperti ini merupakan model yang paling sederhana, sehingga mudah dimengerti dan banyak digunakan. Kontrol versi klasik seperti svn dan cvs biasanya menggunakan model kolaborasi seperti ini. Sayangnya, terdapat beberapa kekurangan dari model kolaborasi ini, misalnya:

  1. Bergantung kepada repositori pusat. Bahkan untuk melakukan commit kita harus terkoneksi ke pusat terlebih dahulu. Kita otomatis tidak dapat bekerja dengan aman ketika repositori tidak dapat diakses (dan percayalah, hal ini sering terjadi, entah karena Internet yang (tidak) anti-lelet atau server bermasalah).
  2. Satu titik pusat kegagalan. Bayangkan jika suatu hari kantor anda diserang teroris, dan server pusat anda dibom. BAM. Seluruh sejarah revisi menghilang. Kode mungkin saja aman dan dapat diambil dari klien, tetapi seluruh revisi yang ada tidak lagi dapat dikembalikan.
  3. Branching dan merging SANGAT KOMPLEKS. Bagian ini agak sulit dijelaskan tanpa merasakan langsung, tapi percayalah. Tanyakan kepada tetua yang pernah menggunakan svn atau cvs apakah ada yang senang melakukan branching atau merging pada kedua sistem tersebut. Kalau ada yang senang, kemungkinan dia adalah masokis.

Kembali ke topik, git pada awalnya dikembangkan untuk digunakan pada pengembangan kernel Linux, yang memiliki sangat banyak kontributor. Fitur kolaborasi tentunya adalah hal yang sangat penting untuk dapat mengakomodasi kasus pengunaan tersebut. Karenanya, git dikembangkan dengan asumsi akan terdapat ribuan atau bahkan ratusan ribu kolabolator. Dan memang akhirnya git membuat revolusi pada sistem kolaborasi kontrol versi. Mempersembahkan, sistem kolaborasi terdistribusi.

Sistem Kolaborasi Terdistribusi

Perbedaan utamanya dengan sistem terpusat? Tidak terdapat repositori pusat yang menjadi acuan (duh). Untuk mempermudah, bandingkan ilustrasi kolaborasi terdistribusi di bawah dengan ilustrasi model kolaborasi terpusat sebelumnya.

Model kolaborasi terdistribusi

Semua anggota tim melakukan pembaruan kode pada repositorinya sendiri, dan jika ingin menggabungkan kode dengan anggota tim lain, kita dapat langsung berkomunikasi dengan anggota tim yang bersangkutan, dan kemudian melakukan merging. Kenapa melakukan merging? Bukankah tadi dikatakan bahwa proses merging sangat ribet? Well, inilah salah satu kelebihan git, proses branching dan merging dapat dilakukan dengan sangat mudah, terutama karena kedua proses ini adalah inti dari sistem kontrol versi terdistribusi (selanjutnya akan dirujuk sebaagi DVCS - Decentralized Version Control Sistem).

Tapi, tapi, bukankah kita tetap perlu sebuah repositori pusat, untuk menjadi acuan dari program akhir yang dapat selalu berjalan? Semua orang yang belum mengenal DVCS

Pada dasarnya iya, di satu titik kita akan memerlukan satu repositori final yang menjadi acuan akhir. Pada DVCS, biasanya dilakukan salah satu dari dua hal berikut untuk masalah tersebut:

  1. Repositori salah satu anggota (biasanya pemimpin tim) dijadikan sebagai acuan. Perangkat lunak yang dirilis merupakan hasil kompilasi dari repositori ini.
  2. Terdapat satu repositori pusat, yang dapat diperbaharui oleh semua anggota tim. Repositori ini kemudian akan dikompilasi secara otomatis, dan terkadang juga menjalankan pengujian. Sistem seperti ini dikenal dengan nama Continuous Integration (CI).

Terlepas dari manapun yang digunakan, pada akhirnya tetap saja DVCS memiliki model terdistribusi - kita dapat saling berbagi kode dengan anggota lainnya tanpa harus terkoneksi dengan repositori pusat. Commit juga dapat dilakukan tanpa perlu adanya repositori pusat (perhatikan bahwa pada bagian sebelumnya kita sama sekali tidak melakukan konfigurasi repositori pusat).

Kolaborasi pada git

Daripada berteori terlalu banyak, kita akan langsung melakukan praktek berkolaborasi dengan git. Mari mulai membuat sebuah repositori baru:

[email protected] ~
$ cd Desktop/

[email protected] ~/Desktop
$ mkdir polijuice

[email protected] ~/Desktop
$ cd polijuice/

[email protected] ~/Desktop/polijuice
$ git init
Initialized empty Git repository in c:/Users/bert/Desktop/polijuice/.git/

Kemudian kita tambahkan file baru di dalam repositori. Misalkan kita ingin mencatat ressep pembuatan ramuan polijus. Buat file polijus.txt yang isinya adalah:

Bagian 1

1. Masukkan tiga takaran fluxweed ke dalam panci.
2. Tambahkan dua ikat knotgrass ke dalam panci.
3. Aduk tiga kali, searah jarum jam.
4. Ayunkan tongkat dan biarkan ramuan matang sendiri selama 60 menit.
5. Masukkan empat ekor lintah ke dalam panci.
6. Tambahkan dua sendok lalat lacewing yang telah ditumbuk menjadi bubuk ke dalam panci.
7. Panaskan selama 30 detik, dalam suhu rendah.
8. Ayunkan tongkat untuk menyelesaikan ramuan.

dan kemudian lakukan penambahan file dan commit. Langkah opsional: buat ramuan polijus dan coba minum setelah selesai di langkah 8.

[email protected] ~/Desktop/polijuice (master)
$ git add .

[email protected] ~/Desktop/polijuice (master)
$ git commit -m "Penambahan resep polijus"
[master (root-commit) ecd0cac] Penambahan resep polijus
 1 file changed, 10 insertions(+)
 create mode 100644 polijus.txt

Catatan: Perhatikan bahwa pada commit kali ini digunakan perintah git commit -m, yang berguna untuk memberikan pesan commit secara langsung dalam satu perintah.

Selesai menyimpan, maka kita (selanjutnya disebut “Alex”) langsung mencoba membuat ramuan polijus, menggunakan langkah-langkah yang tertulis di atas. Hasilnya tidak menyenangkan. Kaki Alex menjadi gemuk, bercakar, dan berbulu putih, seperti kaki beruang kutub. Sayangnya, bagian lain dari tubuh tidak ikut berubah - bahkan tidak mengalami efek apa-apa (Alex tidak akan keberatan jika beurbah dapat menjadi beruang kutub selama satu jam)! Efek samping ini tentunya adalah tanda bahwa ada sesuatu yang salah pada ramuan tesebut. Alex kemudian meminta bantuan dari Ramiel, profesor ramuan terbaik di dunia. Agar Ramiel dapat melihat resep anda, Alex terlebih dahulu harus mempersiapkan repositori untuk dibagikan ke publik, dengan menggunakan perintah git daemon:

[email protected] ~/Desktop/polijuice (master)
$ git daemon --reuseaddr --base-path=. --export-all --verbose
[8812] Ready to rumble

Setelah mempersiapkan repositori anda, Ramiel kemudian dapat mengambil data dari repositori anda melalui perintah git clone:

[email protected] ~/Users/ramiel/Desktop
$ git clone git://127.0.0.1/ polijuice
Cloning into 'polijuice'...
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.

Apa yang barusan terjadi? Ramiel melakukan pengambilan kode dari repositori anda, yang terletak pada git://127.0.0.1/, dengan nama proyek polijuice. Meskipun pada contoh ini kita menggunakan protokol git, pada dasarnya git juga mendukung protokol lain seperti http, https, maupun ssh. Dan untuk alasan keamanan, pengunaan protokol https atau ssh sangat disarankan. Tulisan ini menggunakan protokol git untuk menyederhanakan kasus, dan mempermudah contoh. Kembali ke topik, sintaks dari git clone adalah:

git clone [lokasi-repositori-atau-file-.git]

Perhatikan juga bahwa ketika ada yang mengambil kode, maka anda akan diberi notifikasi. Log pada terminal anda akan bertambah seperti berikut:

[email protected] ~/Desktop/polijuice (master)
$ git daemon --reuseaddr --base-path=. --export-all --verbose
[8812] Ready to rumble
[8004] Connection from 127.0.0.1:62777
[8004] Extended attributes (16 bytes) exist <host=127.0.0.1>
[8004] Request upload-pack for '/'

Setelah mengambil data, Ramiel terlebih dahulu memastikan bahwa data yang diambil adalah data yang benar:

[email protected] ~/Users/ramiel/Desktop
$ cd polijuice/

[email protected] ~/Users/ramiel/Desktop/polijuice (master)
$ ls
polijus.txt

[email protected] ~/Users/ramiel/Desktop/polijuice (master)
$ cat polijus.txt
Bagian 1

1. Masukkan tiga takaran fluxweed ke dalam panci.
2. Tambahkan dua ikat knotgrass ke dalam panci.
3. Aduk tiga kali, searah jarum jam.
4. Ayunkan tongkat dan biarkan ramuan matang sendiri selama 60 menit.
5. Masukkan empat ekor lintah ke dalam panci.
6. Tambahkan dua sendok lalat lacewing yang telah ditumbuk menjadi bubuk ke dalam panci.
7. Panaskan selama 30 detik, dalam suhu rendah.
8. Ayunkan tongkat untuk menyelesaikan ramuan.

[email protected] ~/Users/ramiel/Desktop/polijuice (master)
$ git log
commit ecd0cacf60d4e56f2e4ebd9de2776fc6ac7e3bbe
Author: Alex Xandra Albert Sim <[email protected]>
Date:   Sat Dec 29 14:07:43 2012 +0700

    Penambahan resep polijus

Perhatikan bahwa meskipun kita sedang berada pada akun Ramiel, data commit yang diberikan oleh git log tetap mencatat commit pertama dilakukan oleh [email protected] Kembali ke topik, sebagai seorang profesor ramuan, Ramiel langsung menyadari bahwa terdapat kesalahan pada langkah keempat, dan bagian dua belum ditambahkan. Pertama-tama, ramiel melakukan perbaikan pada langkah keempat terlebih dahulu.

Perubahan pada langkah keempat

Berikut adalah langkah-langkah yang dilakukan:

[email protected] ~/Users/ramiel/Desktop/polijuice (master)
$ vim polijus.txt

// lakukan perubahan...

[email protected] ~/Users/ramiel/Desktop/polijuice (master)
$ git diff polijus.txt
diff --git a/polijus.txt b/polijus.txt
index d58baa9..a0fb16d 100644
--- a/polijus.txt
+++ b/polijus.txt
@@ -3,7 +3,7 @@ Bagian 1
 1. Masukkan tiga takaran fluxweed ke dalam panci.
 2. Tambahkan dua ikat knotgrass ke dalam panci.
 3. Aduk tiga kali, searah jarum jam.
-4. Ayunkan tongkat dan biarkan ramuan matang sendiri selama 60 menit.
+4. Ayunkan tongkat dan biarkan ramuan matang sendiri selama 80 menit jika mengg
 5. Masukkan empat ekor lintah ke dalam panci.
 6. Tambahkan dua sendok lalat lacewing yang telah ditumbuk menjadi bubuk ke dal
 7. Panaskan selama 30 detik, dalam suhu rendah.

[email protected] ~/Users/ramiel/Desktop/polijuice (master)
$ git commit -am "Perbaikan pada langkah 4"
[master a0ba939] Perbaikan pada langkah 4
 1 file changed, 1 insertion(+), 1 deletion(-)

Langkah-langkah di atas dapat dilakukan terlepas apakah anda masih menjalankan perintah git daemon atau tidak. Bahkan jika komputer anda sama sekali tidak hidup (sehingga repositori tidak dapat diakses), langkah-langkah di atas tetap dapat dijalankan. Sekarang, mari kita lihat status revisi yang ada:

[email protected] ~/Users/ramiel/Desktop/polijuice (master)
$ git log
commit a0ba93957a475bc54888e9b04a9b716c94cb3856
Author: Ramiel <[email protected]>
Date:   Sat Dec 29 14:38:40 2012 +0700

    Perbaikan pada langkah 4

commit ecd0cacf60d4e56f2e4ebd9de2776fc6ac7e3bbe
Author: Alex Xandra Albert Sim <[email protected]>
Date:   Sat Dec 29 14:07:43 2012 +0700

    Penambahan resep polijus

git telah berhasil mencatat perubahan tersebut dengan benar. Perhatikan juga bagaimana kita dapat melihat perbedaan repositori Ramiel dengan repositori Alex ketika menjalankan perintah git status:

[email protected] ~/Users/ramiel/Desktop/polijuice (master)
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit, working directory clean

Pesan “Your branch is ahead of ‘origin/master’ by 1 commit.” memberitahukan bahwa kode pada repositori Ramiel berada 1 commit di depan repositori origin/master. Dari mana origin/master berasal? Apa artinya?

Setiap kali kita melakukan git clone terhadap sebuah repositori, git akan mencatat asal repositori kita, dan memberi nama repositori tersebut origin. master merupakan nama cabang tempat kita bekerja sekarang, dan paralelnya pada origin. Hal ini dilakukan untuk mempermudah kita merujuk ke repositori asal. Jika ingin melakukan pengiriman kode misalnya, kita dapat langsung menuliskan git push origin master. Penjelasan mengenai percabangan (master dalam kasus ini) akan dilakukan pada artikel-artikel berikutnya.

Ramiel muncul sebagai nama penulis. Sampai titik ini, jika Ramiel ingin memberitahukan mengenai perubahan tersebut, Ramiel dapat mengirimkan pesan ke Alex. Untuk mempermudah, git menyediakan fasilitas untuk menghasilkan pesan yang ingin dikirimkan, melalui perintah git request-pull. Tentunya sebelum melakukan request-pull, repositori Ramiel harus siap terlebih dahulu:

[email protected] ~/Users/ramiel/Desktop/polijuice (master)
$ git daemon --reuseaddr --base-path=. --export-all --verbose
[10980] Ready to rumble

[email protected] ~/Users/ramiel/Desktop/polijuice (master)
$ git request-pull -p origin/master git://localhost/
The following changes since commit ecd0cacf60d4e56f2e4ebd9de2776fc6ac7e3bbe:

  Penambahan resep polijus (2012-12-29 14:07:43 +0700)

are available in the git repository at:

  git://localhost/ master

for you to fetch changes up to a0ba93957a475bc54888e9b04a9b716c94cb3856:

  Perbaikan pada langkah 4 (2012-12-29 14:38:40 +0700)

----------------------------------------------------------------
Ramiel (1):
      Perbaikan pada langkah 4

 polijus.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/polijus.txt b/polijus.txt
index d58baa9..a0fb16d 100644
--- a/polijus.txt
+++ b/polijus.txt
@@ -3,7 +3,7 @@ Bagian 1
 1. Masukkan tiga takaran fluxweed ke dalam panci.
 2. Tambahkan dua ikat knotgrass ke dalam panci.
 3. Aduk tiga kali, searah jarum jam.
-4. Ayunkan tongkat dan biarkan ramuan matang sendiri selama 60 menit.
+4. Ayunkan tongkat dan biarkan ramuan matang sendiri selama 80 menit jika mengg
unakan panci timah campuran, 68 menit pada panci kuningan, dan 60 menit pada pan
ci kaleng.
 5. Masukkan empat ekor lintah ke dalam panci.
 6. Tambahkan dua sendok lalat lacewing yang telah ditumbuk menjadi bubuk ke dal    am panci.
 7. Panaskan selama 30 detik, dalam suhu rendah.

Keluaran dari git request-pull ini kemudian dapat dikirimkan ke Alex, baik melalui email ataupun metode lainnya. Keluaran ini memiliki beberapa informasi utama, yaitu:

  1. Commit tambahan (pada pesan: “The following changes since commit ecd0ca...”)
  2. Tempat pengambilan perubahan (pada pesan: “are available in the git repository at:”)
  3. Perubahan yang terjadi (Setelah “---------------------”)

Tetapi pesan ini tentunya akan menjadi terlalu panjang jika terdapat banyak perubahan, misalnya jika terdapat banyak file yang diubah. Kita dapat mempersingkat teks dengan membuang parameter -p, seperti berikut:

[email protected] ~/Users/ramiel/Desktop/polijuice (master)
$ git request-pull origin/master git://localhost/
The following changes since commit ecd0cacf60d4e56f2e4ebd9de2776fc6ac7e3bbe:

  Penambahan resep polijus (2012-12-29 14:07:43 +0700)

are available in the git repository at:

  git://localhost/ master

for you to fetch changes up to a0ba93957a475bc54888e9b04a9b716c94cb3856:

  Perbaikan pada langkah 4 (2012-12-29 14:38:40 +0700)

----------------------------------------------------------------
Ramiel (1):
      Perbaikan pada langkah 4

 polijus.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Setelah mendapatkan pesan tersebut, Alex kemudian dapat mengambil perubahan yang dibuat oleh Ramiel dengan perintah git pull, sambil memberikan alamat yang ada:

[email protected] ~/Desktop/polijuice (master)
$ git pull git://localhost/ master
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From git://localhost
 * branch            master     -> FETCH_HEAD
Updating ecd0cac..a0ba939
Fast-forward
 polijus.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

[email protected] ~/Desktop/polijuice (master)
$ git log
commit a0ba93957a475bc54888e9b04a9b716c94cb3856
Author: Ramiel <[email protected]>
Date:   Sat Dec 29 14:38:40 2012 +0700

    Perbaikan pada langkah 4

commit ecd0cacf60d4e56f2e4ebd9de2776fc6ac7e3bbe
Author: Alex Xandra Albert Sim <[email protected]>
Date:   Sat Dec 29 14:07:43 2012 +0700

    Penambahan resep polijus

Perhatikan juga bahwa status revisi pada repositori Alex telah berubah, sama dengan yang ada pada repositori Ramiel. Satu hal yang tersisa adalah, repositori Ramiel belum mengetahui bahwa perubahan yang dikirimkannya telah diterima oleh repositori Alex. Hal ini dapat diketahui dengan menjalankan git status pada repositori Ramiel:

[email protected] ~/Users/ramiel/Desktop/polijuice (master)
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit, working directory clean

Perhatikan bahwa repositori Ramiel masih mengira ia berada satu commit di depan origin/master. Pada kenyataannya, origin/master telah memiliki revisi yang sama dengan repositori Ramiel. Idealnya, Ramiel harus melakukan git pull lagi terhadap repositori Alex, untuk melakukan sinkronasi kode (meskipun langkah ini tidak harus dilakukan setiap waktu, git cukup mampu untuk melakukan merging ketika terjadi masalah seperti ini). Karena sedang memberikan contoh, maka kita akan langsung melakukan git pull sekarang:

[email protected] ~/Users/ramiel/Desktop/polijuice (master)
$ git pull origin
From git://127.0.0.1
   ecd0cac..a0ba939  master     -> origin/master
Already up-to-date.

[email protected] ~/Users/ramiel/Desktop/polijuice (master)
$ git status
# On branch master
nothing to commit, working directory clean

Dan repositori Ramiel sekarang telah tersinkronasi dengan baik.

Kesimpulan

Sampai titik ini kita telah mempelajari bagaimana git bekerja secara terdistribusi, meskipun masih terdapat beberapa pertanyaan yang belum terjawab, misalnya: bagaimana jika Ramiel dan Alex melakukan perubahan pada file yang sama, dalam commit yang sama? Apa yang akan terjadi kalau Ramiel menambahkan file baru dalam satu commit, sementara Alex mengubah sebuah file? Resep bagian dua dari ramuan polijus itu apa? Apakah Alex berhasil kembali menjadi manusia seutuhnya?

Pertanyaan-pertanyaan di atas akan kita jawab pada bagian berikutnya. Sementara ini, mari kita lihat kembali alur kerja yang umumnya kita gunakan ketika berkolaborasi menggunakan git:

  1. Bagikan repositori dengan perintah git daemon.
  2. Jika sudah lama tidak dilakukan, ambil terlebih dahulu kode dari repositori anggota tim dengan perintah git pull.
  3. Lakukan pekerjaan anda. Ubah file, tambahkan, kurangi, dll.
  4. Lakukan commit secara lokal.
  5. Jalankan langkah 3-4 sampai pekerjaan selesai.
  6. Ketika sudah selesai melakukan pekerjaan, minta anggota lain mengambil perubahan yang anda lakukan dengan perintah git request-pull.
  7. Sinkronasikan repositori anda dengan repositori anggota tim menggunakan perintah git pull.

Tidak usah takut jika langkah-langkah di atas terlihat tidak efisien dan rumit. Hal ini hanya dikarenakan oleh pembahasan kita yang belum lengkap. Pada akhir seluruh seri tulisan ini, akan terdapat langkah-langkah yang lebih sederhana dan efisien dalam berkolaborasi. Untuk sementara, setelah membaca tulisan ini anda seharusnya dapat melakukan hal-hal berikut:

  1. Mempersiapkan repositori anda untuk berbagi kode dengan anggota tim lain.
  2. Mengambil kode dari repositori lain.
  3. Mengirimkan pull request

Selamat mencoba hal-hal di atas, dan happy coding!

comments powered by Disqus

Daftar Isi