Yogi Rahman Alif

Pengoprasian Git

Categories: blog , tools

Pada blog post ini, saya akan gunakan untuk membagikan dan mencatat bagaimana cara mengoperasikan git

Contents

Apa itu Git?

Git merupakan alat untuk melakukan kontrol versi dari suatu source code.. Emang apa fungsinya kontrol versi dari source code??

Kita semua pasti pernah melakukan perubahan pada suatu file, tapi pas lagi di tengah melakukan perubahan kepikiran, eh, kayaknya perubahan sebelumnya lebih bagus, tanpa disadari ternyata udah ga bisa undo dan akhirnya hanya bisa meratapi layar selama beberapa waktu😅 Dari pada kesusahan begini, mending dari awal udah siapin pencegahan, nah.. oleh karena itu pada blog ini saya akan memberitahu bagaimana pengoperasian git…

Jadi git itu sendiri fungsi utamanya ada 2:

Diantara teman saya, sering ketukar-tukar nih antara Git sama Github.. jadi keduanya itu berbeda yak.. Git merupakan alat untuk mengelola versi source code, sedangkan GitHub merupakan online platform untuk menyimpan, berbagi, dan kolaborasi source code yang dikelola versinya menggunakan Git dan terdiri atas banyak folder project (project ini biasa disebut repository).. Jadi jangan sampai kebalik lagi~

Terms yang berkaitan dengan Git

Repository

Semua kode yang ingin dikelola versinya dalam satu folder (biasa disebut project) adalah definisi dari repositori. berikut contoh suatu repositori dari oh-my-zsh

➜  ~/.oh-my-zsh git:(master)
» tree -a -L 1 /home/yogi/.oh-my-zsh --gitignore
/home/yogi/.oh-my-zsh
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── .devcontainer
├── .editorconfig
├── .git
--omitted--

9 directories, 11 files

Commit

Pencatatan yang harus dilakukan dari setiap penambahan, perubahan, dan penghapusan yang terjadi pada suatu repositoriー semisal kita menambahkan file A kedalam repositori dan commit, lalu melakukan perubahan pada file A di repositori itu lalu stage dan commitー maka sudah terdapat 2 versi dari repositori tersebut yang tercatat dalam riwayat commit (committed).

Misal terdapat suatu repositori:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean

File dan folder yang terdapat di dalam suatu repositori bisa terdiri dari:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)

    new file:   README
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   README

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:   CONTRIBUTING.md
$ echo 'My Project' > README
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    README

nothing added to commit but untracked files present (use "git add" to track)

Kita juga bisa menggunakan git status -s atau git status --short untuk menentukan status dari file yang ada di dalam sebuah repositori bisa dibedakan berdasarkan simbolnya [kode] [nama file]

$ git status -s
 M README               # File ini telah dimodifikasi, namun belum staged
MM Rakefile             # File ini telah dimodifikasi, dan staged, tetapi dimodifikasi kembali
A  lib/git.rb           # File yang baru ditambahkan ke dalam repositori
M  lib/simplegit.rb     # File yang telah dimodifikasi dan staged
?? LICENSE.txt          # Untracked file

Setiap kita melakukan commit pada repositori, maka kita akan membuat:

commit objects

Lebih detail lagi bisa dibaca di sini dan di sini

Branch

Tujuannya agar kita dapat mengerjakan pengembangan/perbaikan fungsi spesifik suatu projek tanpa mengganggu main/base branch yang ada (kalau dulu main, sekarang master branch). Ini merupakan “killer feature” dari git, karena desainnya yang ringan (menggunakan snapshot untuk setiap commit yang dilakukan), sehingga membuat branch dan pergantian antar branch sangat cepat, dan membuat fitur ini yang paling diandalkan dibanding VCS lain, ini bukan saya yang bilangー tapi statement dari git officialnya langsung~

Lebih detail lagi bisa dibaca di sini

Merge

Tujuannya untuk mengimpor perubahan yang terjadi pada suatu branch yang telah dilakukan perubahan terhadap suatu branchー uhh.. mungkin bahasanya terlalu ribet…

Semisal ada suatu base branch (main), untuk menambahkan suatu fitur baru tanpa mengganggu branch main, dibuatlah branch (feature/a), setelah fitur berhasil dibuat pada (feature/a)ー maka hasil perubahan ini dapat diimpor ke base branch dalam hal ini adalah main…

Tapi kenapa nggak jadiin aja branch (feature/a) sebagai branch utama? kalau bekerja sebagai tim, mengelola kodenya akan pusing..

Jika kita menggunakan merge, semisal ada 2 orang (A dan B), si A membuat branch baru dari (main) branch untuk membuat fitur A, dan B membuat branch baru juga untuk membuat fitur B, setetlah si A selesai, dia dapat merge ke branch (main), dan B dapat melakukan merge setelahnya ketika dia sudah selesai juga pada branch (main)ー begini kan enak…

git merge

Kalau keduanya memutuskan untuk membuat branch masing2 jadi branch utama malah jadi susah yang ada.. projek gak selesai, ribut yang ada😅

Oke, sekarang udah terselesaikan gimana dua orang mengerjakan fitur yang berbeda… tapi gimana kalau misalnya masing-masing si A dan B merubah file yang sama? maka akan terjadi konflik…

git merge conflict

Gimana cara untuk memperbaiki konflik tersebut? kita bahas pada perintah git di bawah..

Instalasi Git

Instalasi sangat mudah sekali, karena hanya perlu mengunjungi Git - Downloads atau brew install git dan apt install git untuk macOS dan Linux (Debian based)

Perintah Git

Saya akan menggunakan direktori berikut untuk menerapkan perintah git

./operasi
├── matematika.py
└── statistika.py

git --version untuk melihat versi dari git dan memastikan git telah terinstall

Setup git untuk penggunaan pribadi dengan menambahkan name dan email pada global config dengan cara:

Untuk inisiasi repositori pada direktori projek yang sedang dikerjakanー lakukan git init <path> atau kalau projek yang ingin dijadikan repositori ada di working directory saat ini, maka bisa git init .

Akan muncul hasilnya seperti berikut

➜  ~/random/python_thing/operasi
» git init .
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint:   git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint:   git branch -m <name>
Initialized empty Git repository in /home/yogi/random/python_thing/operasi/.git/

Lalu lakukan command git status atau git status -s untuk melihat bagaimana status repositori sekarang, maka akan muncul seperti berikut

➜  ~/random/python_thing/operasi git:(master)
» git status -s
?? matematika.py
?? statistika.py

Terlihat terdapat untracked file ditandai dengan simbol ??, untuk memasukkan file tersebut pada staging area agar versi file tersebut dikelola oleh git (tracked) adalah dengan cara git add <nama_file>, git stage <nama_file> atau <nama_file> bisa menggunakan . untuk memasukkan semua file yang ada pada projek ke dalam repositori

➜  ~/random/python_thing/operasi git:(master)
» git status -s
A  matematika.py
A  statistika.py

Maka akan muncul simbol A menandakan file baru tersebut telah ditambahkan ke staging area, dan dapat dilakukan commit

Lalu saya akan mencoba mengedit file statistika.py dalam keadaan telah ditambahkan ke staging area, maka

» git status -s
A  matematika.py
AM statistika.py

Terlihat bahwa status file statistika adalah AM atau telah ditambahkan lalu dimodifikasi… kita juga dapat melihat apa saja perubahan yang diterapkan pada file statistika.py dengan perintah git diff

diff --git a/statistika.py b/statistika.py
index 104af12..a4ef10f 100644
--- a/statistika.py
+++ b/statistika.py
@@ -1,7 +1,5 @@
 #!/usr/bin/env python3
+import scipy.special as spsp

-def tambah(x, y):
-    return x + y
-
-def kali(x, y):
-    return x * y
+def binomial(n, k, p):
+    return spsp.comb(n, k=k) * (p ** k) * ((1-p) ** (n-k))

Maka akan terlihat line mana saja yang telah dikurangi pada old file, dan line mana saja yang ditambah pada new file, masing-masing ditandai dengan simbol - untuk yang dihapus dan + untuk yang ditambah… untuk memasukkan file statistika.py kembali pada staging area, bisa gunakan git add <nama_file> atau git stage <nama_file> kembali.

Selanjutnya adalah commit changes terhadap file yang telah ditambahkan pada staging area dengan cara git commit -m "Pesan Commit", untuk awal repositori, biasanya orang akan memasukkan “initial commit”, atau “first commit”.

➜  ~/random/python_thing/operasi git:(master)
» git commit -m "first commit"
[master (root-commit) 82317ea] first commit
 2 files changed, 12 insertions(+)
 create mode 100644 matematika.py
 create mode 100644 statistika.py

Terlihat pada hasil commit tersebut terdapat hexadecimal 82317ea, ini merupakan nilai hash dari checksum sha-1 commit object yang telah dibuat, dan ini biasa disebut commit id

Selanjutnya saya sudah mencoba menjalankan file statistika.py dengan mengimpornya.. sehingga python membuat file direktori/folder __pycache__/ untuk dilakukan percobaan .gitignore

➜  ~/random/python_thing/operasi git:(master)
» ls
matematika.py  __pycache__  statistika.py
➜  ~/random/python_thing/operasi git:(master)
» git status -s
?? __pycache__/

Terlihat direktori __pycache__/ dibuat, dan dideteksi sebagai untracked file

➜  ~/random/python_thing/operasi git:(master)
» cat .gitignore
__pycache__/
➜  ~/random/python_thing/operasi git:(master)
» git status -s
?? .gitignore

Setelah __pycache__/ ditambahkan pada file .gitignore maka tidak akan tampak lagi pada repositori untuk masa yang akan datang juga😅 Jangan lupa untuk menambahkan file .gitignore ke dalam staging area dan commit dengan message Add .gitignore, pastikan semua pesan commit sesuai dengan penambahan, perubahan, atau penghapusan apa yang telah dilakukan…


Bagaimana dengan branching dan merge???

Merge dengan menambahkan file baru (tidak memodifikasi base branch)

Pertama yang harus dilakukan yaitu seperti mengklon master branch dengan cara git checkout -b feature/fisika

➜  ~/random/python_thing/operasi git:(master)
» git checkout -b feature/fisika
Switched to a new branch 'feature/fisika'
➜  ~/random/python_thing/operasi git:(feature/fisika)
» ls
matematika.py  __pycache__  statistika.py

Selanjutnya saya akan menambahkan file fisika.py dan melakukan merge

➜  ~/random/python_thing/operasi git:(feature/fisika)
» git status -s
?? fisika.py

➜  ~/random/python_thing/operasi git:(feature/fisika)
» git add fisika.py

➜  ~/random/python_thing/operasi git:(feature/fisika)
» git commit -m "add fisika.py"
[feature/fisika 6ae4e2d] add fisika.py
 1 file changed, 3 insertions(+)
 create mode 100644 fisika.py

➜  ~/random/python_thing/operasi git:(feature/fisika)
» git checkout master
Switched to branch 'master'

➜  ~/random/python_thing/operasi git:(master)
» git merge feature/fisika
Updating ead4ec9..6ae4e2d
Fast-forward
 fisika.py | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 fisika.py

Jika teradapat anggota tim yang mengerjakan branch berbeda dan menggunakan snapshot dari base branch (master) yang sama dengan feature/fisika, maka tidak akan mengganggu proses merge dari anggota tim tersebut nantinyaー karena branch feature/fisika hanya menambahkan file, dan tidak memodifikasi file dari base branchー suatu konflik juga bisa terjadi jika penamaan suatu file dari branch berbeda yang ingin di-merge ke base branch adalah sama.

Merge dengan memodifikasi base branch (ketika terjadi konflik)

Saya akan mencoba untuk merubah suatu fungsi dalam file yang sama dari dua branch yang berbeda…

Berikut merupakan perubahan yang saya terapkan pada branch bugfix/matematika-perkalian, tidak terlalu banyak perubahan, karena hanya untuk mengetes merge

Nama Branch Aksi Detail
bugfix/matematika-perkalian Membuat branch
➜  ~/random/python_thing/operasi git:(master)
» git checkout -b bugfix/matematika-perkalian
Switched to a new branch 'bugfix/matematika-perkalian'
feature/tambah-argumen-kali Membuat branch
➜  ~/random/python_thing/operasi git:(master)
» git checkout -b feature/tambah-argumen-kali
Switched to a new branch 'feature/tambah-argumen-kali'
bugfix/matematika-perkalian Perubahan file
diff --git a/matematika.py b/matematika.py
index 104af12..d3d84d9 100644
--- a/matematika.py
+++ b/matematika.py
@@ -3,5 +3,5 @@
 def tambah(x, y):
     return x + y

-def kali(x, y):
+def kali(x, y) -> int:
     return x * y

feature/tambah-argumen-kali Perubahan file
diff --git a/matematika.py b/matematika.py
index 104af12..03f9f3a 100644
--- a/matematika.py
+++ b/matematika.py
@@ -3,5 +3,8 @@
 def tambah(x, y):
     return x + y

-def kali(x, y):
-    return x * y
+def kali(*args):
+    result = 0
+    for i in range(len(args)-1):
+        result += args[i] * args[i+1]
+    return result

master Merge bugfix/matematika-perkalian
➜  ~/random/python_thing/operasi git:(bugfix/matematika-perkalian)
» git add matematika.py
➜  ~/random/python_thing/operasi git:(bugfix/matematika-perkalian)
» git commit -m "bug fix matematika"
[bugfix/matematika-perkalian 653f084] bug fix matematika
 1 file changed, 1 insertion(+), 1 deletion(-)
➜  ~/random/python_thing/operasi git:(bugfix/matematika-perkalian)
» git checkout master
Switched to branch 'master'
➜  ~/random/python_thing/operasi git:(master)
» git merge bugfix/matematika-perkalian
Updating 6ae4e2d..653f084
Fast-forward
 matematika.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
master Merge feature/tambah-argumen-kali
➜  ~/random/python_thing/operasi git:(master)
» git merge bugfix/matematika-perkalian
Updating 6ae4e2d..653f084
Fast-forward
 matematika.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
➜  ~/random/python_thing/operasi git:(master)
» git merge feature/tambah-argumen-kali
Auto-merging matematika.py
CONFLICT (content): Merge conflict in matematika.py
Automatic merge failed; fix conflicts and then commit the result.

Terlihat pada kolom terakhir tabel di atas, konflik terjadi dikarenakan file base branch (maseter) dimodifikasi pada branch bugfix/matematika-perkalian, untuk memperbaikinya kita dapat melihat terlebih dahulu file apa saja yang terdapat konflik dengan git status -s atau git status

➜  ~/random/python_thing/operasi git:(master)
» git status -s
UU matematika.py

➜  ~/random/python_thing/operasi git:(master)
» git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
        both modified:   matematika.py

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

Ternyata file yang terjadi konflik adalah matematika.py, langsung saja kita lihat bagaimana isi file matematika.py

➜  ~/random/python_thing/operasi git:(master)
» cat matematika.py
#!/usr/bin/env python3

def tambah(x, y):
    return x + y

<<<<<<< HEAD
def kali(x, y) -> int:
    return x * y
=======
def kali(*args):
    result = 0
    for i in range(len(args)-1):
        result += args[i] * args[i+1]
    return result
>>>>>>> feature/tambah-argumen-kali

Terlihat terdapat penanda

Selanjutnya saya akan memperbaiki file tersebut, lalu melakukan commit ulang

➜  ~/random/python_thing/operasi git:(master)
» cat matematika.py
#!/usr/bin/env python3

def tambah(x, y):
    return x + y

def kali(*args):
    result = 0
    for i in range(len(args)-1):
        result += args[i] * args[i+1]
    return result

➜  ~/random/python_thing/operasi git:(master)
» git add matematika.py

➜  ~/random/python_thing/operasi git:(master)
» git status -s
M  matematika.py

➜  ~/random/python_thing/operasi git:(master)
» git commit -m "Merge branch feature/tambah-argumen-kali"
[master f3e1f85] Merge branch feature/tambah-argumen-kali
Graph commit yang telah dilakukan

*   2025-06-01 f3e1f85 (HEAD -> master) Merge branch feature/tambah-argumen-kali (bofuryuu)
|\  
| * 2025-06-01 f1e4d2a (feature/tambah-argumen-kali) membuat fungsi kali bisa mengalikan beberapa angka (bofuryuu)
* | 2025-05-31 653f084 (bugfix/matematika-perkalian) bug fix matematika (bofuryuu)
|/  
* 2025-05-31 6ae4e2d (feature/fisika) add fisika.py (bofuryuu)
* 2025-05-31 ead4ec9 Add .gitignore (bofuryuu)
* 2025-05-31 82317ea first commit (bofuryuu)

Baiklah, mungkin segitu saja untuk pengoperasian git…

Oh iya, untuk hard reset dan commit revert

Perintah Efek Aman untuk remote repositori
git reset --hard <commit_id1> Jika dijalankan, menghapus commit setelah <commit_id> ❌ Tidak aman
git revert <commit_id> Jika dijalankan, menambah commit baru yang membalik commit tertentu ✅ Aman

Kalau butuh “undo” tapi tetap mau menjaga riwayat commit, pakai git revert. Kalau mau benar-benar “hapus jejak”, dan yakin sedang bekerja sendiri atau tahu risikonya, baru git reset --hard.

Mungkin bisa dicoba praktekkan~


Penutup

Baiklah sekian saja yang dapat saya share terkait pengoperasian git, jika ada kesalahan dalam penyampaian mohon dimaafkan😅

Terima kasih sudah membaca!