Sunday, May 6, 2012

Belajar Git: Merge dan Penangan Konflik

Jika anda bekerja dalam sebuah tim, ada saatnya anda dan rekan anda akan mengubah suatu berkas secara bersamaan. Misalnya pada skenario berikut, yang sering terjadi:
  • Anda mulai mengubah berkas konfigurasi;
  • Sebelum anda selesai membuat perubahan, rekan anda juga melakukan perubahan pada berkas konfigurasi tersebut. Tetapi karena perubahan yang dilakukan rekan hanya sedikit, dianya bisa langsung mengirimkan perubahan tersebut ke server sebelum anda;
  • Sekarang saat anda mau mengirimkan perubahan yang anda lakukan akan muncul konflik dimana berkas dasar yang anda ubah bukan lagi berkas yang ada di server, karena sudah diubah oleh rekan anda;
  • Karena Git tidak cukup cerdas untuk menggabungkan perubahan-perubahan ini maka Git akan akan menyerahkan tugas ini ke anda. Dimana Git akan: menggagalkan proses push anda dengan menampilkan pesan konflik, meminta anda untuk melakukan proses merge (=penggabungan), dan selesai digabungkan baru dicoba untuk di-push lagi. 
Pesan konflik yang muncul saat anda push, kira-kira, akan seperti ini:
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to '<alamat repository anda>'
To prevent you from losing history, non-fast-forward updates 
were rejected
Merge the remote changes (e.g. 'git pull') before pushing 
again. See the 'Note about fast-forwards' section of 
'git push --help' for details.
Disini Git meminta anda untuk pull (=menarik) versi paling terkini dari server, gabungkan dengan perubahan yang anda lakukan, dan push hasil penggabungan ini. Untuk mengingkatkan kembali bagaimana melakukan proses-proses ini bisa membaca kembali saya sebelumnya.

Perhatikan pada saat anda melakukan proses pull, Git akan memberikan pesan kesalahan konflik lagi tetapi sekarang seperti ini:
   5d0a41a..c53d73d  master     -> origin/master
Auto-merging <nama berkas>
CONFLICT (content): Merge conflict in <nama berkas>
Automatic merge failed; fix conflicts and then commit the
result.
Dimana Git berusaha untuk menggabungkan berkas anda secara otomatis (=Auto-merging) tetapi gagal dan meminta anda untuk melakukannya. Untuk menandai mana saja yang menjadi masalah, Git akan menandai, pada berkas yang bermasalah, baris-baris yang mengalami konflik. Tandanya kira-kira seperti ini:
<<<<<<< HEAD
Disini tulisan dari berkas anda sendiri
=======
Disini tulisan dari berkas yang di server
>>>>>>> c53d73dd7227d709d9064beb03f0b926aa6ad526
Perhatikan berkas asli anda tidak hilang dan akan disimpan dengan nama yang sama tetapi diberi akhiran .orig.

Cara paling mudah melakukan penggabungan ya langsung diubah berkas ini dan di-push lagi. Tetapi saya kadang-kadang bingung melihat apa yang perlu digabungkan apalagi kalau perubahannya banyak. Untuk mempermudah proses penggabungan ini saya memakai perangkat lunak Meld yang dapat menampilkan secara visual perbedaan-perbedaan dalam dokumen yang harus saya gabungkan.

Meld

Meld merupakan aplikasi yang dapat mevisualisasikan perbedaan-perbedaan akibat perubahan pada suatu berkas. Cara instalasinya di Ubuntu 12.04 cukup sederhana yaitu dengan langkah:
sudo apt-get install meld

Proses Merge

Cara memakai Meld untuk membantu anda dalam proses penggabungan ini adalah dengan menjalankan perintah berikut:
git mergetool
Jika ada konflik yang harus ditangani maka git akan menanyakan apakah ingin menjalankan aplikasi  Meld, jika iya tinggal tekan enter dan Meld akan dijalan dengan menampilkan berkas yang bermasalah dan yang menimbulkan konflik.

Perhatikan layar sebelah kiri merupakan isi berkas anda, layar sebelah kanan isi berkas di server (tidak kelihatan pada gambar dibawah), dan layar ditengah adalah tempat penggabungan yang perubahannya anda harus lakukan sendiri. Setelah penggabungan selesai, tekan tombol Save untuk menyimpan perubahannya dan pilih menu Quit untuk keluar dari Meld.


Nah setelah selesai melakukan proses penggabungan ini baru perintah commit dan push bisa dijalankan lagi:
git commit
git push origin master

Kembali ke: Belajar Git


Referensi


3 comments:

  1. membantu sangat .. kami lagi belajar GIT ..

    ReplyDelete
  2. mas klo masalah git nya seperti ini gmn mas ?

    An error occurred. Detailed message: An error was raised by libgit2. Category = 21 (MergeConflict).
    1 uncommitted change would be overwritten by merge

    cara mengetahui conflignya dimana gmn mas ?

    ReplyDelete
    Replies
    1. Kemungkinan ada perubahan yang dilakukan belum di commit dan mas-nya coba merge. Comit dan push dulu perubahannya baru dilanjutkan dengan Merge.

      Delete