Ringkasan Belajar GIT

GIT DASAR
Memastikan Git Berjalan:
git --version

Tool Pembantu:
View > Command Pallete > Install Code > Install 'code' command in PATH

Configuration:
git config --global user.name "Iis Istiqomah"
git config --global user.email "iisistiqomah20@gmail.com"

Menggunakan Visual Studio Code:
git config --global core.editor "code --wait"
git config --global diff.tool "default-difftool"
git config --global difftool.default-difftool.cmd "code --wait --diff \$LOCAL \$REMOTE"

Melihat Seluruh Configuration:
git config --list --show-origin

Membuat Repository:
git init

Mengecek Perubahan:
git status

Memindahkan Perubahan File ke Staging Index:
git add namaFile

Memindahkan Semua Perubahan File ke Staging Index:
git add .

Menyimpan Perubahan ke Repository:
git commit -m "messagenya apa"

Melihat Perubahan File:
git diff

Membatalkan Penambahan File di Working Directory:
git clean -f

Membatalkan Perubahan/Penghapusan File:
git restore namafile

Membatalkan dari Staging Index:
git restore --staged namafile

Commit Log (Melihat semua Riwayat Commit):
git log

Commit Log Sederhana:
git log --oneline
git log --oneline --graph

Melihat Detail Commit:
git show hash

Compare Commit (membandingkan hasil commit - dulu dan sekarang):
git diff hash1 hash2
git difftool hash1 hash2

Reset Commit:
git reset <mode> hash

Mode Git Reset
  • --soft, memindahkan HEAD pointer, namun tidak melakukan perubahan apapun di Staging Index dan Working Directory
  • --mixed (default), memindahkan HEAD pointer, mengubah Staging Index menjadi sama seperti dengan Repository, namun tidak mengubah apapun di Working Directory
  • --hard, memindahkan HEAD pointer, dan mengubah Staging Index dan Working Directory sehingga sama dengan Repository

Note:
  • Ketika menggunakan --soft maka perubahan yang ada di commit sebelumnya tidak ikut dihapus, artinya perubahannya masih tetap ada (dari repository ke staging index dan dari staging index ke working directory, tergantung terakhir perubahannya ada di mana).
  • Ketika menggunakan --mixed maka perubahannya masih tetap ada di working directory (yang ikut direset ke posisi HEAd adalah staging index)
  • Ketika menggunakan --hard maka semua perubahannya hilang (HEAD, staging index, dan working directory direset juga).
  • Kita bisa kembali ke awal commit selama belum membuat commit baru. 

Rewrite Riwayat Commit
  • Jika kita melakukan reset, namun kita belum membuat commit baru, kita masih bisa kembali maju lagi ke commit yang paling baru
  • Namun jika kita membuat commit baru, secara otomatis commit lama akan ditimpa oleh commit baru

Menambah Perubahan yang Terlupakan ke Commit Terakhir/Merge (Hash Commit Terakhir akan diganti dengan Hash Commit baru):
git commit --amend

Kembali pada Snapshoot Sebelumnya:
git checkout hash

Kembali pada Snapshoop Terakhir:
git checkout namabranch

Membatalkan Commit (Melakukan kembalikan/ After ke Before - akan dibuatkan commit baru):
git revert hash

Mencari Tahu Siapa yang Melakukan Perubahan File di Commit:
git blame namafile

Menambah Perintah Lain untuk yang sudah ada di GIT:
git config --global alias.ko commit
git config --global alias.logone "log --oneline"

---------------------------------------------------------------

GIT BRANCHING

Melihat Branch Saat Ini:
git branch --show-current

Membuat Branch:
git branch namabranchbaru

Melihat Semua Branch:
git branch --list
git branch

Pindah ke Branch Lain:
git switch namabranch
git checkout namabranch

Mengubah Nama Branch (Pindah dulu ke branch yang mau diubah namanya): 
git branch -m namabranchbaru

Menghapus Branch (Harus keluar dulu dari branch yang ingin dihapus):
git branch -d namabranch
git branch --delete namabranch

Menggabungkan Branch (Misal: branch master akan melakukan merge dan branch A akan di merge ke branch master, maka pindah dulu ke branch master lalu ex: git merge A):
git merge namabranch

Membatalkan Conflict (membatalkan merge):
git merge --abort

Cherry Pick (Mengambil commit dari branch manapun dan kita merge ke branch saat ini):
git cherry-pick commitId

Membuat Tag (Menandai Sebuah Commit ID):
git tag tagName commitId

Menampilkan Daftar Tag:
git tag -l
git tag --list

Checkout ke Tag:
git checkout tagname

Menghapus Tag:
git tag -d namatag
git tag --delete nametag

Stash (Tempat menyimpan perubahan di working directory/staging index sementara):
git stash push -m ‘message stash’

Melihat Semua Stash:
git stash list

Melihat Perubahan yg Terjadi di Stash: 
git stash show stashId

Mengambil Perubahan di Stash:
git stash apply stashId

Menghapus Stash:
git stash drop stashId

Menghapus Semua Stash:
git stash clear

Rebase (Menggabungkan dua branch yg menjadikan commitnya jadi satu timeline)
  • Misal: menjadikan commit terakhir di branch master menjadi basenya dari commit-commit branch A (branch master melakukan rebase, branch A yang direbase) 
  • Caranya: pindah dulu ke branch A lalu, ex: git rebase master, hasilnya commit-commit di branch A akan dibuat ulang di branch master di depan commit terakhir branch master sehingga menjadi satu timeline)
  • Setelah itu, jika kita pindah ke branch master, posisi HEAD di branch master masih tetap berada di commit terakhir branch master, sehingga kita perlu melakukan merge untuk memindahkan posisi HEAD ke commit yang paling depan, caranya: pindah ke branch master lalu lakukan, ex: git merge A. Hasilnya posisi HEAD di branch master ada di commit paling depan yang sama dengan di branch A)

Melakukan Rebase:
git rebase namaBrach

Squash (Menggabungkan semua commit di branch A ke branch master ke dalam satu commit)
  • Misal, di branch A kita membuat dua commit, lalu pindah ke branch master, di branch master lakukan ex: git merge --squash A, maka perubahan di commit-commit di branch A akan ada di staging index branch master. Selanjutnya lakukan commit. 
  • Note: branch A masih tetap ada dan timelinenya tetap bercabang.
posisi di branch master, ex: git merge --squash A, nanti ditarik ke staging index):
git merge --squash namabranch

-----------------------------------------------------------------------------------------

GIT REMOTE

SSH (Protokol jaringan untuk komunikasi jaringan)

Membuat SSH Key:
ssh-keygen

Tes SSH ke GitHub:
ssh -T git@github.com

Menambah Remote Repository:
git remote add namaRemote ssh-url

Melihat Remote Repository:
git remote

Melihat URL Detail Remote Repository:
git remote get-url nama

Menghapus Remote Repository:
git remote rm nama

Push Branch ke Remote Repository:
git push namaremote localbranch

Push Branch dengan Nama Branch Berbeda dengan di Local:
git push namaremote localbranch:remotebranch

Push Semua Branch ke Remote Repository:
git push origin --all

Menghapus Branch di Remote Repository:
git push --delete namaremote namabranch

Melakukan Clone Remote Repository:
git clone urlremoterepository

Melakukan Clone Remote Repository (dengan nama project berbeda):
git clone urlremoterepository namafolder

Default Hasil Clone:
- Default clone akan berisi remote repository origin ke git remote repository yang kita clone
- Default clone akan berisikan branch utama di remote repository

Melihat Daftar Remote Branch:
git branch -r

Melihat Daftar Remote Branch dan Local Branch:
git branch -a

Membuat Branch dari Remote Branch (yang berisikan data dari remote branch):
git checkout -b localbranch namaremote/remotebranch

Fetch: untuk melihat perubahan terakhir di remote repository

Melakukan Fetch:
git fetch namaremote

Melakukan Fetch (di remote branch tertentu):
git fetch namaremote remotebranch

Membandingkan Branch Local dan Branch Remote:
git diff brachlocal..namaremote/branchremote

Pull: mengambil Perubahan di remote repository dan disimpan di local repository 

Melakukan Pull:
git pull namaremote namaremotebranch

Mengirim Tag Tertentu ke Remote Repository:
git push namaremote nametag

Mengirim Semua Tag ke Remote Repository:
git push namaremote --tags

Mengambil Tag  tertentu dari Remote Repository:
git fetch namaremote nametag

Mengambil Semua Tag dari Remote Repository:
git fetch namaremote

Menghapus Tag di Remote Repository:
git push --delete namaremote nametag

Pull Request: fitur di GitHub utuk melakukan merge branch di remote repositorynya langsung

Melakukan Merge Conflict Saat Pull Request:
git merge namaremote/remotebranch

Submodule: folder yang berisi library lain di Remote Repository (submodule nge-link ke library lain).

Menambah Submodule:
git submodule add urlgitrepo namafolder

Mengupdate (Mengambil Perubahan) Submodule Tertentu:
git submodule update --remote namafolder

Mengupdate (Mengambil Perubahan) Semua Submodule:
git submodule update --remote

Clone Submodule (dilakukan oleh user yang meng-clone remote repository):
Langkah 1:
git submodule init
Langkah 2:
git submodule update --remote

Mengubah Branch Submodule:
Langkah 1:
git submodule update --remote
Langkah 2:
git submodule set-branch --branch namabranch namafolder
Langkah 3:
git submodule update --remote

Mengubah Branch Submodule (dilakukan oleh user yang meng-clone remote repository):
Langkah 1:
git pull namaremote remotebranch
Langkah 2:
git submodule update --remote

Menghapus Submodule:
Untuk menghapus submodule, kita bisa hapus folder submodule nya, lalu ubah file .gitmodules nya

Fork (duplikasi project remote repository, biasanya jika mau kontribusi ke project opensource)

SELESAI.