Pernakah anda ingin mengimplementasikan satu bagian program, tapi tidak ingin kode utama yang sudah bekerja dngan baik sekarang terganggu? Masih tidak yakin bagaimana akan mengimplementasikan fungsi perhitungan gaji, tapi perlu dipakai sebagai fungsi dummy sementara ini? Ingin bereksperimen, tetapi takut “mengotori” kode yang ada sekarang? Apakah anda menjadi terpaksa memiliki dua direktori, satu untuk kode utama dan satu lagi untuk eksperimen? Sudah saatnya meninggalkan hari-hari itu kawan, karena kita akan melihat bagaimana git menangani hal tersebut: branching (percabangan).

Catatan: Tulisan ini merupakan bagian 4. Jika anda belum membaca bagian-bagian sebelumnya, silahkan baca dahulu:

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

Mengapa Bercabang?

Seperti yang telah dijelaskan sebelumnya, percabangan membantu kita dalam melakukan eksperimen, tanpa harus takut merusak kode yang ada sekarang. Implementasi fitur baru yang belum jelas kebutuhannya, percobaan kode baru untuk optimasi, dan berbagai eksperimen lain yang umum dilakukan dapat kita jalankan dalam cabang baru, agar eksperimen tersebut tidak merusak kode utama kita.

Percabangan juga kerap kali digunakan untuk membuat kode baru, yang kemudian akan dikirimkan ke repositori utama. Pembuatan cabang baru untuk setiap pengembang akan memudahkan koordinasi, karena setiap pengembang dapat bekerja secara independen, tanpa harus terganggu oleh kode yang dikerjakan oleh pengembang lainnya. Dalam svn, metode utama untuk mengisolasi kode tiap pengembang adalah dengan percabangan (karena svn tidak terdistribusi seperti git). Meskipun ide ini tidak baru, tetapi git membuat percabangan mudah, cepat, dan menyenangkan (terutama ketika harus melakukan merging antar cabang), sehingga percabangan dapat dikatakan sebagai salah satu fitur inti dari git.

Untuk mempermudah pengertian, kita akan langsung menuliskan kode dan mencoba berbagai fitur yang ada dalam percabangan. Misalkan kita sedang berada di dalam sebuah proyek untuk membuat blog, dengan isi repositori sebagai berikut:

[email protected] ~/Desktop/projects/blog (master)
$ ls
about.html  index.html  readme.md

[email protected] ~/Desktop/projects/blog (master)
$ git log
commit b921ec5bcffdb308636112dcfb78615b8a77403a
Author: Alex Xandra Albert Sim <[email protected]>
Date:   Thu Jan 10 16:19:02 2013 +0700

    About page.

commit 263ab58c58665f96ce771c5709bbfc5fa1d34e78
Author: Alex Xandra Albert Sim <[email protected]>
Date:   Thu Jan 10 16:17:59 2013 +0700

    Inisiasi proyek

Dan sampai titik ini, kita masih tidak yakin apakah akan menambahkan post pertama terlebih dahulu, ataukah harus membuat sebuah file TODO sebagai daftar sederhana akan tulisan yang ingin kita tuliskan.

Dasar Percabangan

Membuat Cabang Baru

Karena masih belum yakin dengan apa yang harus dilakukan terlebih dahulu, kita mencoba membuat sebuah halaman TODO terlebih dahulu. Tetapi agar tidak membingungkan, kita tidak ingin TODO tersebut “mengotori” kode. Karenanya, kita akan membuat cabang baru untuk bekerja dengan file TODO tersebut. Sebelum mulai, kita akan melihat daftar cabang yang ada sekarang, menggunakan perintah git branch:

[email protected] ~/Desktop/projects/blog (master)
$ git branch
* master

Jadi sekarang kita baru memiliki satu cabang, dengan nama “master”. Cabang ini merupakan cabang utama yang secara otoamtis dibuat ketika kita menginisialisasi repositori git. Untuk sementara, repositori kita sekarang dapat diilustrasikan seperti berikut:

Repositori Awal

Seperti yang dapat dilihat, kita telah memiliki dua commit, dengan hanya satu cabang: master, yang berada pada commit terbaru. Sekarang, mari kita buat cabang baru (lagi-lagi) dengan perintah git branch:

[email protected] ~/Desktop/projects/blog (master)
$ git branch todo

[email protected] ~/Desktop/projects/blog (master)
$ git branch
* master
  todo

Berpindah Cabang

Seperti yang dapat kita lihat, sekarang kita telah memiliki dua cabang, yaitu “master” dan “todo”. Cabang yang sedang aktif dapat dilihat melalui dua cara, yaitu pada teks (nama cabang) sebelum prompt (pada contoh di atas, (master)) ataupun dengan melihat tanda * pada hasil perintah git branch. Mari kita coba berpintah ke cabang todo, untuk melihat tanda perubahan cabang. Perintah untuk berpindah cabang ialah git checkout:

[email protected] ~/Desktop/projects/blog (master)
$ git checkout todo
Switched to branch 'todo'

[email protected] ~/Desktop/projects/blog (todo)
$ git branch
  master
* todo

Perhatikan bahwa (master) telah berubah menjadi (todo), dan tanda * hasil respon perintah git branch telah berpindah ke samping todo. Jadi, sampai tahap ini kita telah memiliki dua cabang, “todo” dan “master”, yang masing-masing berada pada commit terbaru. Ilustrasinya:

Repositori dengan dua cabang

Sekarang mari kita coba bekerja pada cabang yang berbeda dan lihat apa yang terjadi.

Bekerja pada Cabang Lain

Karena sekarang kita sedang berada di dalam cabang “todo”, kita dapat saja langsung melakukan hal yang kita mau. Segala hal yang kita lakukan pada cabang ini tidak akan mempengaruhi cabang “master”. Misalnya, kita membuat sebuah file baru, bernama TODO, dengan langkah sebagai berikut:

  1. Buat file baru bernama TODO:

    [email protected] ~/Desktop/projects/blog (todo)
    $ touch TODO
    
  2. Cek apakah file berhasil dibuat:

    [email protected] ~/Desktop/projects/blog (todo)
    $ ls
    TODO  about.html  index.html  readme.md
    
  3. Tambahkan TODO ke dalam repositori git:

    [email protected] ~/Desktop/projects/blog (todo)
    $ git add TODO
    
  4. Lakukan commit:

    [email protected] ~/Desktop/projects/blog (todo)
    $ git commit -m "Penambahan file TODO"
    [todo ff5650b] Penambahan file TODO
     0 files changed
     create mode 100644 TODO
    

Setelah menambahkan file tersebut, kita dapat berpindah ke cabang “master”, dan kita tidak akan melihat file TODO:

[email protected] ~/Desktop/projects/blog (todo)
$ git checkout master
Switched to branch 'master'

[email protected] ~/Desktop/projects/blog (master)
$ ls
about.html  index.html  readme.md

Hal ini dikarenakan oleh struktur percabangan git yang unik: setiap cabang memiliki file tersendiri, dan kita tidak akan melihat isi dari cabang lain. Hal ini menyebabkan kita bebas melakukan eksperimen dalam satu cabang, dan kemudian membuang cabang tersebut jika memang hasil eksperimen tidak sesuai dengan keinginan kita.

Kembali ke topik, sekarang cabang repositori kita akan terlihat seperti berikut:

Repositori dengan dua cabang

Untuk memperjelas perbedaan antara kedua cabang tersebut, mari kita bekerja lebih jauh lagi dalam cabang “todo”, mengikuti langkah-langkah berikut:

  1. Pindah ke cabang “todo”:

    [email protected] ~/Desktop/projects/blog (master)
    $ git checkout todo
    Switched to branch 'todo'
    
  2. Pastikan isi cabang benar:

    [email protected] ~/Desktop/projects/blog (todo)
    $ ls
    TODO  about.html  index.html  readme.md
    
  3. Lakukan perubahan pada file TODO:

    [email protected] ~/Desktop/projects/blog (todo)
    $ vim TODO
    
  4. Commit perubahan tersebut:

    [email protected] ~/Desktop/projects/blog (todo)
    $ git commit -am "Menambahkan 3 TODO awal"
    [todo 7be3730] Menambahkan 3 TODO awal
     1 file changed, 5 insertions(+)
    
  5. Cek daftar commit untuk melihat bahwa sejarah repositori telah benar:

    [email protected] ~/Desktop/projects/blog (todo)
    $ git log
    commit 7be37301d4188afe5275f12ca4acfe96683f43c2
    Author: Alex Xandra Albert Sim <[email protected]>
    Date:   Thu Jan 10 16:51:55 2013 +0700
    
    
        Menambahkan 3 TODO awal
    
    
    commit ff5650bec0ecb95cccf1d079b9c6b3b076c4a3d8
    Author: Alex Xandra Albert Sim <[email protected]>
    Date:   Thu Jan 10 16:43:37 2013 +0700
    
    
        Penambahan file TODO
    
    
    commit b921ec5bcffdb308636112dcfb78615b8a77403a
    Author: Alex Xandra Albert Sim <[email protected]>
    Date:   Thu Jan 10 16:19:02 2013 +0700
    
    
        About page.
    
    
    commit 263ab58c58665f96ce771c5709bbfc5fa1d34e78
    Author: Alex Xandra Albert Sim <[email protected]>
    Date:   Thu Jan 10 16:17:59 2013 +0700
    
    
        Inisiasi proyek
    

Sekarang kita telah memiliki total sebanyak empat commit pada cabang “todo”, sementara cabang “master” masih berada pada commit kedua. Ilustrasinya adalah sebagai berikut:

Cabang Repositori setelah TODO dituliskan

Dan kemudian, kita akan menambahkan sebuah file baru pada cabang “master”, untuk memperjelas bagaimana kita dapat bekerja dalam cabang yang berbeda tanpa mengganggu cabang-cabang lainnya. Mari tambahkan file pada cabang “master”, sesuai dengan langkah-langkah berikut:

  1. Pindah ke cabang “master”:

    [email protected] ~/Desktop/projects/blog (todo)
    $ git checkout master
    Switched to branch 'master'
    
  2. Cek untuk memastikan file pada cabang “master” benar:

    [email protected] ~/Desktop/projects/blog (master)
    $ ls
    about.html  index.html  readme.md
    
  3. Buat sebuah file baru, post1.html, dan isikan file tersebut:

    [email protected] ~/Desktop/projects/blog (master)
    $ vim post1.html
    
  4. Tambahkan file baru ke repositori:

    [email protected] ~/Desktop/projects/blog (master)
    $ git add post1.html
    
  5. Commit:

    [email protected] ~/Desktop/projects/blog (master)
    $ git commit -m "Tambahan post pertama"
    [master f9ed764] Tambahan post pertama
     1 file changed, 1 insertion(+)
     create mode 100644 post1.html
    

Dan sekarang repositori kita telah resmi memiliki dua cabang yang memiliki isi yang berbeda:

Repositori *resmi* bercabang!

Lalu bagaimana kalau ternyata akhirnya yakin bahwa file TODO tersebut sangat berguna dan ingin memasukkannya ke kode utama kembali?

Penggabungan Cabang

Penggabungan cabang, terutama jika tidak terjadi konflik, sangat mudah untuk dilakukan. Satu perintah git merge saja akan otomatis menggabungkan sebuah cabang ke cabang yang sedang aktif sekarang. Mari kita coba:

[email protected] ~/Desktop/projects/blog (master)
$ git merge todo
Merge made by the 'recursive' strategy.
 TODO | 5 +++++
 1 file changed, 5 insertions(+)
 create mode 100644 TODO

[email protected] ~/Desktop/projects/blog (master)
$ ls
TODO  about.html  index.html  post1.html  readme.md

Dan sekarang cabang kita telah digabungkan, seperti berikut:

Repositori setelah digabungkan

Sampai pada titik ini, kita bahkan dapat tetap melakukan pekerjaan lanjutan pada cabang “todo”, dan kemudian menggabungkannya lagi ke cabang utama. Misalkan jika kita ingin menambahkan satu poin baru ke dalam file TODO, tetapi agar aman kita akan melakukannya pada cabang “todo” terlebih dahulu, langkah demi langkah:

  1. Pindah ke cabang “todo”:

    [email protected] ~/Desktop/projects/blog (master)
    $ git checkout todo
    Switched to branch 'todo'
    
  2. Edit file TODO:

    [email protected] ~/Desktop/projects/blog (todo)
    $ vim TODO
    
  3. Lakukan commit, dengan pesan commit yang jelas:

    [email protected] ~/Desktop/projects/blog (todo)
    $ git commit -am "Penambahan satu pekerjaan, dan menandai pekerjaan pertama sel
    esai"
    [todo ccdc1e4] Penambahan satu pekerjaan, dan menandai pekerjaan pertama selesai
    
    
     1 file changed, 2 insertions(+), 1 deletion(-)
    
  4. Pindah kembali ke cabang “master”:

    [email protected] ~/Desktop/projects/blog (todo)
    $ git checkout master
    Switched to branch 'master'
    
  5. Lakukan penggabungan:

    [email protected] ~/Desktop/projects/blog (master)
    $ git merge todo
    Merge made by the 'recursive' strategy.
     TODO | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
    

Pada akhir langkah, kita akan memiliki repositori kira-kira seperti berikut (klik untuk memperbesar):

Repositori Akhir

Bekerja dengan Beberapa Cabang

Prinsip-prinsip yang telah dijelaskan sebelumnya dapat diterapkan dengan cara yang sama untuk banyak cabang. Tidak terdapat batasan jumlah cabang yang dapat disimpan oleh git. Misalnya, kita dapat dengan mudah menambahkan cabang baru ke dalam git dengan perintah git branch lagi:

[email protected] ~/Desktop/projects/blog (master)
$ git branch post2

[email protected] ~/Desktop/projects/blog (master)
$ git branch
* master
  post2
  todo

Dan sekarang kita memiliki total tiga cabang, seperti gambar berikut:

Repositori Bercabang Banyak

Tentunya, semua aturan mengenai cabang yang sebelumnya telah dibahas juga berlaku untuk cabang baru ini. Idealnya, setiap mengembangkan fitur baru akan lebih baik jika fitur baru tersebut dimasukkan ke dalam cabang baru.

Konflik

Ketika kita bekerja menggunakan banyak cabang, tentunya konflik antar cabang tidak dapat dihindari. Resolusi konflik yang dilakukan oleh git menggunakan prinsip yang sama dengan teknik resolusi konflik pada beberapa repositori (jika dilihat dari sisi yang berbeda, setiap repositori dapat dikatakan adalah sebuah cabang baru). Metode penggabungan ini telah kita bahas pada tulisan sebelumnya.

Penutup

Pada tulisan ini kita telah mempelajari bagaimana cara membuat cabang baru, bekerja di dalam cabang tersebut, berpindah-pindah antar cabang, dan menggabungkan kembali perubahan yang dibuat di cabang ke kode utama. Jika masih belum benar-benar mengerti mengenai percabangan pada git, coba jalankan perintah-perintah yang ada sebelumnya, untuk langsung “mengalami” percabangan dalam git.

Keempat bagian seri mini mengenai git ini seharusnya sudah cukup mengajarkan dasar-dasar git kepada anda, sehingga anda dapat langsung mulai menggunakan git. Jika ada pertanyaan, komentar, atau saran, silahkan tinggalkan pesan di kotak komentar pada bagian bawah tulisan. Akhir kata, happy coding!

Catatan Penulis: Seri tulisan ini memiliki gaya pemaparan yang berbeda-beda, untuk mengukur gaya tulisan mana yang lebih disukai oleh pembaca. Jika anda membaca dan merasa gaya tertentu lebih menyenangkan, mohon untuk menulis komentar dan mengatakan gaya tulisan mana yang lebih menyenangkan. Tulisan-tulisan berikutnya akan dirancang agar lebih mudah dibaca oleh pembaca. Terima kasih.

comments powered by Disqus

Daftar Isi