Belajar Memakai Stashing Di Git


Salah satu fitur menarik di Git adalah stashing.   Dengan melakukan stashing, developer dapat dengan mudah ‘melenyapkan‘ perubahan kode program, melakukan perubahan lain, lalu kembali lagi ke kode program yang sebelumnya dikerjakan.   Langkah-langkah tersebut sebenarnya dapat diwakili oleh beberapa perintah Git lainnya, tapi stashing membuatnya menjadi mudah karena hanya perlu memanggil satu perintah.

Sebagai contoh, saya akan menggunakan Git yang diakses melalui IntelliJ IDEA.   Saya membuat sebuah proyek Groovy baru dengan nama latihan.   Lalu saya membuat sebuah script Groovy sederhana bernama Latihan.groovy untuk menghitung sisa inventory secara FIFO, seperti berikut ini:

List  pembelian = [10, 20, 30, 40]
List penjualan = [5, 6, 3, 2, 1, 3]
println stokFifo(pembelian, hitungTotal(pembelian, penjualan))

int hitungTotal(List pembelian, List penjualan) {
    pembelian.sum() - penjualan.sum()
}

List stokFifo(List pembelian, int sisa) {
    List hasil = []
    pembelian.each { int jumlah ->
        if (sisa > 0) {
            int delta = (jumlah >= sisa)? jumlah: sisa  // BUG YANG DISENGAJA!
            sisa -= delta
            hasil << delta
        }
    }
    hasil
}

Untuk menambahkan proyek ke dalam repository Git, saya memlih menu VCS, Import into Version Control, Create Git Repository… seperti yang terlihat pada gambar berikut ini:

Membuat Repository Baru

Membuat Repository Baru

Pada kotak dialog yang muncul, saya memilih untuk meletakkan repository bersamaan dengan lokasi proyek dan kemudian men-klik tombol OK.

Kemudian, saya men-klik kanan pada file Latihan.groovy, memilih menu Git, Add seperti yang terlihat pada gambar berikut ini:

Menambahkan file ke index

Menambahkan file ke index

Sekarang file tersebut telah berada di lokasi index atau staging dari Git.   Berikutnya, saya akan men-commit perubahan.   Caranya adalah dengan memilih menu VCS, Commit Changes….  Akan muncul kotak dialog seperti yang terlihat pada gambar berikut ini:

Men-commit perubahan

Men-commit perubahan

Saya memilih tombol Commit untuk menyimpan perubahan dalam repository Git lokal.   Saat IntelliJ IDEA memunculkan dialog mengenai file lain yang tidak ikut di-commit, saya memilih No.

Anggap saja ini adalah sebuah aplikasi yang dikembangkan bersama dengan developer lain, yaitu Lena.   Gadis manis tersebut telah men-fetch repository saya dari remote/upstream, kemudian ia akan men-develop kode program yang berhubungan dengan kode program saya di atas.

Tentu saja saya juga tidak ingin ketinggalan sibuk.   Saya menambahkan harga dan perhitungan laba pada kode program saya.  Sambil mendengarkan lagu klasik, saya menulis kode program berikut ini:

Map pembelian = [10: 10000, 20: 10100, 30: 10200, 40: 11000]
Map penjualan = [5: 12000, 6: 13000, 3: 11000, 2: 11000, 1: 15000, 3: 12000]
println stokFifo(pembelian, hitungTotal(pembelian.keySet().toList(), penjualan.keySet().toList()))

int hitungTotal(List pembelian, List penjualan) {
    pembelian.sum() - penjualan.sum()
}

List stokFifo(Map pembelian, int sisa) {
    List hasil = []
    pembelian.each { jumlah, hargaBeli ->
        if (sisa > 0) {
            int delta = (jumlah >= sisa)? jumlah: sisa  // BUG YANG DISENGAJA!
            sisa -= delta
            hasil << [delta, hargaBeli]
        }
    }
    hasil
}

int hitungProfit(List stokFifo, Map penjualan) {
    def

Saya belum selesai mengetik, bahkan belum sempat menjalankan kode program ketika tiba-tiba telepon berdering.   Suara Lena terdengar sangat panik.   Dia mengatakan bahwa 30 menit lagi dirinya harus memberikan presentasi ke pengguna, tapi ada yang aneh dengan perhitungan inventory buatan saya!   Lena menemukan sebuah kesalahan.  Lebih dari itu, Lena meminta saya untuk segera memperbaikinya secepat mungkin sehingga dia bisa men-pull perbaikan dari saya!

Masalahnya: saya sudah mengubah banyak kode program tersebut sehingga tidak sama lagi seperti yang dipakai oleh Lena.   Saya tidak ingin menghapus perubahan yang sudah saya buat sejauh ini karena nantinya perubahan ini pasti akan dipakai.

Salah satu solusi yang dapat saya pakai adalah dengan memakai fasilitas stashing di Git.   Saya memilih menu VCS, Git, Stash Changes…. Pada kotak dialog yang muncul, saya mengisi seperti berikut ini:

Men-push stash baru

Men-push stash baru

Setelah men-klik tombol Create Stash, isi kode program saya secara ajaib kembali lagi seperti semula!  Sama persis seperti commit terakhir yang dirujuk oleh HEAD.   Saya segera memanfaatkan kesempatan ini untuk mencari dan memperbaiki kesalahan yang ditemukan Lena:

List  pembelian = [10, 20, 30, 40]
List penjualan = [5, 6, 3, 2, 1, 3]
println stokFifo(pembelian, hitungTotal(pembelian, penjualan))

int hitungTotal(List pembelian, List penjualan) {
    pembelian.sum() - penjualan.sum()
}

List stokFifo(List pembelian, int sisa) {
    List hasil = []
    pembelian.each { int jumlah ->
        if (sisa > 0) {
            int delta = (jumlah >= sisa)? sisa: jumlah
            sisa -= delta
            hasil << delta
        }
    }
    hasil
}

Saya segera men-commit perubahan dengan memilih menu VCS, Commit Changes….   Pada komentar, saya mengisi dengan ‘Perbaikan perhitungan sisa inventory yang salah.’ dan men-klik tombol Commit.   Saya kemudian men-push perubahan ke upstream, sehingga Lena bisa men-pull perubahan dari saya.   Tidak lama kemudian suara Lena terdengar lega seolah-olah baru saja luput dari malapetaka.  Ia memberitahukan bahwa kini semuanya baik-baik saja.

Lalu bagaimana dengan kode program yang sedang saya ‘ketik‘ sebelum menerima telepon dari Lena?  Kemana perginya?   Saya bisa mengembalikannya dengan memilih menu VCS, Git, UnStash Changes….   Pada kotak dialog yang muncul, saya men-klik tombol Pop Stash seperti yang terlihat pada gambar berikut ini:

Men-pop dari Stash

Men-pop stash

Kode program saya akan kembali seperti terakhir kali:

Map pembelian = [10: 10000, 20: 10100, 30: 10200, 40: 11000]
Map penjualan = [5: 12000, 6: 13000, 3: 11000, 2: 11000, 1: 15000, 3: 12000]
println stokFifo(pembelian, hitungTotal(pembelian.keySet().toList(), penjualan.keySet().toList()))

int hitungTotal(List pembelian, List penjualan) {
    pembelian.sum() - penjualan.sum()
}

List stokFifo(Map pembelian, int sisa) {
    List hasil = []
    pembelian.each { jumlah, hargaBeli ->
        if (sisa > 0) {
            int delta = (jumlah >= sisa)? sisa: jumlah
            sisa -= delta
            hasil << [delta, hargaBeli]
        }
    }
    hasil
}

int hitungProfit(List stokFifo, Map penjualan) {
    def

Tunggu dulu!  Tidak persis sama seperti terakhir kali!!  Fasilitas stashing bukan saja hanya mengembalikan kode program sebelumnya, tetapi juga melakukan merging dengan perubahan saat ini.   Perbaikan yang diminta oleh Lena tidak hilang setelah saya men-pop stash.

Pada contoh ini, hanya terdapat satu file yang berubah.   Fasilitas stashing akan semakin berguna bila perubahan telah dilakukan pada banyak file yang berbeda.  Tanpa Git dan stashing, pada kasus ini, saya harus memakai cara manual yang lebih repot seperti memberikan komentar atau mengedit file untuk sementara.

Perihal Solid Snake
I'm nothing...

2 Responses to Belajar Memakai Stashing Di Git

  1. Permana Jayanta mengatakan:

    Bagaimana kalau begini kasusnya,

    Lagi ngerjain fitur, lalu sadar bahwa sebaiknya kode ini dibuatkan branch khusus. Jadi kode sekarang di-stash terlebih dahulu. Setelah Working Directory bersih, create branch abc, lalu switch ke branch abc. Nah yang ingin saya tanyakan, bisa kah stash tadi diaplikasikan ke branch abc? lalu baru diunstash, lalu disatukan lagi dengan master

    • Solid Snake mengatakan:

      Stash bisa diaplikasikan pada branch yang berbeda. Misalnya, saya mulai dengan melakukan stashing pada branch master:

      $ git branch
      * master
      
      $ git stash save
      

      Saya kemudian membuat branch baru dengan nama abc dan mengaplikasikan apa yang tersimpan di stash pada branch baru tersebut:

      $ git branch abc
      
      $ git checkout abc
      Switched to branch 'abc'
      
      $ git branch
      * abc
        master
      
      $ git stash pop
      

      Sebagai alternatif, perintah singkat berikut ini akan membuat branch baru bernama ‘abc’, mengaplikasikan isi stash ke branch tersebut, dan berpindah ke branch tersebut:

      $ git stash branch abc
      

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: