🐙 Git āĻāĻŦāĻ‚ GitHub CLI

Multilingual DevOps cheat sheet: Linux, Docker, Git, Kubernetes, Helm, Terraform, practical scenarios & templates.
āĻĒā§āϰāĻ•āĻžāĻļāĻŋāϤ

ā§Šā§§ āφāĻ—āĻ¸ā§āϟ, ⧍ā§Ļ⧍ā§Ģ

āĻ­āĻžāĻ°ā§āϏāύ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞ, āĻŦā§āϰāĻžāĻžā§āϚāĻŋāĻ‚, āϰāĻŋāĻŽā§‹āϟ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ, āĻ¸ā§āĻŸā§āϝāĻžāĻļ, āĻŸā§āϝāĻžāĻ— āĻāĻŦāĻ‚ GitHub CLI āĻāϰ āϜāĻ¨ā§āϝ āĻŽā§ŒāϞāĻŋāĻ• āĻ“ āωāĻ¨ā§āύāϤ Git āĻ•āĻŽāĻžāĻ¨ā§āĻĄāĨ¤

🔹 āĻŽā§ŒāϞāĻŋāĻ• āĻ•āĻŽāĻžāĻ¨ā§āĻĄ

āĻ•āĻŽāĻžāĻ¨ā§āĻĄ

āωāĻĻāĻžāĻšāϰāĻŖ

āĻŦāĻ°ā§āĻŖāύāĻž

git add āĻāĻ•āϟāĻŋ āĻĢāĻžāχāϞāϕ⧇ staging area-āĻ āϝ⧋āĻ— āĻ•āϰāĻž
git add file.txt

āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āĻ•āĻŽāĻŋāĻŸā§‡āϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻĢāĻžāχāϞ stage āĻ•āϰāĻž

git add .

āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋ āĻ“ āύāĻŋāĻšā§‡āϰ āϏāĻŦ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ stage āĻ•āϰāĻž

git add -p

āχāĻ¨ā§āϟāĻžāĻ°â€Œā§āϝāĻžāĻ•ā§āϟāĻŋāĻ­āĻ­āĻžāĻŦ⧇ āĻĢāĻžāχāϞ⧇āϰ āϕ⧋āύ āĻ…āĻ‚āĻļ stage āĻ•āϰāĻŦ⧇āύ āϤāĻž āĻŦ⧇āϛ⧇ āύ⧇āĻ“āϝāĻŧāĻž (partial commit-āĻāϰ āϜāĻ¨ā§āϝ āωāĻĒāϝ⧋āĻ—ā§€)

git clone āĻāĻ•āϟāĻŋ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ āύāϤ⧁āύ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϤ⧇ āĻ•ā§āϞ⧋āύ āĻ•āϰāĻž
git clone -b branch_name URL

āĻĄāĻŋāĻĢāĻ˛ā§āĻŸā§‡āϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻŦā§āϰāĻžāĻžā§āϚ āĻ•ā§āϞ⧋āύ āĻ•āϰāĻž

git clone --depth 1 URL

āĻļ⧁āϧ⧁ āϏāĻ°ā§āĻŦāĻļ⧇āώ āĻ•āĻŽāĻŋāϟ āĻ•ā§āϞ⧋āύ āĻ•āϰāĻž (shallow copy) āϏāĻŽāϝāĻŧ āĻ“ āĻ¸ā§āĻĒ⧇āϏ āĻŦāĻžāρāϚāĻžāϤ⧇

git commit āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋāϤ⧇ āϰ⧇āĻ•āĻ°ā§āĻĄ āĻ•āϰāĻž
git commit -m "Initial commit"

āĻāĻĄāĻŋāϟāϰ āύāĻž āϖ⧁āϞ⧇ āĻŽā§‡āϏ⧇āϜāϏāĻš āĻ•āĻŽāĻŋāϟ āĻ•āϰāĻž

git commit -a -m "Fix bugs"

āϏāĻŦ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāĻŋāϤ tracked āĻĢāĻžāχāϞ stage āĻāĻŦāĻ‚ āĻŽā§‡āϏ⧇āϜāϏāĻš āĻ•āĻŽāĻŋāϟ āĻ•āϰāĻž

git commit --amend

āĻļ⧇āώ āĻ•āĻŽāĻŋāϟ āφāĻĒāĻĄā§‡āϟ āĻ•āϰāĻž (āĻŽā§‡āϏ⧇āϜ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻŦāĻž āφāϰāĻ“ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ)

git commit --fixup abc1234

āĻāĻ•āϟāĻŋ fixup āĻ•āĻŽāĻŋāϟ āϤ⧈āϰāĻŋ āĻ•āϰāĻž, āϝāĻž āĻĒāϰ⧇ interactive rebase-āĻ squash āĻšāĻŦ⧇

git config āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ āĻŦāĻž āĻ—ā§āϞ⧋āĻŦāĻžāϞ āĻ…āĻĒāĻļāύ āϏ⧇āϟ/āĻĒāĻžāĻ“āϝāĻŧāĻž
git config --global user.name "Name"

āĻ—ā§āϞ⧋āĻŦāĻžāϞ Git username āϏ⧇āϟ āĻ•āϰāĻž

git config --global user.email "email@example.com"

āĻ—ā§āϞ⧋āĻŦāĻžāϞ Git email āϏ⧇āϟ āĻ•āϰāĻž

git config --list

āϏāĻŦ Git āϏ⧇āϟāĻŋāĻ‚āϏ āϤāĻžāϞāĻŋāĻ•āĻž (name, email, editor, āχāĻ¤ā§āϝāĻžāĻĻāĻŋ)

git diff āĻ•āĻŽāĻŋāϟāϗ⧁āϞ⧋āϰ āĻŽāĻ§ā§āϝ⧇ āĻŦāĻž āĻ•āĻŽāĻŋāϟ āĻ“ working tree-āĻāϰ āĻŽāĻ§ā§āϝ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻĻ⧇āĻ–āĻžāύ⧋
git diff HEAD

āĻļ⧇āώ āĻ•āĻŽāĻŋāϟ āĻĨ⧇āϕ⧇ āϕ⧀ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰ⧇āϛ⧇āύ (unstaged changes)

git diff --staged

āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āĻ•āĻŽāĻŋāĻŸā§‡ āϕ⧀ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻšāĻŦ⧇ āϤāĻž āĻĻ⧇āĻ–āĻžāύ⧋

git diff --word-diff HEAD~1

āĻļāĻŦā§āĻĻ-āĻ¸ā§āϤāϰ⧇āϰ āĻĒāĻžāĻ°ā§āĻĨāĻ•ā§āϝ āϏāĻš āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻĻ⧇āĻ–āĻžāύ⧋

git grep āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ āĻĢāĻžāχāϞ⧇āϰ āĻ­āĻŋāϤāϰ⧇ āϏāĻžāĻ°ā§āϚ āĻ•āϰāĻž
git grep "functionName"

āϏāĻŦ āĻĢāĻžāχāϞ⧇ functionName āĻ–ā§‹āρāϜāĻž

git grep -n "TODO"

TODO āĻĨāĻžāĻ•āĻž āϞāĻžāχāύāϗ⧁āϞ⧋ line number āϏāĻš āĻ–ā§‹āρāϜāĻž (āϕ⧋āĻĄ āύ⧋āϟ āϖ⧁āρāϜāϤ⧇ āωāĻĒāϝ⧋āĻ—ā§€)

git grep -i "login"

login āĻļāĻŦā§āĻĻāϟāĻŋ case-insensitive āϏāĻžāĻ°ā§āϚ āĻ•āϰāĻž (Login, LOGIN, login, āχāĻ¤ā§āϝāĻžāĻĻāĻŋ)

git init āĻāĻ•āϟāĻŋ āĻ–āĻžāϞāĻŋ Git āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ āϤ⧈āϰāĻŋ āĻŦāĻž āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύāϟāĻŋāϕ⧇ āĻĒ⧁āύāϰāĻžāϝāĻŧ āχāύāĻŋāĻļāĻŋāϝāĻŧāĻžāϞāĻžāχāϜ āĻ•āϰāĻž
git init my-project

my-project āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϤ⧇ āύāϤ⧁āύ repo āχāύāĻŋāĻļāĻŋāϝāĻŧāĻžāϞāĻžāχāϜ

git init --bare

āĻāĻ•āϟāĻŋ bare āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ āχāύāĻŋāĻļāĻŋāϝāĻŧāĻžāϞāĻžāχāϜ

git log āĻ•āĻŽāĻŋāϟ āϞāĻ— āĻĻ⧇āĻ–āĻžāύ⧋
git log --oneline

āĻ•āĻŽāĻŋāϟ āχāϤāĻŋāĻšāĻžāϏ āĻāĻ• āϞāĻžāχāύ⧇ āĻ•āĻŽāĻĒā§āϝāĻžāĻ•ā§āϟāĻ­āĻžāĻŦ⧇ āĻĻ⧇āĻ–āĻžāύ⧋

git log --graph --all

āϏāĻŦ āĻŦā§āϰāĻžāĻžā§āϚ āĻ­āĻŋāĻœā§āϝ⧁āϝāĻŧāĻžāϞ āĻ—ā§āϰāĻžāĻĢāϏāĻš āĻĻ⧇āĻ–āĻžāύ⧋

git log -p --stat

āĻ•āĻŽāĻŋāĻŸā§‡āϰ āϜāĻ¨ā§āϝ patch āĻ“ āĻĢāĻžāχāϞ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ⧇āϰ āĻ¸ā§āĻŸā§āϝāĻžāϟ āĻĻ⧇āĻ–āĻžāύ⧋

git reset āĻĢāĻžāχāϞ unstaged āĻ•āϰāĻž, āĻ•āĻŋāĻ¨ā§āϤ⧁ working directory-āϤ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āϰāĻžāĻ–āĻž
git reset HEAD file.txt

āĻ¸ā§āĻŸā§‡āϜāĻŋāĻ‚ āĻĨ⧇āϕ⧇ āĻĢāĻžāχāϞ āϏāϰāĻžāύ⧋ (āĻāĻĄāĻŋāϟ āĻĨāĻžāϕ⧇)

git reset --hard HEAD~1

āĻāĻ• āĻ•āĻŽāĻŋāϟ āĻĒāĻŋāĻ›āĻŋāϝāĻŧ⧇ āϝāĻžāĻ“āϝāĻŧāĻž āĻ“ āϏāĻŦ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž (āĻ…āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ⧀āϝāĻŧ!)

git reset --soft HEAD~1

āĻļ⧇āώ āĻ•āĻŽāĻŋāϟ undo āĻ•āϰāĻž āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύāϗ⧁āϞ⧋ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻ•āĻŽāĻŋāĻŸā§‡āϰ āϜāĻ¨ā§āϝ āϰāĻžāĻ–āĻž

git reset --mixed HEAD~1

āĻāĻ•āϟāĻŋ āĻ•āĻŽāĻŋāϟ undo āĻ•āϰāĻž āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ unstaged āϰāĻžāĻ–āĻž

git show āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āϧāϰāύ⧇āϰ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻĻ⧇āĻ–āĻžāύ⧋
git show <commit_hash>

āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āĻŽāĻŋāĻŸā§‡āϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ“ āĻŽā§‡āϏ⧇āϜ āĻĻ⧇āĻ–āĻžāύ⧋

git show HEAD~1

āĻŦāĻ°ā§āϤāĻŽāĻžāύ⧇āϰ āφāϗ⧇āϰ āĻ•āĻŽāĻŋāϟ āĻĻ⧇āĻ–āĻžāύ⧋

git show --stat

āϏāĻ°ā§āĻŦāĻļ⧇āώ āĻ•āĻŽāĻŋāĻŸā§‡āϰ āĻĢāĻžāχāϞ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ⧇āϰ āϏāĻžāϰāĻžāĻ‚āĻļ āĻĻ⧇āĻ–āĻžāύ⧋

git status working tree-āĻāϰ āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āĻĻ⧇āĻ–āĻžāύ⧋
git status -s

āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āϏāĻ‚āĻ•ā§āώāĻŋāĻĒā§āϤ āĻĢāϰāĻŽā§āϝāĻžāĻŸā§‡ āĻĻ⧇āĻ–āĻžāύ⧋

git status -b

āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻŦā§āϰāĻžāĻžā§āϚ āĻ“ āĻĢāĻžāχāϞ āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āĻĻ⧇āĻ–āĻžāύ⧋

đŸŒŋ āĻŦā§āϰāĻžāĻžā§āϚāĻŋāĻ‚ āĻāĻŦāĻ‚ āĻŽāĻžāĻ°ā§āϜāĻŋāĻ‚

āĻ•āĻŽāĻžāĻ¨ā§āĻĄ

āωāĻĻāĻžāĻšāϰāĻŖ

āĻŦāĻ°ā§āĻŖāύāĻž

git branch āĻŦā§āϰāĻžāĻžā§āϚ āϤ⧈āϰāĻŋ, āϤāĻžāϞāĻŋāĻ•āĻž āĻŦāĻž āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž
git branch new-feature

new-feature āύāĻžāĻŽā§‡ āύāϤ⧁āύ āĻŦā§āϰāĻžāĻžā§āϚ āϤ⧈āϰāĻŋ

git branch -d old-feature

old-feature āύāĻžāĻŽā§‡ āϞ⧋āĻ•āĻžāϞ āĻŦā§āϰāĻžāĻžā§āϚ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž

git checkout āĻŦā§āϰāĻžāĻžā§āϚ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻŦāĻž āĻ…āĻ¨ā§āϝ āĻ•āĻŽāĻŋāϟ āĻĨ⧇āϕ⧇ āĻĢāĻžāχāϞ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāĻž
git checkout main

main āĻŦā§āϰāĻžāĻžā§āĻšā§‡ āϏ⧁āχāϚ āĻ•āϰāĻž

git checkout -b new-branch

new-branch āύāĻžāĻŽā§‡ āύāϤ⧁āύ āĻŦā§āϰāĻžāĻžā§āϚ āϤ⧈āϰāĻŋ āĻ“ āϏ⧁āχāϚ

git switch āĻŦā§āϰāĻžāĻžā§āϚ āϏ⧁āχāϚ āĻ•āϰāĻž (checkout āĻāϰ āϏāϰāϞ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ)
git switch main

main āĻŦā§āϰāĻžāĻžā§āĻšā§‡ āϏ⧁āχāϚ

git switch -c feature-x

feature-x āύāĻžāĻŽā§‡ āύāϤ⧁āύ āĻŦā§āϰāĻžāĻžā§āϚ āϤ⧈āϰāĻŋ āĻ“ āϏ⧁āχāϚ

git switch new-feature

new-feature āύāĻžāĻŽā§‡ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻŦā§āϰāĻžāĻžā§āĻšā§‡ āϏ⧁āχāϚ

git merge āĻ…āĻ¨ā§āϝ āĻŦā§āϰāĻžāĻžā§āĻšā§‡āϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻŦā§āϰāĻžāĻžā§āĻšā§‡ āĻŽāĻŋāϞāĻŋāϝāĻŧ⧇ āĻĻ⧇āĻ“āϝāĻŧāĻž
git merge new-feature

new-feature āĻŦā§āϰāĻžāĻžā§āϚāϕ⧇ āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻŦā§āϰāĻžāĻžā§āĻšā§‡ āĻŽāĻžāĻ°ā§āϜ āĻ•āϰāĻž

git merge --no-ff new-feature

fast-forward āϏāĻŽā§āĻ­āĻŦ āĻšāϞ⧇āĻ“ āϏāĻŦāϏāĻŽāϝāĻŧ merge commit āϤ⧈āϰāĻŋ

git merge --abort

conflict āĻšāϞ⧇ merge āĻŦāĻžāϤāĻŋāϞ āĻ“ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ revert

git rebase āĻ•āĻŽāĻŋāϟāϗ⧁āϞ⧋āϕ⧇ āύāϤ⧁āύ base āĻ•āĻŽāĻŋāĻŸā§‡āϰ āωāĻĒāϰ āϏāϰāĻžāύ⧋ āĻŦāĻž āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰāĻž
git rebase main

āύāĻŋāĻœā§‡āϰ āĻŦā§āϰāĻžāĻžā§āϚ āĻ•āĻŽāĻŋāϟāϗ⧁āϞ⧋āϕ⧇ main āĻāϰ āωāĻĒāϰ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻĒā§āϰāϝāĻŧā§‹āĻ—

git rebase -i HEAD~3

āĻļ⧇āώ ā§ŠāϟāĻŋ āĻ•āĻŽāĻŋāϟ āχāĻ¨ā§āϟāĻžāĻ°â€Œā§āϝāĻžāĻ•ā§āϟāĻŋāĻ­āĻ­āĻžāĻŦ⧇ āĻāĻĄāĻŋāϟ āĻ•āϰāĻž

git rebase --abort

āϚāϞāĻŽāĻžāύ rebase āĻĨāĻžāĻŽāĻžāύ⧋ āĻ“ undo āĻ•āϰāĻž

git rebase -i --autosquash HEAD~5

interactive rebase-āĻ fixup/squash āĻ•āĻŽāĻŋāϟ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ squash

git cherry-pick āĻ…āĻ¨ā§āϝ āĻŦā§āϰāĻžāĻžā§āϚ āĻĨ⧇āϕ⧇ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āĻŽāĻŋāϟ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰāĻž
git cherry-pick <hash>

āĻšā§āϝāĻžāĻļ āĻĻā§āĻŦāĻžāϰāĻž āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āĻŽāĻŋāϟ āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻŦā§āϰāĻžāĻžā§āĻšā§‡ āĻĒā§āϰāϝāĻŧā§‹āĻ—

git cherry-pick --continue

conflict āϏāĻŽāĻžāϧāĻžāύ⧇āϰ āĻĒāϰ cherry-pick āϚāĻžāϞāĻŋāϝāĻŧ⧇ āϝāĻžāĻ“āϝāĻŧāĻž

git cherry-pick A^..B

A (excluding) āĻĨ⧇āϕ⧇ B (including) āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āĻ•āĻŽāĻŋāϟ āĻĒā§āϰāϝāĻŧā§‹āĻ—

📡 āϰāĻŋāĻŽā§‹āϟ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ

āĻ•āĻŽāĻžāĻ¨ā§āĻĄ

āωāĻĻāĻžāĻšāϰāĻŖ

āĻŦāĻ°ā§āĻŖāύāĻž

git remote āϰāĻŋāĻŽā§‹āϟ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋāϰ (āϝ⧇āĻŽāύ GitHub) āϞāĻŋāĻ™ā§āĻ• āĻŽā§āϝāĻžāύ⧇āϜ āĻ•āϰāĻž
git remote -v

āϰāĻŋāĻŽā§‹āϟ āύāĻžāĻŽ āĻ“ URL āĻĻ⧇āĻ–āĻžāύ⧋

git remote add origin URL

origin āύāĻžāĻŽā§‡ āϰāĻŋāĻŽā§‹āϟ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ āϝ⧋āĻ— āĻ•āϰāĻž

git pull āϰāĻŋāĻŽā§‹āϟ āĻŦā§āϰāĻžāĻžā§āϚ āĻĨ⧇āϕ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ“ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻŽāĻžāĻ°ā§āϜ āĻ•āϰāĻž
git pull origin main

āϰāĻŋāĻŽā§‹āϟ main āĻŦā§āϰāĻžāĻžā§āϚ āĻĨ⧇āϕ⧇ āĻĢ⧇āϚ āĻ“ āĻŽāĻžāĻ°ā§āϜ āĻ•āϰāĻž

git pull --rebase origin main

āĻŽāĻžāĻ°ā§āĻœā§‡āϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ āĻĢ⧇āϚ āĻ•āϰ⧇ āϰāĻŋāĻŦ⧇āϏ āĻ•āϰāĻž

git push āϞ⧋āĻ•āĻžāϞ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āϰāĻŋāĻŽā§‹āϟ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋāϤ⧇ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž
git push origin main

āϞ⧋āĻ•āĻžāϞ main āĻŦā§āϰāĻžāĻžā§āϚāϕ⧇ āϰāĻŋāĻŽā§‹āϟ origin āĻ push āĻ•āϰāĻž

git fetch āϰāĻŋāĻŽā§‹āϟ āĻĨ⧇āϕ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ•āϰāĻž āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻŽāĻžāĻ°ā§āϜ āύāĻž āĻ•āϰāĻž
git fetch origin

āϰāĻŋāĻŽā§‹āϟ origin āĻĨ⧇āϕ⧇ āϏāĻŦ āφāĻĒāĻĄā§‡āϟ āĻĢ⧇āϚ āĻ•āϰāĻž āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻĒā§āϰāϝāĻŧā§‹āĻ— āύāĻž āĻ•āϰāĻž

git fetch origin main

āĻļ⧁āϧ⧁ main āĻŦā§āϰāĻžāĻžā§āϚ āĻĢ⧇āϚ āĻ•āϰāĻž

git fetch --all

āϏāĻŦ āϰāĻŋāĻŽā§‹āϟ āĻĨ⧇āϕ⧇ āφāĻĒāĻĄā§‡āϟ āĻĢ⧇āϚ āĻ•āϰāĻž

git fetch --prune

āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž āĻŦā§āϰāĻžāĻžā§āϚāϗ⧁āϞ⧋ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻ•āϰāĻž (āϞ⧋āĻ•āĻžāϞ āϰ⧇āĻĢāĻžāϰ⧇āĻ¨ā§āϏ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž)

git fetch --dry-run

āĻĄāĻžāωāύāϞ⧋āĻĄ āύāĻž āĻ•āϰ⧇ āϕ⧀ āĻĢ⧇āϚ āĻšāĻŦ⧇ āϤāĻž āĻĻ⧇āĻ–āĻžāύ⧋

git fetch origin +main

āϞ⧋āĻ•āĻžāϞ āĻŸā§āĻ°ā§āϝāĻžāĻ•āĻŋāĻ‚ āĻŦā§āϰāĻžāĻžā§āϚ (origin/main) āĻœā§‹āϰāĻĒā§‚āĻ°ā§āĻŦāĻ• āφāĻĒāĻĄā§‡āϟ āĻ•āϰāĻž

đŸ“Ļ āĻ¸ā§āĻŸā§āϝāĻžāĻļ āĻāĻŦāĻ‚ āĻ•ā§āϞāĻŋāύāφāĻĒ

āĻ•āĻŽāĻžāĻ¨ā§āĻĄ

āωāĻĻāĻžāĻšāϰāĻŖ

āĻŦāĻ°ā§āĻŖāύāĻž

git stash āĻ•āĻŽāĻŋāϟ āύāĻž āĻ•āϰāĻž āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āϏāĻžāĻŽāϝāĻŧāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŖ (work in progress)
git stash

āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāĻŋāϤ āĻ“ staged āĻĢāĻžāχāϞ āϏāĻ‚āϰāĻ•ā§āώāĻŖ, working directory āĻļ⧇āώ āĻ•āĻŽāĻŋāĻŸā§‡ āĻĢāĻŋāϰāĻŋāϝāĻŧ⧇ āĻĻ⧇āĻ“āϝāĻŧāĻž

git stash apply

āϏāĻ°ā§āĻŦāĻļ⧇āώ stash āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻĒā§āϰāϝāĻŧā§‹āĻ— (stash āĻĨ⧇āϕ⧇ āϝāĻžāĻŦ⧇)

git stash pop

āϏāĻ°ā§āĻŦāĻļ⧇āώ stash āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ“ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž

git stash list

āϏāĻŦ stash āϤāĻžāϞāĻŋāĻ•āĻž āĻĻ⧇āĻ–āĻžāύ⧋

git stash branch feature-fix

āύāϤ⧁āύ āĻŦā§āϰāĻžāĻžā§āϚ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āϏāĻ°ā§āĻŦāĻļ⧇āώ stash āĻĒā§āϰāϝāĻŧā§‹āĻ—

git clean untracked āĻĢāĻžāχāϞ āĻ¸ā§āĻĨāĻžāϝāĻŧā§€āĻ­āĻžāĻŦ⧇ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž (Git-āĻ āύ⧇āχ)
git clean -f

āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϰ untracked āĻĢāĻžāχāϞ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž

git clean -fd

untracked āĻĢāĻžāχāϞ āĻ“ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž

git clean -n

āϕ⧀ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž āĻšāĻŦ⧇ āϤāĻž preview āĻ•āϰāĻž (āύāĻŋāϰāĻžāĻĒāĻĻ dry run)

đŸˇī¸ āĻŸā§āϝāĻžāĻ—

āĻ•āĻŽāĻžāĻ¨ā§āĻĄ

āωāĻĻāĻžāĻšāϰāĻŖ

āĻŦāĻ°ā§āĻŖāύāĻž

git tag āχāϤāĻŋāĻšāĻžāϏ⧇āϰ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻĒāϝāĻŧ⧇āĻ¨ā§āĻŸā§‡ āĻŸā§āϝāĻžāĻ— āϤ⧈āϰāĻŋ, āϤāĻžāϞāĻŋāĻ•āĻž āĻŦāĻž āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž (āϝ⧇āĻŽāύ āϰāĻŋāϞāĻŋāϜ)
git tag -a v1.0 -m "Version 1.0"

v1.0 āύāĻžāĻŽā§‡ annotated āĻŸā§āϝāĻžāĻ— āĻŽā§‡āϏ⧇āϜāϏāĻš āϤ⧈āϰāĻŋ (āϰāĻŋāϞāĻŋāĻœā§‡āϰ āϜāĻ¨ā§āϝ āĻ­āĻžāϞ⧋)

git tag -d v1.0

v1.0 āύāĻžāĻŽā§‡ āϞ⧋āĻ•āĻžāϞ āĻŸā§āϝāĻžāĻ— āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž (āϰāĻŋāĻŽā§‹āĻŸā§‡ āĻĒā§āϰāĻ­āĻžāĻŦ āĻĢ⧇āϞ⧇ āύāĻž)

git push āϞ⧋āĻ•āĻžāϞ āĻĨ⧇āϕ⧇ āϰāĻŋāĻŽā§‹āĻŸā§‡ āĻ•āĻŽāĻŋāϟ, āĻŦā§āϰāĻžāĻžā§āϚ āĻ“ āĻŸā§āϝāĻžāĻ— āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž
git push origin --tags

āϏāĻŦ āϞ⧋āĻ•āĻžāϞ āĻŸā§āϝāĻžāĻ— āϰāĻŋāĻŽā§‹āĻŸā§‡ push āĻ•āϰāĻž (āĻāĻ•āĻžāϧāĻŋāĻ• āĻ­āĻžāĻ°ā§āϏāύ āĻŸā§āϝāĻžāĻ— āĻ•āϰāĻžāϰ āĻĒāϰ⧇ āωāĻĒāϝ⧋āĻ—ā§€)

git push origin v1.0

āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻŸā§āϝāĻžāĻ— (āϝ⧇āĻŽāύ v1.0) āϰāĻŋāĻŽā§‹āĻŸā§‡ push āĻ•āϰāĻž

git push origin :refs/tags/v1.0

āϰāĻŋāĻŽā§‹āϟ āĻŸā§āϝāĻžāĻ— v1.0 āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž (colon āϏāĻŋāύāĻŸā§āϝāĻžāĻ•ā§āϏ āϞāĻ•ā§āĻˇā§āϝ āĻ•āϰ⧁āύ)

đŸ› ī¸ āĻ•āύāĻĢā§āϞāĻŋāĻ•ā§āϟ āϰ⧇āϜāĻ˛ā§āϝ⧁āĻļāύ

āĻ•āĻŽāĻžāĻ¨ā§āĻĄ

āωāĻĻāĻžāĻšāϰāĻŖ

āĻŦāĻ°ā§āĻŖāύāĻž

git mergetool merge conflict āϏāĻŽāĻžāϧāĻžāύ⧇āϰ āϜāĻ¨ā§āϝ āĻ­āĻŋāĻœā§āϝ⧁āϝāĻŧāĻžāϞ āϟ⧁āϞ āĻ–ā§‹āϞāĻž
git mergetool --tool=meld

Meld-āĻāϰ āĻŽāϤ⧋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϟ⧁āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ conflict āĻ āĻŋāĻ• āĻ•āϰāĻž

git rerere āφāϗ⧇ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ conflict āϏāĻŽāĻžāϧāĻžāύ āĻ•āϰ⧇āϛ⧇āύ Git āϤāĻž āĻŽāύ⧇ āϰāĻžāϖ⧇
git config --global rerere.enabled true

āφāϗ⧇āϰ āϏāĻŽāĻžāϧāĻžāύ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻŦā§āϝāĻŦāĻšāĻžāϰ āϏāĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰāĻž

git rerere status

āϕ⧋āύ āĻĢāĻžāχāϞ⧇āϰ conflict resolution āϏāĻ‚āϰāĻ•ā§āώāĻŋāϤ āφāϛ⧇ āϤāĻž āĻĻ⧇āĻ–āĻžāύ⧋

git rerere diff

āĻ­āĻŦāĻŋāĻˇā§āϝāϤ⧇āϰ āϜāĻ¨ā§āϝ Git āϕ⧀ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧇āϛ⧇ āϤāĻž āĻĻ⧇āĻ–āĻžāύ⧋

âš™ī¸ āωāĻ¨ā§āύāϤ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ

āĻ•āĻŽāĻžāĻ¨ā§āĻĄ

āωāĻĻāĻžāĻšāϰāĻŖ

āĻŦāĻ°ā§āĻŖāύāĻž

git bisect āĻŦāĻžāĻ— āφāϏāĻž āĻ•āĻŽāĻŋāϟ āϖ⧁āρāϜāϤ⧇ āĻŦāĻžāχāύāĻžāϰāĻŋ āϏāĻžāĻ°ā§āϚ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž
git bisect start

āĻ­āĻžāϞ⧋ āĻ“ āĻ–āĻžāϰāĻžāĻĒ āĻ•āĻŽāĻŋāĻŸā§‡āϰ āĻŽāĻ§ā§āϝ⧇ āϏāĻžāĻ°ā§āϚ āĻļ⧁āϰ⧁ āĻ•āϰ⧇ āĻŦāĻžāĻ— āϖ⧁āρāĻœā§‡ āĻŦ⧇āϰ āĻ•āϰāĻž

git bisect bad

āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻ•āĻŽāĻŋāϟāϕ⧇ “bad” āĻšāĻŋāϏ⧇āĻŦ⧇ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰāĻž

git bisect good <commit>

āĻāĻ•āϟāĻŋ “good” āĻ•āĻŽāĻŋāϟ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰāĻž āϝ⧇āĻ–āĻžāύ⧇ āĻŦāĻžāĻ— āĻ›āĻŋāϞ āύāĻž

git blame āĻĒā§āϰāϤāĻŋāϟāĻŋ āϞāĻžāχāύ⧇āϰ āϏāĻ°ā§āĻŦāĻļ⧇āώ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύāĻ•āĻžāϰ⧀āϰ āύāĻžāĻŽ, āϰāĻŋāĻ­āĻŋāĻļāύ āĻ“ āϞ⧇āĻ–āĻ• āĻĻ⧇āĻ–āĻžāύ⧋
git blame file.txt

āĻĢāĻžāχāϞ⧇āϰ āĻĒā§āϰāϤāĻŋāϟāĻŋ āϞāĻžāχāύ⧇āϰ āϞ⧇āĻ–āĻ• āĻ“ āĻ•āĻŽāĻŋāϟ āϤāĻĨā§āϝ āĻĻ⧇āĻ–āĻžāύ⧋

git blame -L 10,20 file.txt

āĻļ⧁āϧ⧁ ā§§ā§Ļâ€“ā§¨ā§Ļ āϞāĻžāχāύ⧇āϰ blame āϤāĻĨā§āϝ āĻĻ⧇āĻ–āĻžāύ⧋

git blame --show-email file.txt

āϞāĻžāχāύ⧇āϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ⧇āϰ āϏāĻžāĻĨ⧇ āϞ⧇āĻ–āϕ⧇āϰ āχāĻŽā§‡āχāϞāĻ“ āĻĻ⧇āĻ–āĻžāύ⧋

git reflog āĻŦā§āϰāĻžāĻžā§āϚ āĻŽā§āĻ­āĻŽā§‡āĻ¨ā§āϟ āĻ“ HEAD-āĻāϰ āϰ⧇āĻĢāĻžāϰ⧇āĻ¨ā§āϏ āϞāĻ— (reflog) āĻĻ⧇āĻ–āĻž āĻ“ āĻŽā§āϝāĻžāύ⧇āϜ āĻ•āϰāĻž
git reflog show main@{1.week.ago}

main āĻŦā§āϰāĻžāĻžā§āϚ āĻāĻ• āϏāĻĒā§āϤāĻžāĻš āφāϗ⧇ āϕ⧋āĻĨāĻžāϝāĻŧ āĻ›āĻŋāϞ āϤāĻž āĻĻ⧇āĻ–āĻž

git reflog expire --expire=30.days --dry-run

ā§Šā§Ļ āĻĻāĻŋāύ⧇āϰ āĻŦ⧇āĻļāĻŋ āĻĒ⧁āϰāĻžāύ⧋ āϕ⧋āύ reflog āĻāĻ¨ā§āĻŸā§āϰāĻŋ clean āĻšāĻŦ⧇ āϤāĻž preview āĻ•āϰāĻž

git reflog delete HEAD@{2}

āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ reflog āĻāĻ¨ā§āĻŸā§āϰāĻŋ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž (āϏāϤāĻ°ā§āĻ•āϤāĻžāϰ āϏāĻžāĻĨ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ)

git submodule āϏāĻžāĻŦāĻŽāĻĄāĻŋāωāϞ (āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋāϰ āĻ­āĻŋāϤāϰ⧇ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ) āϝ⧋āĻ—, āχāύāĻŋāĻļāĻŋāϝāĻŧāĻžāϞāĻžāχāϜ, āφāĻĒāĻĄā§‡āϟ āĻŦāĻž āĻĒāϰāĻŋāĻĻāĻ°ā§āĻļāύ āĻ•āϰāĻž
git submodule add URL path

āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ path-āĻ āĻŦāĻžāĻšā§āϝāĻŋāĻ• āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ āϏāĻžāĻŦāĻŽāĻĄāĻŋāωāϞ āĻšāĻŋāϏ⧇āĻŦ⧇ āϝ⧋āĻ— āĻ•āϰāĻž

git submodule update --init

āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋāϰ āϏāĻŦ āϏāĻžāĻŦāĻŽāĻĄāĻŋāωāϞ āχāύāĻŋāĻļāĻŋāϝāĻŧāĻžāϞāĻžāχāϜ āĻ“ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ•āϰāĻž

git submodule foreach git pull

āĻĒā§āϰāϤāĻŋāϟāĻŋ āϏāĻžāĻŦāĻŽāĻĄāĻŋāωāϞ⧇ git pull āϚāĻžāϞāĻŋāϝāĻŧ⧇ āφāĻĒāĻĄā§‡āϟ āĻ•āϰāĻž

git submodule sync --recursive

.gitmodules āĻĢāĻžāχāϞ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ⧇āϰ āĻĒāϰ āϏāĻžāĻŦāĻŽāĻĄāĻŋāωāϞ URL āϏāĻŽāĻ¨ā§āĻŦāϝāĻŧ āĻ•āϰāĻž

git submodule update --remote --merge

āϏāĻžāĻŦāĻŽāĻĄāĻŋāωāϞāϗ⧁āϞ⧋āϕ⧇ āϤāĻžāĻĻ⧇āϰ āϰāĻŋāĻŽā§‹āϟ āĻŦā§āϰāĻžāĻžā§āĻšā§‡āϰ āϏāĻ°ā§āĻŦāĻļ⧇āώ āĻ•āĻŽāĻŋāĻŸā§‡ āφāĻĒāĻĄā§‡āϟ āĻ•āϰāĻž

git archive āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āĻŽāĻŋāϟ āĻŦāĻž āĻŦā§āϰāĻžāĻžā§āϚ āĻĨ⧇āϕ⧇ āĻĢāĻžāχāϞ āφāĻ°ā§āĻ•āĻžāχāĻ­ (zip, tar āχāĻ¤ā§āϝāĻžāĻĻāĻŋ) āϤ⧈āϰāĻŋ
git archive --format=zip HEAD > archive.zip

HEAD āĻĨ⧇āϕ⧇ āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻĒā§āϰāĻœā§‡āĻ•ā§āϟ āĻĢāĻžāχāϞ⧇āϰ ZIP āφāĻ°ā§āĻ•āĻžāχāĻ­ āϤ⧈āϰāĻŋ

git archive -o release.tar.gz HEAD

HEAD āĻĨ⧇āϕ⧇ .tar.gz āφāĻ°ā§āĻ•āĻžāχāĻ­ āϤ⧈āϰāĻŋ

git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz

project/ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰāϏāĻš .tar.gz āφāĻ°ā§āĻ•āĻžāχāĻ­ āϤ⧈āϰāĻŋ

git gc āĻ…āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āĻĢāĻžāχāϞ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻ“ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ āĻ…āĻĒā§āϟāĻŋāĻŽāĻžāχāϜ āĻ•āϰāĻž
git gc --aggressive

āĻ—āĻ­ā§€āϰ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻ“ āĻ…āĻĒā§āϟāĻŋāĻŽāĻžāχāϜ (āϧ⧀āϰ āĻšāϤ⧇ āĻĒāĻžāϰ⧇ āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ)

git gc --prune=now

āϏāĻŦ unreachable āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻ…āĻŦāĻŋāϞāĻŽā§āĻŦ⧇ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž (āϏāϤāĻ°ā§āĻ•āϤāĻž!)

git shortlog āϞ⧇āĻ–āĻ• āĻ“ āϤāĻžāĻĻ⧇āϰ āĻ•āĻŽāĻŋāĻŸā§‡āϰ āĻĻā§āϰ⧁āϤ āϏāĻžāϰāϏāĻ‚āĻ•ā§āώ⧇āĻĒ
git shortlog -e

āϞ⧇āĻ–āϕ⧇āϰ āϤāĻžāϞāĻŋāĻ•āĻž āχāĻŽā§‡āχāϞāϏāĻš āĻĻ⧇āĻ–āĻžāύ⧋ (āϕ⧇ āĻ•āϤ āĻ…āĻŦāĻĻāĻžāύ āϰ⧇āϖ⧇āϛ⧇ āĻŦāĻŋāĻļā§āϞ⧇āώāϪ⧇āϰ āϜāĻ¨ā§āϝ)

git shortlog -s -n

āϞ⧇āĻ–āĻ• āĻ•āϤ āĻ•āĻŽāĻŋāϟ āĻ•āϰ⧇āϛ⧇āύ āϤāĻž āϏāĻ‚āĻ–ā§āϝāĻž āĻ…āύ⧁āϏāĻžāϰ⧇ āϏāĻžāϜāĻžāύ⧋

git shortlog -sne

āύāĻžāĻŽ āĻ“ āχāĻŽā§‡āχāϞāϏāĻš āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤ āĻ•āĻžāĻ°ā§āϝāĻ•āϞāĻžāĻĒ āĻŸā§āĻ°ā§āϝāĻžāĻ•āĻŋāĻ‚

git revert āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻ•āĻŽāĻŋāϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āĻĒā§‚āĻ°ā§āĻŦ⧇āϰ āĻ•āĻŽāĻŋāĻŸā§‡āϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻĒā§‚āĻ°ā§āĻŦāĻžāĻŦāĻ¸ā§āĻĨāĻžāϝāĻŧ āĻĢāĻŋāϰāĻŋāϝāĻŧ⧇ āĻĻ⧇āĻ“āϝāĻŧāĻž (āχāϤāĻŋāĻšāĻžāϏ āύāĻž āĻŦāĻĻāϞāĻŋāϝāĻŧ⧇)
git revert HEAD

āĻļ⧇āώ āĻ•āĻŽāĻŋāϟ undo āĻ•āϰāĻž āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻ•āĻŽāĻŋāϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧇

git revert <commit_hash>

āĻšā§āϝāĻžāĻļ āĻĻā§āĻŦāĻžāϰāĻž āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āĻŽāĻŋāϟ undo āĻ•āϰāĻž āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻ•āĻŽāĻŋāϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧇

🐙 GitHub CLI

gh āφāĻĒāύāĻžāϕ⧇ āϟāĻžāĻ°ā§āĻŽāĻŋāύāĻžāϞ āĻĨ⧇āϕ⧇ GitHub āĻŽā§āϝāĻžāύ⧇āϜ āĻ•āϰāϤ⧇ āĻĻ⧇āϝāĻŧāĨ¤

āĻ•āĻŽāĻžāĻ¨ā§āĻĄ

āωāĻĻāĻžāĻšāϰāĻŖ

āĻŦāĻ°ā§āĻŖāύāĻž

gh auth login āĻāĻ•āϟāĻŋ GitHub āĻšā§‹āĻ¸ā§āĻŸā§‡ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻ•āϰ⧁āύ āϝāĻžāϤ⧇ CLI āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡āϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇
gh auth login --with-token < mytoken.txt

āĻāĻ•āϟāĻŋ āĻĢāĻžāχāϞ⧇ (mytoken.txt) āϏāĻ‚āϰāĻ•ā§āώāĻŋāϤ personal access token āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ

gh auth login --hostname enterprise.internal

GitHub Enterprise āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ (github.com āύāϝāĻŧ)

gh repo clone āĻāĻ•āϟāĻŋ GitHub āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ āφāĻĒāύāĻžāϰ āϞ⧋āĻ•āĻžāϞ āĻŽā§‡āĻļāĻŋāύ⧇ āĻ•ā§āϞ⧋āύ āĻ•āϰāĻž
gh repo clone user/repo

user āĻāϰ āĻŽāĻžāϞāĻŋāĻ•āĻžāύāĻžāϧ⧀āύ āϰāĻŋāĻĒā§‹ repo āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ⧇ āĻ•ā§āϞ⧋āύ āĻ•āϰāĻž

gh repo clone cli/cli -- --depth=1

āĻļ⧁āϧ⧁ āϏāĻ°ā§āĻŦāĻļ⧇āώ āĻ•āĻŽāĻŋāϟ āĻ•ā§āϞ⧋āύ āĻ•āϰāĻž āĻĻā§āϰ⧁āϤ āĻ“ āϛ⧋āϟ āĻ•ā§āϞ⧋āύ⧇āϰ āϜāĻ¨ā§āϝ

gh repo clone cli/cli workspace/cli

āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ workspace/cli āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ⧇ āĻ•ā§āϞ⧋āύ āĻ•āϰāĻž

gh issue list āĻāĻ•āϟāĻŋ GitHub āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋāϰ issues āϤāĻžāϞāĻŋāĻ•āĻž, āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧇ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻ•ā§āϰāĻžāχāĻŸā§‡āϰāĻŋāϝāĻŧāĻž āĻĻā§āĻŦāĻžāϰāĻž āĻĢāĻŋāĻ˛ā§āϟāĻžāϰ āĻ•āϰāĻž
gh issue list --assignee "@me"

āφāĻĒāύāĻžāϰ āϜāĻ¨ā§āϝ assigned issues āϤāĻžāϞāĻŋāĻ•āĻž

gh issue list --state all

āĻ¸ā§āĻŸā§‡āϟ āύāĻŋāĻ°ā§āĻŦāĻŋāĻļ⧇āώ⧇ (open āĻŦāĻž closed) issues āϤāĻžāϞāĻŋāĻ•āĻž

gh issue list --search "error no:assignee sort:created-asc"

“error” āĻŽā§‡āϞāĻžāύ⧋ issues āϤāĻžāϞāĻŋāĻ•āĻž, unassigned, creation date āĻ…āύ⧁āϝāĻžāϝāĻŧā§€ ascending

gh pr create CLI āĻĻāĻŋāϝāĻŧ⧇ GitHub-āĻ pull request āϤ⧈āϰāĻŋ āĻ•āϰāĻž
gh pr create --title "..."

āĻĒā§āϰāĻĻāĻ¤ā§āϤ āĻļāĻŋāϰ⧋āύāĻžāĻŽ āϏāĻš pull request āϤ⧈āϰāĻŋ

gh pr create --project "Roadmap"

pull request-āϕ⧇ “Roadmap” āύāĻžāĻŽā§‡ GitHub āĻĒā§āϰāĻœā§‡āĻ•ā§āĻŸā§‡āϰ āϏāĻžāĻĨ⧇ āϞāĻŋāĻ™ā§āĻ• āĻ•āϰāĻž

gh pr create --base develop --head monalisa:feature

fork monalisa āĻāϰ feature āĻŦā§āϰāĻžāĻžā§āϚ āĻĨ⧇āϕ⧇ develop āĻŦā§āϰāĻžāĻžā§āĻšā§‡ PR āϤ⧈āϰāĻŋ

gh repo create CLI āĻĨ⧇āϕ⧇ āύāϤ⧁āύ GitHub āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰāĻž
gh repo create my-project

my-project āύāĻžāĻŽā§‡ āύāϤ⧁āύ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ GitHub-āĻ āϤ⧈āϰāĻŋ (āχāĻ¨ā§āϟāĻžāĻ°â€Œā§āϝāĻžāĻ•ā§āϟāĻŋāĻ­ āĻĒā§āϰāĻŽā§āĻĒāϟ āφāϏāĻŦ⧇)

gh repo create my-project --public --clone

āĻāĻ•āϟāĻŋ public āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ āϤ⧈āϰāĻŋ āĻ“ āϞ⧋āĻ•āĻžāϞāĻŋ āĻ•ā§āϞ⧋āύ āĻ•āϰāĻž

gh repo create my-project --private --source=. --remote=upstream

āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ private āϰāĻŋāĻŽā§‹āϟ repo āϤ⧈āϰāĻŋ āĻāĻŦāĻ‚ upstream āύāĻžāĻŽā§‡ āϰāĻŋāĻŽā§‹āϟ āϝ⧋āĻ— āĻ•āϰāĻž

💡 Git āĻāϞāĻŋāϝāĻŧāĻžāϏ (āϏāĻšāϜ āĻļāĻ°ā§āϟāĻ•āĻžāϟ)

āϏāĻžāϧāĻžāϰāĻŖ Git āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻĻā§āϰ⧁āϤ āϚāĻžāϞāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āϏ⧁āĻŦāĻŋāϧāĻžāϜāύāĻ• āĻāϞāĻŋāϝāĻŧāĻžāϏ āϏ⧇āϟāφāĻĒ āĻ•āϰ⧁āύ:

git config --global alias.br branch                                       # āĻļāĻ°ā§āϟāĻ•āĻžāϟ: git branch
git config --global alias.ci commit                                       # āĻļāĻ°ā§āϟāĻ•āĻžāϟ: git commit
git config --global alias.co checkout                                     # āĻļāĻ°ā§āϟāĻ•āĻžāϟ: git checkout
git config --global alias.graph "log --oneline --graph --all --decorate"  # āϏ⧁āĻ¨ā§āĻĻāϰ āχāϤāĻŋāĻšāĻžāϏ āĻ—ā§āϰāĻžāĻĢ
git config --global alias.last "log -1 HEAD"                              # āϏāĻ°ā§āĻŦāĻļ⧇āώ āĻ•āĻŽāĻŋāϟ āĻĻ⧇āĻ–āĻžāĻ“
git config --global alias.st status                                       # āĻļāĻ°ā§āϟāĻ•āĻžāϟ: git status

🚀 āĻĒ⧇āĻļāĻžāĻĻāĻžāϰāĻĻ⧇āϰ āϜāĻ¨ā§āϝ āωāĻ¨ā§āύāϤ Git āĻ•āĻŽāĻžāĻ¨ā§āĻĄ

āĻ•āĻŽāĻžāĻ¨ā§āĻĄ

āωāĻĻāĻžāĻšāϰāĻŖ

āĻŦāĻ°ā§āĻŖāύāĻž

git filter-repo Git āχāϤāĻŋāĻšāĻžāϏ āĻĒ⧁āύāĻ°ā§āϞāĻŋāĻ–āύ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻļāĻ•ā§āϤāĻŋāĻļāĻžāϞ⧀ āĻ“ āĻĻā§āϰ⧁āϤ āϟ⧁āϞ: āĻĢāĻžāχāϞ, āϞ⧇āĻ–āĻ• āĻŦāĻž āĻĒāĻĨ āϏāϰāĻžāύ⧋/āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāĻž āϝāĻžāϝāĻŧ; git filter-branch āĻāϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšāϝāĻŧ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āĻ“ āĻ—āϤāĻŋāϰ āϜāĻ¨ā§āϝ
git filter-repo --path secret.txt --invert-paths

āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ āχāϤāĻŋāĻšāĻžāϏ āĻĒ⧁āύāĻ°ā§āϞāĻŋāĻ–āύ āĻ•āϰ⧇ āϏāĻ‚āĻŦ⧇āĻĻāύāĻļā§€āϞ āĻĢāĻžāχāϞ/āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋ āϏāϰāĻžāύ⧋ (āϏāϤāĻ°ā§āĻ•āϤāĻžāϰ āϏāĻžāĻĨ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ)

git filter-repo --replace-text replacements.txt

āĻĒ⧁āϰ⧋ āχāϤāĻŋāĻšāĻžāϏ⧇ āĻāĻ•āϏāĻžāĻĨ⧇ string āĻŦāĻž pattern āϰāĻŋāĻĒā§āϞ⧇āϏ āĻ•āϰāĻž (āϝ⧇āĻŽāύ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋāϝāĻŧāĻžāϞ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻ•āϰāĻž)

git filter-repo --subdirectory-filter src

āĻāĻ•āϟāĻŋ āϏāĻžāĻŦāĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϰ āχāϤāĻŋāĻšāĻžāϏ āύāϤ⧁āύ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋāϤ⧇ āĻāĻ•ā§āϏāĻŸā§āĻ°ā§āϝāĻžāĻ•ā§āϟ āĻ•āϰāĻž, āĻ•āĻŽāĻŋāϟ āĻŽā§‡āϟāĻžāĻĄāĻžāϟāĻž āĻŦāϜāĻžāϝāĻŧ āϰ⧇āϖ⧇

git worktree āĻāĻ•āϟāĻŋ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋāϰ āϏāĻžāĻĨ⧇ āĻāĻ•āĻžāϧāĻŋāĻ• working āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋ āĻŽā§āϝāĻžāύ⧇āϜ āĻ•āϰāĻž, āĻ•ā§āϞ⧋āύ āĻ›āĻžāĻĄāĻŧāĻž āĻāĻ•āĻžāϧāĻŋāĻ• āĻŦā§āϰāĻžāĻžā§āĻšā§‡ āĻāĻ•āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻž
git worktree add ../feature feature-branch

āĻāĻ•āχ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋāϤ⧇ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ working tree āϤ⧈āϰāĻŋ āĻ•āϰāĻž, parallel branch checkout āϏāĻŽā§āĻ­āĻŦ āĻ•āϰāϤ⧇

git worktree list

āϏāĻŦ active worktree, āϤāĻžāĻĻ⧇āϰ path āĻ“ āĻŦā§āϰāĻžāĻžā§āϚ āϤāĻžāϞāĻŋāĻ•āĻž āĻĻ⧇āĻ–āĻžāύ⧋

git worktree remove ../feature

āĻĒā§āϰāϝāĻŧā§‹āϜāύ āύāĻž āĻšāϞ⧇ āĻāĻ•āϟāĻŋ linked worktree āϏāϰāĻŋāϝāĻŧ⧇ āĻĢ⧇āϞāĻž

git replace āĻ…āĻ¸ā§āĻĨāĻžāϝāĻŧā§€ āϰ⧇āĻĢāĻžāϰ⧇āĻ¨ā§āϏ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻĒā§āϰāϤāĻŋāĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻž, āχāϤāĻŋāĻšāĻžāϏ āĻŽā§āϝāĻžāύāĻŋāĻĒ⧁āϞ⧇āĻļāύ/āĻŸā§‡āĻ¸ā§āϟāĻŋāĻ‚ non-destructive āĻ­āĻžāĻŦ⧇ āĻ•āϰāĻž
git replace <old_commit> <new_commit>

āϞ⧋āĻ•āĻžāϞ repo-āϤ⧇ āĻāĻ•āϟāĻŋ āĻ•āĻŽāĻŋāϟ āĻ…āĻ¨ā§āϝāϟāĻŋāϰ āϏāĻžāĻĨ⧇ swap āĻ•āϰāĻž āĻŸā§‡āĻ¸ā§āϟāĻŋāĻ‚ āĻŦāĻž āĻĒā§āϝāĻžāϚāĻŋāĻ‚āϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ

git replace --list

āϏāĻŦ active replacement refs āĻĻ⧇āĻ–āĻžāύ⧋

git replace -d <replace_ref>

āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ replacement ref āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž

git stash āĻ…āϏāĻŽāĻžāĻĒā§āϤ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ stack-āĻ āϏāĻžāĻŽāϝāĻŧāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻž, āĻ•āĻŽāĻŋāϟ āύāĻž āĻ•āϰ⧇ context switch āϏāĻŽā§āĻ­āĻŦ āĻ•āϰāĻž
git stash push -p

āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ⧇āϰ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ…āĻ‚āĻļ stash āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āχāĻ¨ā§āϟāĻžāĻ°â€Œā§āϝāĻžāĻ•ā§āϟāĻŋāĻ­ āϏāĻŋāϞ⧇āĻ•āĻļāύ

git stash push -m "WIP selective stash"

āϏāĻšāϜ āĻļāύāĻžāĻ•ā§āϤāĻ•āϰāϪ⧇āϰ āϜāĻ¨ā§āϝ āĻ•āĻžāĻ¸ā§āϟāĻŽ āĻŽā§‡āϏ⧇āϜ āϏāĻš stash āϤ⧈āϰāĻŋ

git stash apply stash@{2}

stash āϤāĻžāϞāĻŋāĻ•āĻž āĻĨ⧇āϕ⧇ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ stash āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰāĻž (āĻĄā§āϰāĻĒ āύāĻž āĻ•āϰ⧇)

git rebase āύāϤ⧁āύ base-āĻāϰ āωāĻĒāϰ āĻ•āĻŽāĻŋāϟ āĻĒ⧁āύāσāĻĒā§āϰāϝāĻŧā§‹āĻ—, āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ āχāϤāĻŋāĻšāĻžāϏ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻ“ linear āϰāĻžāĻ–āĻžāϰ āϜāĻ¨ā§āϝ āĻāĻŦāĻ‚ interactive āĻāĻĄāĻŋāĻŸā§‡āϰ āϜāĻ¨ā§āϝ
git rebase --interactive --autosquash

interactive rebase āĻļ⧁āϰ⧁ āϝāĻž fixup āĻŦāĻž squash āĻŽāĻžāĻ°ā§āĻ• āĻ•āϰāĻž āĻ•āĻŽāĻŋāϟ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ squash āĻ•āϰāĻŦ⧇

git rebase -i --autosquash HEAD~10

fixup/squash āĻŽāĻžāĻ°ā§āĻ• āĻ•āϰāĻž āĻ•āĻŽāĻŋāϟāϗ⧁āϞ⧋ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ squash āĻ•āϰāĻž push-āĻāϰ āφāϗ⧇ āχāϤāĻŋāĻšāĻžāϏ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āϰāĻžāĻ–āϤ⧇

git commit --fixup <commit>

āĻāĻ•āϟāĻŋ fixup āĻ•āĻŽāĻŋāϟ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āϝāĻž rebase-āĻ autosquash āĻšāĻŦ⧇

git commit --squash <commit>

āĻāĻ•āϟāĻŋ squash āĻ•āĻŽāĻŋāϟ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āϝāĻž āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āĻŽāĻŋāĻŸā§‡āϰ āϏāĻžāĻĨ⧇ āĻāĻ•āĻ¤ā§āϰāĻŋāϤ āĻšāĻŦ⧇

git bisect Binary search āϟ⧁āϞ āϝāĻž āĻĻā§āϰ⧁āϤ āĻŦāĻžāĻ— āφāϏāĻž āĻ•āĻŽāĻŋāϟ āĻļāύāĻžāĻ•ā§āϤ āĻ•āϰ⧇ āĻĒāϰāĻĒāϰ āĻ•āĻŽāĻŋāϟ āĻŸā§‡āĻ¸ā§āϟ āĻ•āϰ⧇
git bisect run

āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻ•āĻŽāĻŋāĻŸā§‡ āĻŸā§‡āĻ¸ā§āϟ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āϚāĻžāϞāĻŋāϝāĻŧ⧇ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻŦāĻžāĻ— āφāύāĻž āĻ•āĻŽāĻŋāϟ āĻļāύāĻžāĻ•ā§āϤ āĻ•āϰāĻž

git bisect start; git bisect bad; git bisect good v1.0; git bisect run ./test.sh

āĻŸā§‡āĻ¸ā§āϟ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ bisect āĻ…āĻŸā§‹āĻŽā§‡āϟ āĻ•āϰāĻž, āĻŦāĻžāĻ— āĻļāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ āĻĻā§āϰ⧁āϤ āĻ•āϰāĻž

git bisect visualize

bisect āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻ­āĻŋāĻœā§āϝ⧁āϝāĻŧāĻžāϞāĻžāχāϜ āĻ•āϰāϤ⧇ āĻāĻ•āϟāĻŋ āĻ—ā§āϰāĻžāĻĢāĻŋāĻ•ā§āϝāĻžāϞ āϟ⧁āϞ āĻ–ā§‹āϞāĻž

git bisect reset

bisect āĻŽā§‹āĻĄ āĻĨ⧇āϕ⧇ āĻŦ⧇āϰ āĻšāϝāĻŧ⧇ āφāϏāϞ HEAD-āĻ āĻĢ⧇āϰāĻž

git commit āĻ•āĻŽāĻŋāϟ āϰ⧇āĻ•āĻ°ā§āĻĄ āĻ•āϰāĻž āωāĻ¨ā§āύāϤ āĻ…āĻĒāĻļāύ āϏāĻš: amend, sign, fixup āĻ“ message āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāχāĻœā§‡āĻļāύ āωāĻšā§āϚāĻŽāĻžāύ⧇āϰ āχāϤāĻŋāĻšāĻžāϏ āĻŦāϜāĻžāϝāĻŧ āϰāĻžāĻ–āϤ⧇
git commit --gpg-sign

GPG key āĻĻāĻŋāϝāĻŧ⧇ āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰāĻŋāϤ āĻ•āĻŽāĻŋāϟ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āϝāĻžāϤ⧇ āĻ•ā§āϰāĻŋāĻĒā§āĻŸā§‹āĻ—ā§āϰāĻžāĻĢāĻŋāĻ• āϝāĻžāϚāĻžāχ āĻšāϝāĻŧ

git commit -S -m "Signed commit"

GPG key āĻĻāĻŋāϝāĻŧ⧇ āφāĻĒāύāĻžāϰ āĻ•āĻŽāĻŋāϟ āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰ āĻ•āϰāĻž, āĻ…āĻ–āĻŖā§āĻĄāϤāĻž āĻ“ āϞ⧇āĻ–āĻ• āϝāĻžāϚāĻžāχ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāϤ⧇

git config --global user.signingkey <key_id>

āĻ—ā§āϞ⧋āĻŦāĻžāϞāĻŋ āĻ•āĻŽāĻŋāϟ āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰ⧇āϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšā§ƒāϤ GPG key āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž

git log --show-signature

āĻ•āĻŽāĻŋāϟāϗ⧁āϞ⧋āϰ GPG āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰ āϝāĻžāϚāĻžāχ āĻ“ āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ āĻ•āϰāĻž

git reflog HEAD āĻāĻŦāĻ‚ āĻŦā§āϰāĻžāĻžā§āϚ āφāĻĒāĻĄā§‡āĻŸā§‡āϰ āϞāĻ— āϰāĻžāĻ–āĻž, āĻšāĻžāϰāĻžāύ⧋ āĻ•āĻŽāĻŋāϟ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ“ āϞ⧋āĻ•āĻžāϞ āχāϤāĻŋāĻšāĻžāϏ āĻŦā§‹āĻāĻžāϰ āϜāĻ¨ā§āϝ āĻ…āĻĒāϰāĻŋāĻšāĻžāĻ°ā§āϝ
git reset --hard HEAD@{3}

reflog āĻĨ⧇āϕ⧇ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āĻ¸ā§āĻŸā§‡āĻŸā§‡ āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻŦā§āϰāĻžāĻžā§āϚ reset āĻ•āϰ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāĻž

git reflog expire --expire=now --all

āϏāĻŦ reflog āĻāĻ¨ā§āĻŸā§āϰāĻŋ āĻ…āĻŦāĻŋāϞāĻŽā§āĻŦ⧇ āĻŽā§‡āϝāĻŧāĻžāĻĻā§‹āĻ¤ā§āϤ⧀āĻ°ā§āĻŖ āĻ•āϰāĻž (āϏāϤāĻ°ā§āĻ•āϤāĻžāϰ āϏāĻžāĻĨ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ)

🧰 āĻĒ⧇āĻļāĻžāĻĻāĻžāϰ Workflow āϟāĻŋāĻĒāϏ āĻāĻŦāĻ‚ āĻ…āĻŸā§‹āĻŽā§‡āĻļāύ

āĻŦāĻŋāώāϝāĻŧ

āĻ•āĻŽāĻžāĻ¨ā§āĻĄ / āωāĻĻāĻžāĻšāϰāĻŖ

āĻŦā§āϝāĻžāĻ–ā§āϝāĻž āĻ“ āĻĒā§āϰ⧋ āϟāĻŋāĻĒāϏ

āφāĻ—ā§āϰāĻžāϏ⧀ āϰāĻŋāĻĒā§‹ āĻ•ā§āϞāĻŋāύāφāĻĒ

git gc --aggressive --prune=now

āĻ—āĻ­ā§€āϰ garbage collection āĻ•āϰ⧇ āĻ“ unreachable āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻ¤ā§ŽāĻ•ā§āώāĻŖāĻžā§Ž prune āĻ•āϰ⧇ āĻ…āĻĒā§āϟāĻŋāĻŽāĻžāχāĻœā§‡āĻļāύāĨ¤ āĻŽā§‡āχāĻ¨ā§āĻŸā§‡āĻ¨ā§āϝāĻžāĻ¨ā§āϏ āϏāĻŽāϝāĻŧ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ

Parallel āĻŦā§āϰāĻžāĻžā§āϚ Worktrees

git worktree add ../feature-branch feature

āĻāĻ•āϏāĻžāĻĨ⧇ āĻāĻ•āĻžāϧāĻŋāĻ• āĻĢāĻŋāϚāĻžāϰ⧇ āĻ•āĻžāĻœā§‡āϰ āϜāĻ¨ā§āϝ āĻāĻ•āĻžāϧāĻŋāĻ• working tree āϰāĻžāĻ–āĻž, clone overhead āĻāĻĄāĻŧāĻžāϤ⧇

āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ, Linear āχāϤāĻŋāĻšāĻžāϏ

git rebase -i --autosquash

push āĻ•āϰāĻžāϰ āφāϗ⧇ interactive rebase + autosquash āĻ•āϰ⧇ āχāϤāĻŋāĻšāĻžāϏ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻ“ āĻĒāĻžāĻ āϝ⧋āĻ—ā§āϝ āϰāĻžāϖ⧁āύ

āύāĻŋāϰāĻžāĻĒāĻĻ āĻ•āĻŽāĻŋāϟ

git commit -S

GPG āĻĻāĻŋāϝāĻŧ⧇ āĻ•āĻŽāĻŋāϟ āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰ āĻ•āϰ⧇ āĻļ⧇āϝāĻŧāĻžāĻ°ā§āĻĄ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋāϤ⧇ āĻŦāĻŋāĻļā§āĻŦāĻžāϏāϝ⧋āĻ—ā§āϝāϤāĻž āĻŦāĻžāĻĄāĻŧāĻžāύ; āĻ…āύ⧇āĻ• enterprise āĻĒāϰāĻŋāĻŦ⧇āĻļ⧇ āĻŦāĻžāĻ§ā§āϝāϤāĻžāĻŽā§‚āϞāĻ•

āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧ Bisect

git bisect run ./test-script.sh

bisect āϚāϞāĻžāĻ•āĻžāϞ⧇ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻ•āĻŽāĻŋāĻŸā§‡ āĻŸā§‡āĻ¸ā§āϟ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āϚāĻžāϞāĻŋāϝāĻŧ⧇ āĻŦāĻžāĻ— āĻļāĻŋāĻ•āĻžāϰ āĻ…āĻŸā§‹āĻŽā§‡āϟ āĻ•āϰāĻž

āĻ•āύāĻĢā§āϞāĻŋāĻ•ā§āϟ āϰ⧇āϜāĻ˛ā§āϝ⧁āĻļāύ āĻ•ā§āϝāĻžāĻļ

git config --global rerere.enabled true

āφāϗ⧇āϰ āϏāĻŽāĻžāϧāĻžāύ āĻĒ⧁āύāĻ°ā§āĻŦā§āϝāĻŦāĻšāĻžāϰ āϏāĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰ⧁āύ āϝāĻžāϤ⧇ rebase āĻŦāĻž merge-āĻ āĻĒ⧁āύāϰāĻžāĻŦ⧃āĻ¤ā§āϤ conflict āĻĻā§āϰ⧁āϤ āϏāĻŽāĻžāϧāĻžāύ āĻšāϝāĻŧ

āĻļ⧇āϝāĻŧāĻžāĻ°ā§āĻĄ āĻāϞāĻŋāϝāĻŧāĻžāϏ āĻ“ āĻšā§āĻ•āϏ

āϏāĻžāϧāĻžāϰāĻŖ Git āĻāϞāĻŋāϝāĻŧāĻžāϏ āĻ“ āĻ•āĻŽāĻŋāϟ āĻšā§āĻ•āϗ⧁āϞ⧋ āĻļ⧇āϝāĻŧāĻžāĻ°ā§āĻĄ repo āĻŦāĻž CI pipeline-āĻ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧁āύ āϟāĻŋāĻŽ āĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ āĻŦāϜāĻžāϝāĻŧ āϰāĻžāĻ–āϤ⧇

āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āϰāĻŋāϏ⧋āĻ°ā§āϏ

🧠 āϟāĻŋāĻĒ

āϏāĻŦāĻ•āĻŋāϛ⧁ āĻŽā§āĻ–āĻ¸ā§āĻĨ āĻ•āϰāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāĻŦ⧇āύ āύāĻžāĨ¤ --help āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ, āĻāĻ•ā§āϏāĻĒā§āϞ⧋āϰ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āύāĻŋāϝāĻŧāĻŽāĻŋāϤ āĻ…āύ⧁āĻļā§€āϞāύ āĻ•āϰ⧁āύ:

git help <command>
git status

🌐 āĻĻāϰāĻ•āĻžāϰ⧀ āϞāĻŋāĻ™ā§āĻ•

📘 āĻ…āĻĢāĻŋāĻļāĻŋāϝāĻŧāĻžāϞ Git āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ — āϏāĻŦ Git āĻ•āĻŽāĻžāĻ¨ā§āĻĄā§‡āϰ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤ āĻŽā§āϝāĻžāύ⧁āϝāĻŧāĻžāϞ:
https://git-scm.com/docs

📙 Learn Git Branching — āĻŦā§āϰāĻžāĻžā§āϚāĻŋāĻ‚ āĻ•āύāϏ⧇āĻĒā§āϟ āφāϝāĻŧāĻ¤ā§āϤ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āχāĻ¨ā§āϟāĻžāĻ°â€Œā§āϝāĻžāĻ•ā§āϟāĻŋāĻ­ āĻ­āĻŋāĻœā§āϝ⧁āϝāĻŧāĻžāϞ āϟāĻŋāωāĻŸā§‹āϰāĻŋāϝāĻŧāĻžāϞ:
https://learngitbranching.js.org

📕 Pro Git āĻŦāχ (āĻŦāĻŋāύāĻžāĻŽā§‚āĻ˛ā§āϝ⧇, Scott Chacon āĻ“ Ben Straub āĻ•āĻ°ā§āϤ⧃āĻ•):
https://git-scm.com/book

📗 Git Cheatsheet (āĻ…āĻĢāĻŋāĻļāĻŋāϝāĻŧāĻžāϞ āϏāĻ‚āĻ•ā§āώāĻŋāĻĒā§āϤ āϰ⧇āĻĢāĻžāϰ⧇āĻ¨ā§āϏ):
https://education.github.com/git-cheat-sheet-education.pdf