Bermain dengan Git Diff

Umumnya, perintah git diff digunakan untuk menginspeksi perubahan yang kita lakukan ketika bekerja pada suatu repositori Git. Dengan perintah dasar git diff, Git akan mencetak semua insertion dan deletion yang kita lakukan pada repositori tersebut per berkas yang terdampak pekerjaan kita, seperti misalnya:

$ git diff
diff --git a/puisi.md b/puisi.md
index 544438e..3274c94 100644
--- a/puisi.md
+++ b/puisi.md
@@ -4,4 +4,4 @@
 Lorem ipsum dolor sit amet
 Consectetur adipiscing elit
 Sed vitae faucibus ante
-Curabitur tempor eros a risus eleifend faucibus
+Integer sed urna ac ex porta congue

Namun tahukah Anda bahwa git diff memiliki banyak kegunaan lain yang dapat membantu Anda menganalisis repositori Anda lebih dalam? Berikut adalah beberapa kegunaan lain git diff yang mungkin dapat membantu Anda dalam pekerjaan sehari-hari Anda.

Membandingkan Referensi

Kita dapat memberikan referensi sebagai masukan pada git diff untuk mengetahui perbedaan antar dua referensi. Jika kita memberikan satu referensi saja sebagai parameter kepada git diff, maka Git akan membandingkan working directory saat ini dengan referensi yang kita berikan tersebut.

$ git diff HEAD~
diff --git a/puisi.md b/puisi.md
index 0a96d0e..5ee54f9 100644
--- a/puisi.md
+++ b/puisi.md
@@ -1,6 +1,8 @@
 # Puisi
+## oleh Lipsum

 Lorem ipsum dolor sit amet
 Consectetur adipiscing elit
 Sed vitae faucibus ante
-Curabitur tempor eros a risus eleifend faucibus
+Integer sed urna ac ex porta congue
+Etiam sagittis vehicula porta

Jika kita memberikan dua referensi, maka Git akan membandingkan referensi pada posisi kedua terhadap referensi pada posisi pertama yang kita berikan (urutannya berpengaruh!).

catatan: pada posisi HEAD, saya menambahkan baris ## oleh Lipsum.

$ git diff HEAD~ HEAD
diff --git a/puisi.md b/puisi.md
index 0a96d0e..544438e 100644
--- a/puisi.md
+++ b/puisi.md
@@ -1,4 +1,5 @@
 # Puisi
+## oleh Lipsum

 Lorem ipsum dolor sit amet
 Consectetur adipiscing elit

Jika urutan referensinya kita balikkan:

$ git diff HEAD HEAD~
diff --git a/puisi.md b/puisi.md
index 544438e..0a96d0e 100644
--- a/puisi.md
+++ b/puisi.md
@@ -1,5 +1,4 @@
 # Puisi
-## oleh Lipsum

 Lorem ipsum dolor sit amet
 Consectetur adipiscing elit

Referensi ini selain bisa diberikan sebagai Git refs seperti HEAD atau tags, bisa juga langsung diberikan sebagai commit hash.

Mencetak Hanya Nama Berkas yang Berubah

Kadang kita hanya perlu mengetahui berkas-berkas apa saja yang berubah. Kita dapat mencapainya dengan memberikan flag --name-only kepada git diff.

$ git diff --name-only
puisi.md

Menyaring Perubahan Berkas Berdasarkan Statusnya

Git dapat membedakan perubahan berkas pada working directory-nya berdasarkan tipe perubahan yang terjadi pada berkas tersebut. Pada git diff, kita dapat menyaring berkas yang berubah berdasarkan tipenya dengan flag --diff-filter. Berikut cara penggunaan dan input yang bisa kita berikan terhadap flag tersebut.

--diff-filter=[(A|C|D|M|R|T|U|X|B)…​[*]]

A: Added | ditambahkan ke index
C: Copied | disalin
D: Deleted | dihapus
M: Modified | dimodifikasi
R: Renamed | diubah namanya
T: Have their type changed | diubah tipenya
U: Unmerged | belum tergabungkan
X: Unknown | tidak diketahui
B: Have had their pairing broken | diubah sampai proporsi tertentu

Misalkan kita memiliki keadaan working directory seperti ini

$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	deleted:    aku-chairil-anwar.md
	modified:   puisi.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	hujan-bulan-juni-sapardi-djoko-darmono.md

no changes added to commit (use "git add" and/or "git commit -a")

Kita bisa melakukan git diff hanya untuk berkas yang dihapus dan berkas yang diubah dengan opsi --diff-filter=DM.

$ git diff --diff-filter=DM
diff --git a/aku-chairil-anwar.md b/aku-chairil-anwar.md
deleted file mode 100644
index fdcc0f3..0000000
--- a/aku-chairil-anwar.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# Aku
-## oleh Chairil Anwar
-
-Kalau sampai waktuku
-Ku mau tak seorang kan merayu
-Tidak juga kau
-
-Tak perlu sedu sedan itu
-
-Aku ini binatan jalang
-Dari kumpulannnya terbuang
-
-Biar peluru menembus tubuhku
-Aku tetap meradang menerjang
-
-Luka dan bisa kubawa berlari
-Berlari
-
-Hingga hilang pedih peri
-
-Dan aku akan lebih tidak peduli
-Ku mau hidup seribu tahun lagi
diff --git a/puisi.md b/puisi.md
index 544438e..5ee54f9 100644
--- a/puisi.md
+++ b/puisi.md
@@ -4,4 +4,5 @@
 Lorem ipsum dolor sit amet
 Consectetur adipiscing elit
 Sed vitae faucibus ante
-Curabitur tempor eros a risus eleifend faucibus
+Integer sed urna ac ex porta congue
+Etiam sagittis vehicula porta

Menyaring Perubahan Berkas pada Path Tertentu

Mungkin ada kasus di mana kita hanya perlu berkonsentrasi untuk memeriksa perubahan berkas-berkas pada direktori tertentu. Kita dapat memerintahkan git diff untuk mempersempit cakupannya menjadi dalam path tertentu dengan memberikan path-nya sebagai parameter.

Misalkan kita mempunyai keadaan working directory seperti ini.

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   puisi.md
	modified:   puisi/aku-chairil-anwar.md
	modified:   puisi/hujan-bulan-juni-sapardi-djoko-darmono.md

no changes added to commit (use "git add" and/or "git commit -a")

Kita dapat mempersempit cakupan eksekusi git diff menjadi hanya pada direktori puisi/.

$ git diff puisi/
diff --git a/puisi/aku-chairil-anwar.md b/puisi/aku-chairil-anwar.md
index fdcc0f3..c8ba01b 100644
--- a/puisi/aku-chairil-anwar.md
+++ b/puisi/aku-chairil-anwar.md
@@ -1,5 +1,6 @@
 # Aku
 ## oleh Chairil Anwar
+---

 Kalau sampai waktuku
 Ku mau tak seorang kan merayu
diff --git a/puisi/hujan-bulan-juni-sapardi-djoko-darmono.md b/puisi/hujan-bulan-juni-sapardi-djoko-darmono.md
index 38df39a..74c22c0 100644
--- a/puisi/hujan-bulan-juni-sapardi-djoko-darmono.md
+++ b/puisi/hujan-bulan-juni-sapardi-djoko-darmono.md
@@ -1,5 +1,6 @@
 # Hujan Bulan Juni
 ## oleh Sapardi Djoko Darmono
+---

 Tak ada yang lebih tabah
 Dari hujan bulan Juni

Namun, disarankan untuk menggunakan ekspresi shell -- untuk memisahkan antara opsi yang kita berikan kepada perintah git dengan parameter path yang kita berikan, seperti di bawah ini.

$ git diff -- puisi/

Selain kasus-kasus di atas, tentunya masih banyak lagi kegunaan git diff yang bisa dieksplorasi. Semuanya terdokumentasi di website Git SCM. Mari budayakan membaca dokumentasi untuk meningkatkan produktivitas kita!