Dalam Part 1 dari seri ini saya memperkenalkan dasar-dasar menggunakan Git – membuat repositori, menambahkan file, melakukan commit file, dan menggunakan log Git dan alat diff untuk melihat timeline perubahan Anda. Bagian ini akan bergerak dari situ menuju beberapa topik yang sedikit lebih maju: membatalkan perubahan, membuat branches, dan menggabungkan perubahan dari satu branch ke yang lain.

Mengembalikan perubahan setelah terjadi kekacauan

Let’s take a classic example involving some unintentionally deleted work. You’ve edited a source file to make a simple change and you’re are about to hit Ctrl + S (assuming you’re not using vi) to save your work when the palm of your hand brushes across your laptop’s touch pad which causes a large chunk of the file to be selected. Then you inadvertently hit some other key which causes the selection to wipe out your work, and before you know what has happened, Ctrl + S saves your work. This is easy to recover from if you’re using Git.

Mari kita mengambil contoh klasik yang melibatkan beberapa pekerjaan yang secara tidak sengaja dihapus. Anda telah mengedit sebuah file source code untuk membuat perubahan sederhana dan Anda akan menekan Ctrl + S (dengan asumsi Anda tidak menggunakan vi) untuk menyimpan pekerjaan Anda. Kemudian Anda secara tidak sengaja menekan tombol lain yang menyebabkan seleksi untuk menghapus pekerjaan Anda, dan sebelum Anda tahu apa yang telah terjadi, Ctrl + S telah menyimpan pekerjaan Anda. Hal ini mudah untuk dipulihkan jika Anda menggunakan Git.

Mengembalikan file ke Versi Commit Sebelumnya

Skenario ini mengasumsikan Anda belum melakukan commit pada file yang rusak. Menggunakan file config.php dari bagian pertama, katakanlah entah bagaimana Anda telah dihapuskan sebagian dari array konfigurasi database meninggalkannya seperti ini:

<?php
$database = array(
    "database"  => "new_project");

Kamu bisa menjalankan git diff untuk melihat apa yang telah diubah; isi driver, host, username, dan password semua telah hilang.

-    "driver"   => "mysql",
-    "host"     => "locahost",
-    "username" => "Foo",
-    "password" => "pass",

Bagaimana kamu mengembalikan filenya? Dengan git checkout config.php. Cara termudah untuk mengembalikan beberapa perubahan sebuah file pada keadaan commit terakhir.

Kadang-kadang Anda akan ingin membatalkan beberapa perubahan dan mengembalikan file ke keadaan beberapa kali commit sebelumnya. Jika Anda hanya ingin mengembalikan file tunggal daripada semua file yang ada di komit, Anda dapat menggunakan git checkout diikuti oleh hash dari komit yang berisi versi dari file yang ingin dikembalikan, dan nama file.

Katakanlah Anda menjalankan git log config.php dan ternyata commit c1d55debc7be8f50e363df462f84672ad029b703 mengandung versi foo.php yang ingin anda kembalikan. Sekarang Anda dapat menjalankan:

sean@beerhaus:~/new_project$ git checkout c1d55debc7be8f50e363df462f84672ad029b703 config.php
sean@beerhaus:~/new_project$ git commit config.php -m "Reverted to previous revision."
[master b125806] Reverted to previous revision.
 1 files changed, 1 insertions(+), 1 deletions(-)

Copy pekerjaan Anda dari config.php akan ditimpa dengan versi sebelumnya dari komit. Berhati-hatilah ketika menjalankan perintah checkout Anda, karena menimpa file dan Anda tidak dapat mengembalikan copy pekerjaan… Anda hanya dapat mengembalikan versi yang telah di commit dan sedang dilacak oleh Git.

Mengembalikan Semuanya ke Commit Sebelumnya

Cara lain untuk mengembalikan perubahan Git untuk mengembalikan segalanya ke commit tertentu. Ketika Anda mengembalikan ke sebuah commit Anda mengembalikan setiap file di dalamnya, apakah komit berisi satu atau seratus file.

Mari kita membuat timeline perubahan palsu untuk menggambarkan seluruh reverting komit. Buat sebuah file bernama foo.php dalam repositori pengujian Anda.

<?php
// this is our original, pristine version

Tambahkan file baru dan commit:

sean@beerhaus:~/new_project$git add foo.php
sean@beerhaus:~/new_project$>git commit -am "This is the original version."
[master 4d7add0] This is the original version.
 1 files changed, 2 insertions(+), 0 deletions(-)
 create mode 100644 foo.php

Buat perubahan kedua di foo.php yang akan menjadi seperti ini:

<?php
// this is our original, pristine version
// this is a version that might be useful

Commit lagi setelah diubah.

sean@beerhaus:~/new_project$git commit -am "Added a comment."
[master 9e87750] Added a comment.
 1 files changed, 1 insertions(+), 0 deletions(-)

Buat satu atau lebih perubahan yang nantinya ingin kamu buang kembali:

<?php
while (true) {
    exec("yes");
}
sean@beerhaus:~/new_project$git commit -am "Added a really bad version of the file."
[master d4cb9dd] Added a really bad version of the file.
 1 files changed, 3 insertions(+), 2 deletions(-)

Setelah Anda telah melakukan tiga perubahan, lihatlah log. Karena Anda terutama setelah hash komit di sini, Anda dapat melewati pilihan format untuk perintah git log untuk menghapus beberapa informasi tambahan.

sean@beerhaus:~/new_project$git log --pretty=oneline foo.php
d4cb9ddbcb72cccf61e8682ecc2485a9a7a57a29 Added a really bad version of the file.
9e877501c2ad74d177a77b88eb66bfa8be7c18bd Added a comment.
4d7add037b4b38faba3392be988e0e9813daa8a7 This is the original version.

Untuk membatalkan komit terakhir, Anda dapat menggunakan git revert. Perintah itu mengharapkan argumen yang mengacu pada commit buruk yang perlu dikembalikan, karena Anda ingin membatalkan hanya komit terbaru, Anda dapat menggunakan HEAD untuk argumen. Dalam konteks ini, HEAD hanya referensi ke komit terakhir direkam.

<pre>sean@beerhaus:~/new_project$git revert HEAD</pre>

Editor default akan terbuka memungkinkan Anda untuk memasukkan pesan. Dalam kasus saya, pesan yang disarankan sudah disediakan.

Revert "Added a really bad version of the file."

This reverts commit d4cb9ddbcb72cccf61e8682ecc2485a9a7a57a29.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#       modified:   foo.php
#

Setelah git revert selesai, Liahtlah kembali log kamu.

<pre>sean@beerhaus:~/new_project$ git log --pretty=oneline foo.php
264208850a690ba1dc6de13c701390d395706830 Revert "Added a really bad version of the file."
d4cb9ddbcb72cccf61e8682ecc2485a9a7a57a29 Added a really bad version of the file.
9e877501c2ad74d177a77b88eb66bfa8be7c18bd Added a comment.
4d7add037b4b38faba3392be988e0e9813daa8a7 This is the original version.</pre>

Sebuah komit baru telah dibuat di mana isi foo.php muncul seperti sebelum komit yang buruk.
Sekarang mari kita coba ini lagi, hanya saja kali ini Anda akan mengembalikan basis kode Anda ke hash  9e877501c2ad74d177a77b88eb66bfa8be7c18bd.

<pre>sean@beerhaus:~/new_project$ git revert 9e877501c2ad74d177a77b88eb66bfa8be7c18bd</pre>

Sekali lagi, editor akan terbuka bagi Anda untuk menentukan pesan komit. Setelah Anda melakukannya, menunjukkan log sekali lagi.

<pre>sean@beerhaus:~/new_project$git log --pretty=oneline foo.php
522ef8c7b70b1dcb9c21ecb51f1f025323b18da2 Revert "Added a comment."
264208850a690ba1dc6de13c701390d395706830 Revert "Added a really bad version of the file."
d4cb9ddbcb72cccf61e8682ecc2485a9a7a57a29 Added a really bad version of the file.
9e877501c2ad74d177a77b88eb66bfa8be7c18bd Added a comment.
4d7add037b4b38faba3392be988e0e9813daa8a7 This is the original version.</pre>

Branching dan Merging

Branching dan merging adalah konsep umum untuk  bermacam sistem kontrol versi. Idenya adalah bahwa Anda memiliki jalur utama pembangunan, kadang-kadang disebut sebagai trunk atau stable. Ini adalah di mana Anda ingin menyimpan semua kode sumber dalam keadaan bekerja,  bisa di rilis, stabil. Anda tidak ingin untuk menimbulkan segala macam kode eksperimental pada jalur utama, bukan karena Anda ingin mencegah ide-ide baru atau eksperimentasi, tetapi karena Anda ingin baris ini menjadi bersih dan dapat diandalkan. Harus ada baris lain untuk tujuan eksperimen, dan ini adalah apa yang disebut branches.

Menggunakan Branches/Cabang

branch adalah seperti salinan jalur utama Anda, pembangunan stabil. Anda dapat melakukan apapun yang Anda inginkan dalam batas-batas branch Anda sendiri dan tidak akan mempengaruhi apa pun di jalur utama sampai Anda menggabungkan kembali kode branch  Anda ke dalam branch utama.

Dalam Git, Anda sudah pernah menggunakan branch sejak Anda pertama kali membuat repositori. Cabang ini disebut “master” dan Anda telah menggunakannya sepanjang waktu. Tidak percaya padaku? Jalankan git branch dan lihatlah output.

sean@beerhaus:~/new_project$ git branch
* master

Tanda asterisk (*) merujuk ke branch yang sedang Anda kerjakan.

Dalam kebanyakan kasus, master berfungsi sebagai garis perkembangan yang stabil atau utama saya sebutkan sebelumnya, tetapi tidak harus. Anda dapat dengan mudah membuat branch Anda sendiri bernama “stabil” dan menandakan bahwa sebagai branch utama sebagai gantinya. Cara termudah untuk membuat branch adalah dengan git branch <name>.

Mari kita membuat cabang di repositori bernama “experimental”.

sean@beerhaus:~/new_project$ git branch experimental
sean@beerhaus:~/new_project$ git branch
  experimental
* master

Perhatikan tanda asterisk (*) masih menunjukkan master sebagai cabang aktif. Anda hanya menciptakan cabang baru, Anda belum beralih ke itu. Untuk beralih ke cabang baru, gunakan git checkout.

sean@beerhaus:~/new_project$ git checkout experimental
Switched to branch 'experimental'
sean@beerhaus:~/new_project$ git branch
* experimental master

Atau, Anda bisa menggunakan git checkout -b experiment untuk membuat cabang baru dan beralih ke situ semua dalam satu tembakan. Saya lebih suka menggunakan shortcut ini daripada menggunakan dua perintah sendiri-sendiri.

Karena Anda menggunakan cabang master saat membuat cabang experimental, cabang experimental akan menjadi salinan langsung dari master pada saat cabang diciptakan.

Sekarang buka foo.php di editor dan menambahkan komentar sehingga terlihat seperti ini:

<?php
// this is our original, pristine version
// comment from the experimental branch

Kemudian commit perubahan tersebut.

 sean@beerhaus:~/new_project$git commit -am "Added branch comment."
[experimental 8632135] Added branch comment. 1 files changed, 1 insertions(+), 0 deletions(-)

Setelah Anda melakukan perubahan, kemudian beralih kembali ke cabang master.

sean@beerhaus:~/new_project$git checkout master
Switched to branch 'master'

Lihatlah foo.php dan Anda akan melihat perubahan yang Anda buat di cabang experimental Anda tidak muncul. Hal ini karena dua cabang dua lingkungan kerja yang berbeda. Perubahan dari satu cabang tidak akan muncul di cabang lain sampai mereka telah bergabung.

Menggabungkan Branches

Perintah git merge mengambi bentuk git merge <source>, di mana <source> adalah cabang yang Anda gabungkan dari perubahan yang dilakukan. Cabang di mana Anda menjalankan perintah merge tersirat sebagai tujuannya.

Jadi mari kita membawa cabang Anda dari cabang experimental ke cabang master.

sean@beerhaus:~/new_project$ git merge experimental
Updating 522ef8c..8632135
Fast-forward
 foo.php |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

Ketika Anda melihat foo.php saat ini Anda akan melihat perubahan yang dibuat di cabang eksperimental.

Sekarang mari kita lakukan ini ke arah lain, sementara Anda masih di cabang master, buat perubahan ke foo.php yang akan  Anda gabungkan ke cabang experimental.

sean@beerhaus:~/new_project$ git commit -am "Added function to master."
[master cbe5cba] Added function to master.
 1 files changed, 4 insertions(+), 0 deletions(-)

Beralih ke cabang eksperimental dan menggabungkan perubahan dari master.

sean@beerhaus:~/new_project$ git checkout experimental
Switched to branch 'experimental'
sean@beerhaus:~/new_project$ git merge master
Updating 8632135..cbe5cba
Fast-forward
 foo.php |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

Lihatlah foo.php dan lihatlah fungsi yang ditambahkan dalam master sekarang ada di cabang eksperimental.

Menangani Konflik Penggabungan

Akhirnya, Anda akan menemukan konflik saat menggabungkan. Sebuah merge conflict yang terjadi ketika Anda menggabungkan perubahan dari satu cabang ke cabang lain dan Git tidak dapat menyelesaikan penggabungan tanpa campur tangan manusia. Hal ini terjadi ketika Anda sudah mengedit 80 baris dari file dalam satu cabang, suntingan Fred baris 80 dari file yang sama di cabang lain, dan kemudian Anda mencoba untuk menggabungkan perubahan Fred dengan perubahan Anda. Git tahu bahwa bagian yang sama dari kode telah berubah, tapi itu terserah kepada kita manusia untuk mencari tahu perubahan mana yang harus disimpan.

Anda dapat membuat situasi konflik penggabungan sangat mudah untuk diselesaikan. Beralih ke cabang master Anda dengan Git, dan membuka foo.php di editor.

sean@beerhaus:~/new_project$git checkout master
Switched to branch 'master'

Tambahkan fungsi ini pada baris 9:

<code>function</code> <code>master() {
<code>    print</code> <code>"This is the master branch.\n"</code><code>;
}
</code></code>

Simpan file dan komit perubahan Anda.


sean@beerhaus:~/new_project$git commit -am "Added master function."
[master 4f97280] Added master function.

1 files changed, 4 insertions(+), 0 deletions(-)

Beralih ke cabang experimental kembali.

sean@beerhaus:~/new_project$ git checkout experimental
Switched to branch 'experimental'

Buka foo.php lagi di editor dan tambahkan fungsi ini pada baris 9 juga:

function experimental() {
    print "This is the experimental branch.\n";
}

Simpan dan commit perubahan itu.

sean@beerhaus:~/new_project$ git commit -am "Added experimental function."
[experimental c5358cc] Added experimental function.
 1 files changed, 4 insertions(+), 0 deletions(-)

Sekarang ketika anda masih di cabang experimental, gabungkan perubahan dari master. Anda telah mengedit baris yang sama dari file yang sama di kedua cabang, sehingga Anda dapat mengharapkan beberapa jenis konflik.

sean@beerhaus:~/new_project$ git merge master
Auto-merging foo.php
CONFLICT (content): Merge conflict in foo.php
Automatic merge failed; fix conflicts and then commit the result.

Sekarang Anda harus membuka file secara manual dan bekerja di luar konflik. Dalam foo.php Anda akan melihat sesuatu seperti ini:

<<<<<<< HEAD
function experimental() {
    print "This is the experimental branch.\n";
=======
function master() {
    print "This is the master branch.\n";
>>>>>>> master
}

Bagian pertama diawali dengan <<<<<<< HEAD dan diakhiri dengan ======= adalah commit terakhir kamu (HEAD). Bagian dari ======= ke >>>>>>> master adalah perubahan yang datang dari cabang master.

Mari kita berasumsi bahwa Anda telah memutuskan bahwa Anda akan menjaga perubahan dari master dan membuang perubahan eksperimental. Semua harus Anda lakukan adalah menghapus simbol konflik dan garis-garis yang berasal dari experimental. Bagian dari foo.php itu sekarang  hanya memiliki fungsi master.

<?php
// this is our original, pristine version
// comment from the experimental branch

function bar() {
    print "This is bar.\n";
}

function master() {
    print "This is the master branch.\n";
}

Setelah itu selesai, simpan file dan komit konflik yang sudah diselesaikan.

sean@beerhaus:~/new_project$git commit -am "Fixed a merge conflict from master to experimental."
[experimental 3871a1d] Fixed a merge conflict from master to experimental.

Ini hanya contoh sederhana. Dalam dunia nyata pengembangan perangkat lunak profesional Anda dapat memiliki 20 pengembang yang berbeda semua perubahan penggabungan dari cabang masing-masing ke dalam master. Setiap kali itu terjadi, Anda akan ingin menggabung perubahan terbaru dari master kembali ke cabang pribadi Anda. Konflik akan terjadi, dan sementara Git adalah alat yang hebat yang anda memiliki, tidak dapat memperbaiki semua masalah Anda dalam situasi seperti ini. Kadang-kadang komunikasi antar manusia adalah alat terbaik untuk menghindari konflik sebesar ini.

Ringkasan

Dan itu adalah bagaimana hal itu dilakukan. Anda telah melihat bagaimana memulihkan dari setiap kesalahan yang Anda buat sepanjang jalan, cara membuat cabang sehingga Anda dapat bekerja secara paralel dengan pengembang lain pada proyek yang sama atau hanya mencoba ide-ide baru tanpa membahayakan stabilitas jalur utama Anda, dan akhirnya bagaimana menggabungkan yang orang lain sunting ke cabang Anda sendiri. Tiga topik yang dibahas dalam bagian ini – reverting mistakes, branching, and merging – bersama dengan satu bagian dari seri ini telah memberikan Anda dengan pengetahuan untuk mulai menggunakan Git untuk mengelola proyek-proyek Anda. Jika Anda belum pernah menggunakan software kontrol versi sebelumnya, saya harap saya telah meyakinkan Anda untuk memulai, dan jika Anda masih menggunakan CVS Subversion, mungkin Anda dapat mencoba Git .

Diterjemahkan bebas dari http://phpmaster.com/introduction-to-git-2/

Advertisements

About phpgeek programmer

pemimpi yang berharap menjadi the best programmer di zamannya

One response »

  1. […] mungkin sudah membaca Berkenalan dengan Git – Part 1 dan part 2. Jika tidak, aku benar-benar menyarankan  Anda untuk membacanya. Tidak hanya karena berisi […]

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s