Anda mungkin sudah membaca Berkenalan dengan Git – Part 1 dan part 2. Jika tidak, aku benar-benar menyarankan  Anda untuk membacanya. Tidak hanya karena berisi pengenalan git, seperti namanya, tetapi juga dasar yang baik untuk artikel ini.

Di sini saya akan membahas beberapa topik lanjutan yang Anda mungkin atau mungkin tidak datang di sebagai bagian dari perkembangan normal alur kerja Anda – fitur yang memungkinkan Anda untuk melakukan lebih dari sistem lain, seperti SVN. Ini termasuk:

  • Mengekspor repositori Anda
  • dasar-dasar rebasing
  • Penataan kembali satu set commit
  • Memisahkan satu set commit
  • Mengubah pesan conmit
  • Penggabungan satu set commit

Jika Anda telah menghabiskan waktu Anda secara eksklusif dengan sistem kontrol versi selain Git dan bekerja dengan filosofi mereka, beberapa dari konsep-konsep ini mungkin asing (atau bahkan tabu) kepada Anda. Tapi jangan takut, saya akan menjelaskan bagaimana untuk melakukan tindakan tersebut dan menunjukkan saat-saat ketika mereka mungkin akan bermanfaat untuk digunakan.

Mengekspor repositori Kamu

Mari kita mulai dengan yang bagus dan mudah. Mengekspor mungkin tidak begitu penting, tetapi itu adalah fitur yang sangat berguna. Mengekspor memungkinkan kita untuk memberikan rilis atau snapshot dari kode kita kepada orang lain tanpa memberikan semua informasi kontrol versi yang biasanya kita tetapkan.

Arsip dari Repositori Lokal

Pengarsipan dapat menjadi bagian yang berguna dari proses penyebaran aplikasi, dengan alat seperti Phing dan Capistrano, atau alat integrasi berkesinambungan seperti Hudson dan Xinc.

Pilihan untuk menciptakan sebuah arsip dari repositori lokal cukup sederhana. Berikut ini contohnya:

$ git archive --format=tar --prefix=phpmaster-git-advanced/ \
    HEAD > phpmaster-git-advanced.tar | \
    gzip > phpmaster-git-advanced.tar.gz

Dalam contoh di atas, saya menginginkan format arsip TAR (Anda juga dapat menentukan ZIP jika Anda suka). Saya kemudian ditentukan nilai awalan “phpmaster-git-advanced”. Jika trailing slash tidak ditambahkan, maka nama tersebut diberikan ke semua file dalam arsip. Dalam kasus ini, nama itu hanya diberikan untuk arsip secara keseluruhan.

Sekarang mari kita lihat contoh lain, di mana outputnya adalah file ZIP. Alih-alih menentukan format dan kemudian pipa output ke gzip, kita dapat menggunakan parameter – output dan memberikan nama dengan zip sebagai ekstensi file..

$ git archive --output=phpmaster-git-advanced.zip \
    --prefix=phpmaster-git-advanced/ -9 HEAD

git archive akan mengekspor repositori ke arsip ZIP untuk kita secara otomatis daripada mengirim hasilnya ke stdout. Bila menggunakan ZIP, Anda juga dapat menentukan tingkat kompresi menggunakan switch -0 ke-9, yang berguna jika file yang dihasilkan akan lebih besar.

Arsip dari Remote Repositori

Repo lokal bukanlah satu-satunya jenis repositori yang dapat kita arsip, meskipun. Dengan – remoteswitch, kita dapat mengarsipkan repositori dari Gitosis dan server Git lainnya yang mungkin digunakan oleh tim kami untuk menyimpan kode kolektif.

Contoh di bawah ini mencoba untuk mengkloning proyek Joind.In. Sayangnya, jujur​​, tidak bekerja (dari mencari forum Saya percaya bahwa itu telah sengaja dinonaktifkan oleh Github untuk membantu mereka memastikan pengalaman pengguna yang lebih baik), tapi aku sudah menyertakannya di sini untuk menunjukkan contoh dari perintah.

$ git archive --remote=git://github.com/settermjd/joind.in.git \
    --format=tar --prefix=joind.in/ HEAD | \
    gzip > joindin.tar.gz

Rebasing dasar

Sekarang mari kita masuk ke beberapa aspek yang lebih juicy bekerja dengan Git. Menurut buku SCM Git, dengan perintah rebase kita bisa “mengambil semua perubahan yang dilakukan pada satu cabang dan replay mereka pada satu sama lain.” Singkatnya, ini memungkinkan kita untuk menggabungkan cabang dan perubahan dalam cara yang kuat dan fleksibel.Di sini juga sedikit perdebatan dimulai. Jika Anda akrab dengan alat kontrol versi lain seperti CVS, SVN, dan Mercurial, maka Anda dapat menggunakan model di mana setelah komit dibuat, tidak dapat diubah. Dengan Git, ini belum tentu demikian.

Penataan Komit

Misalkan urutan komit kami tidak seperti apa yang seharusnya. Kami telah membuat satu set komit, tetapi akan lebih praktis terjadi secara berurutan. Mungkin mereka semua berhubungan dengan modul kode yang sama dan ada perubahan untuk modul terkait di tengah. Ini bukan show stopper, tapi mungkin membantu untuk memiliki mereka bersama-sama ketika meninjau kembali sejarah mereka beberapa bulan kemudian.

$ git rebase -i HEAD~5

Menggunakan perintah di atas, saya sudah mulai sesi rebase mencakup lima commit terakhir, ditampilkan oleh git rebase dalam urutan terbalik:

pick da4fc8e changing default to add iteration
pick 003ab61 adding even iteration script
pick 701e132 reworking directory structure
pick c722b9f removing old files
pick 3a10e1c Added in files that were forgotten in the previous commit

Misalkan melakukan komit 5 (3a10e1c) seharusnya setelah komit 2 (003ab61). Kita dapat mengubah urutan komit dalam editor sebagai berikut:

pick da4fc8e changing default to add iteration
pick 003ab61 adding even iteration script
<strong>pick 3a10e1c Added in files that were forgotten in the previous commit</strong>
pick 701e132 reworking directory structure
pick c722b9f removing old files

Simpan buffer dan keluar dari editor dan kami menerima sebagai berikut:

Successfully rebased and updated refs/heads/testing.

Jalankan git log sekarang akan menghasilkan output sebagai berikut:

commit ab97ffb2fe87c25ca48116ed03cdbe486dc0abb5
Author: Matthew Setter
Date:   Fri Jan 18 12:54:00 2012 +0000

    removing old files

commit 3b5d6c5b0c6a866f426ff5bf412508ce9d9ae864
Author: Matthew Setter
Date:   Fri Jan 18 12:53:30 2012 +0000

    reworking directory structure

commit d9ab87677f8e5692b649b650a6de6ce836c72531
Author: Matthew Setter
Date:   Mon Jan 21 10:11:33 2012 +0100

    Added in files that were forgotten in the previous commit

commit 003ab6124b7f7a59be4fe152df28b9de706383ed
Author: Matthew Setter
Date:   Fri Jan 18 12:44:08 2012 +0000

    adding even iteration script

Kita bisa melihat dengan urutan komit baru yang telah di re-order berhasil. Git memutar ulang kembali ke pertama komit ditentukan, kemudian memutar ulang sejarah dengan perubahan yang baru saja kita ditentukan.

Mengubah Pesan Commit

Bagaimana jika Anda telah menulis pesan komit dengan cara tertentu yang, misalnya, Anda belajar dari pekerjaan sebelumnya, tapi sekarang Anda berada di sebuah organisasi baru dan mereka menulis dengan cara berbeda? Anda baru saja melakukan perubahan dan pengembang senior, setelah meninjau itu, melihat pesan dan ingin pesan itu diubah untuk mematuhi standar perusahaan. Dengan Git, Anda dapat kembali dan mengubah pesan.

Pertama, kita harus memulai proses rebase dengan menjalankan perintah berikut:

$ git rebase -i HEAD~2

Kami meminta untuk rebase sekitar dua revisi sebelum HEAD. Terminal menampilkan berikut dalam buffer pengeditan:

pick c722b9f removing old files
pick bcc1dff adding some files

# Rebase 701e132..bcc1dff onto 701e132
#
# Commands:
#
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for ammending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash" but discard the commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

Kami melihat dua komit di atas. Dalam daftar perintah di bawah itu, kita memiliki pilihan forreword yang memungkinkan kita untuk mengubah pesan komit.

Di sini saya sudah berubah untuk memilih reword:

pick c722b9f removing old files
reword bcc1dff adding some files

# Rebase 701e132..bcc1dff onto 701e132
#
# Commands:
#
...

Menyimpan dan keluar dari buffer kemudian akan memungkinkan kita untuk kembali menentukan pesan komit.

Menggabungkan Set Komit

Anda mungkin cukup rajin dalam praktek komit Anda, memastikan melakukan hanya mencakup perubahan tunggal atau sekelompok perubahan terkait untuk satu tujuan. Tapi selalu ada sesuatu yang bisa mengganggu irama normal kami.

Katakanlah kita membuat komit untuk perubahan, melakukan beberapa pekerjaan dan membuat komit lain, dan kemudian melakukan beberapa pekerjaan lebih lanjut dan dilakukan itu. Setelah komit ketiga, kita menemukan bahwa komit 1 dan 3 benar-benar berhubungan dengan update yang sama dan harus digabungkan.

Jika kita bekerja dengan SVN atau CVS, yang akan itu, sejarah revisi akan diperbaiki. Dengan Git, kita bisa membuka sejarah dan menggabungkan komit 1 dan 3 menjadi satu komit sebelum komit 2. Mari kita menuju proses tersebut.

Kami memulai proses rebase melihat lima commit terakhir yang terlihat sebagai berikut:

$ <strong>git rebase -i HEAD~5</strong>

pick da4fc8e changing default to add iteration
pick 003ab61 adding even iteration script
pick d9ab876 Added in files that were forgotten in the previous commit
pick 3b5d6c5 reworking directory structure
pick ab97ffb removing old files

Kami kemudian mengubah urutan sehingga 3 datang sebelum 2 sebagai berikut:

pick da4fc8e changing default to add iteration
<strong>pick d9ab876 Added in files that were forgotten in the previous commit</strong>
pick 003ab61 adding even iteration script
pick 3b5d6c5 reworking directory structure
pick ab97ffb removing old files

Kami kemudian mengubah pick menjadi squash komit nomor baru 2: We then change pick to squash on the new commit number 2:

pick da4fc8e changing default to add iteration
<strong>squash</strong> d9ab876 Added in files that were forgotten in the previous commit
pick 003ab61 adding even iteration script
pick 3b5d6c5 reworking directory structure
pick ab97ffb removing old files

Kami kemudian dimasukkan ke dalam modus Editor lagi, menunjukkan kepada kita pesan komit sebelumnya. Kami menambahkan dalam pesan komit baru yang merangkum dua komit sebelum mereka bergabung bersama-sama. Jadi, saya mengubahnya menjadi berikut:

# This is a combination of 2 commits.
# The first commit's message is:

changing default to add iteration

# This is the 2nd commit message:

Added in files that were forgotten in the previous commit</pre>
With a new message:
<pre># This is a combination of 2 commits.
# The first commit's message is:

<strong>Merging two changes together as they should be together.
</strong>

Setelah keluar editor, proses rebase selesai.

Dengan memulai, non-destruktif, proses rebase lagi, kita melihat bahwa dua komit telah digabungkan. Kami sekarang memiliki lima komit, dengan yang pertama menjadi satu dengan yang pertama sebelumnya:

pick f5cac8d adding top documentation
pick e50970f changing default to add iteration
pick 3c2b3a5 adding even iteration script
pick 3b136c1 reworking directory structure
pick 01ad46f removing old files

Memisahkan Set Komit

Tapi bagaimana kalau kita ingin pergi ke arah yang berlawanan? Apa ada pengembang yang masih muda dan mungkin sedikit ceroboh, atau bagaimana jika Anda, diri sendiri, telah kurang disiplin? Aku tahu aku menderita ini dari waktu ke waktu.

Mari kita mengatakan bahwa kita memiliki komit dengan sejumlah perubahan yang kami baru saja dilemparkan karena terlambat atau kita sedang terburu-buru. Sekarang kita segar dan ingin memperbaiki kekacauan. Bagaimana kita melakukannya?

$ git commit -m "need to finish quickly"
[testing e6a98bb] need to finish quickly
 0 files changed
 create mode 100644 about.php
 create mode 100644 contact-us.php
 create mode 100644 default.php
 create mode 100644 login.php

Dalam contoh di atas, saya telah melakukan satu set file, tiga halaman modul bisnis (about.php, kontak-us.php dan default.php) dan halaman pengguna modul (login.php). Mari kita memisahkan mereka dan melakukan hal-hal dengan benar.

Mulai rebase dengan 3 commit terakhir, kita lihat berikut:

pick 3b136c1 reworking directory structure
pick 01ad46f removing old files
pick e6a98bb need to finish quickly

Ubah memilih untuk mengedit pada komit terakhir (e6a98bb) dan keluarlah dari editor untuk menerima output berikut:

Stopped at e6a98bb... need to finish quickly
You can amend the commit now, with

    git commit --amend

Once you are satisfied with your changes, run

    git rebase --continue

dengan git reset HEAD^ kita memundurkan komit, unstaging file. Sekarang kita dapat melakukan dengan benar, menambahkan halaman bisnis dan pengguna dalam dua komit yang terpisah.

$ git add about.php contact-us.php default.php
$ git commit -m "Adding new business pages"
[detached HEAD a189c9b] Adding new business pages
 0 files changed
 create mode 100644 about.php
 create mode 100644 contact-us.php
 create mode 100644 default.php

$ <strong>git add login.php</strong>
$ <strong>git commit -m "adding new user login page"</strong>
[detached HEAD 9efcab9] adding new user login page
 0 files changed
 create mode 100644 login.php

Lalu, selesaikan dengan menjalankan git rebase dengan --continue switch:

$ <strong>git rebase --continue</strong>
Successfully rebased and updated refs/heads/testing.

Sebuah Kata Peringatan

Sekarang mengutip frase yang sering dikutip:

With Great Power comes Great Responsibility

Harap diingat bahwa hanya karena Anda dapat melakukan sesuatu, tidak berarti bahwa Anda harus. Terutama jika Anda sedang berkolaborasi dalam lingkungan tim, jika Anda membuat perubahan dalam repositori Anda dan kemudian bergabung dengan repositori utama, Anda cenderung, antara lain, menyebabkan kebingungan dengan tim Anda. Tidak apa-apa jika itu ada alasan yang sah dan tidak terjadi terlalu sering. Tapi jika itu terjadi berulang kali, I’m sure you won’t be all that popular for too long.

Juga, Anda perlu menghargai potensi konflik dari jenis perubahan yang dapat diperkenalkan ke dalam kode juga. Sementara fitur ini bisa menyenangkan, menarik, dan bahkan menarik, sadar akan konsekuensi dari apa yang Anda lakukan.

Kesimpulan

Saya berharap bahwa setelah membaca artikel ini Anda akan melihat betapa banyak daya dan fleksibilitas yang disediakan Git, tapi Anda juga menghargai bahwa dengan kekuatan juga harus datang pemahaman tentang kapan digunakan dan kapan tidak menerapkannya.

Selamat Ber-Git-Ria, dan akan berbagi pemikiran dan ide-ide di komentar sehingga kita semua bisa mendapatkan keuntungan. Untuk informasi lebih lanjut, inilah beberapa link untuk membaca lebih lanjut:

diterjemahkan bebas dari http://phpmaster.com/introduction-to-advanced-git/

Advertisements

About phpgeek programmer

pemimpi yang berharap menjadi the best programmer di zamannya

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