🐙 گیت و GitHub CLI

Multilingual DevOps cheat sheet: Linux, Docker, Git, Kubernetes, Helm, Terraform, practical scenarios & templates.
منتشرشده

August 31, 2025

دستورات پایه و پیشرفته گیت برای کنترل نسخه، شاخه‌ها، مخازن راه‌دور، استش، تگ‌ها و GitHub CLI.

🔹 دستورات پایه

دستور

مثال

توضیح

git add افزودن یک فایل به staging area
git add file.txt

مرحله‌بندی یک فایل مشخص برای کامیت بعدی

git add .

مرحله‌بندی همه تغییرات در پوشه جاری و زیرپوشه‌ها

git add -p

انتخاب تعاملی بخش‌های فایل برای مرحله‌بندی (مفید برای کامیت‌های جزئی)

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"

مرحله‌بندی و کامیت همه فایل‌های تغییر یافته با پیام

git commit --amend

به‌روزرسانی آخرین کامیت (تغییر پیام یا افزودن تغییرات بیشتر)

git commit --fixup abc1234

ایجاد یک fixup commit برای squash خودکار در rebase تعاملی

git config گرفتن و تنظیم گزینه‌های مخزن یا global
git config --global user.name "Name"

تنظیم نام کاربری گیت به‌صورت global

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

تنظیم ایمیل گیت به‌صورت global

git config --list

لیست تمام تنظیمات گیت (نام، ایمیل، ویرایشگر و غیره)

git diff نمایش تغییرات بین کامیت‌ها، کامیت و پوشه کاری و غیره
git diff HEAD

نمایش تغییراتی که از آخرین کامیت انجام داده‌اید (unstaged)

git diff --staged

نمایش تغییراتی که در کامیت بعدی گنجانده خواهند شد

git diff --word-diff HEAD~1

نمایش تغییرات با تفاوت‌های سطح کلمه

git grep جستجو در فایل‌های مخزن
git grep "functionName"

پیدا کردن همه اشاره‌ها به functionName در فایل‌های پروژه

git grep -n "TODO"

پیدا کردن خطوط شامل TODO و نمایش شماره خط‌ها (مفید برای پیدا کردن یادداشت‌ها)

git grep -i "login"

جستجوی کلمه login بدون توجه به حروف بزرگ/کوچک (مطابق Login, LOGIN, login)

git init ایجاد یک مخزن خالی گیت یا بازنشانی مخزن موجود
git init my-project

ایجاد یک مخزن جدید در پوشه my-project

git init --bare

ایجاد یک مخزن bare

git log نمایش تاریخچه کامیت‌ها
git log --oneline

نمایش تاریخچه کامیت در قالب یک‌خطی فشرده

git log --graph --all

نمایش همه شاخه‌ها در یک گراف تصویری از کامیت‌ها

git log -p --stat

نمایش patch و آمار تغییرات فایل‌ها برای کامیت‌ها

git reset خارج کردن فایل‌ها از stage و حفظ تغییرات در پوشه کاری
git reset HEAD file.txt

حذف یک فایل از stage (ویرایش‌ها حفظ می‌شوند)

git reset --hard HEAD~1

بازگشت یک کامیت عقب‌تر و حذف تمام تغییرات (غیرقابل‌بازگشت!)

git reset --soft HEAD~1

لغو آخرین کامیت ولی نگه داشتن تغییرات برای کامیت مجدد

git reset --mixed HEAD~1

لغو یک کامیت ولی نگه داشتن تغییرات در پوشه کاری

git show نمایش انواع مختلف objectها
git show <commit_hash>

نمایش تغییرات و پیام یک کامیت مشخص

git show HEAD~1

نمایش کامیت قبلی قبل از کامیت جاری

git show --stat

نمایش خلاصه تغییرات فایل برای آخرین کامیت

git status نمایش وضعیت پوشه کاری
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

ایجاد یک merge commit حتی اگر fast-forward ممکن باشد

git merge --abort

لغو ادغام و بازگرداندن تغییرات در صورت بروز conflict

git rebase جابجایی یا اعمال مجدد کامیت‌ها روی یک کامیت پایه جدید
git rebase main

اعمال مجدد کامیت‌های شاخه شما روی شاخه main

git rebase -i HEAD~3

ویرایش تعاملی ۳ کامیت آخر

git rebase --abort

توقف و لغو یک rebase در حال انجام

git rebase -i --autosquash HEAD~5

squash خودکار کامیت‌های مشخص‌شده به‌عنوان fixup یا squash در rebase تعاملی

git cherry-pick اعمال کامیت‌های مشخص از یک شاخه دیگر
git cherry-pick <hash>

اعمال یک کامیت مشخص (با hash) به شاخه جاری

git cherry-pick --continue

ادامه cherry-pick پس از رفع conflictها

git cherry-pick A^..B

اعمال بازه‌ای از کامیت‌ها از A (به‌جز) تا B (شامل)

📡 مخازن راه‌دور

دستور

مثال

توضیح

git remote مدیریت لینک‌ها به مخازن راه‌دور (مثل GitHub)
git remote -v

نمایش نام remoteها و آدرس‌های آن‌ها

git remote add origin URL

افزودن یک remote به نام origin

git pull دانلود و ادغام خودکار تغییرات از یک شاخه راه‌دور
git pull origin main

دریافت و ادغام تغییرات از شاخه main در remote به شاخه جاری

git pull --rebase origin main

دریافت و rebase شاخه جاری روی شاخه راه‌دور به‌جای ادغام

git push آپلود تغییرات محلی به یک مخزن راه‌دور
git push origin main

push شاخه main محلی به remote origin

git fetch دانلود تغییرات از remote بدون ادغام
git fetch origin

دریافت همه به‌روزرسانی‌ها از remote origin ولی بدون اعمال

git fetch origin main

دریافت فقط شاخه main از remote

git fetch --all

دریافت تغییرات از همه remoteها

git fetch --prune

پاک‌سازی شاخه‌های حذف‌شده — حذف refهای محلی برای شاخه‌هایی که از راه‌دور حذف شدند

git fetch --dry-run

نمایش مواردی که دریافت خواهند شد بدون دانلود واقعی

git fetch origin +main

به‌روزرسانی اجباری شاخه محلی (origin/main) با بازنویسی conflictها

📦 استش و پاک‌سازی

دستور

مثال

توضیح

git stash ذخیره موقت تغییرات ذخیره‌نشده (کار در حال انجام)
git stash

ذخیره فایل‌های تغییر یافته و staged، سپس بازگرداندن پوشه کاری به آخرین کامیت

git stash apply

اعمال مجدد آخرین stash (stash باقی می‌ماند)

git stash pop

اعمال و حذف آخرین stash

git stash list

نمایش لیست همه stashها

git stash branch feature-fix

ایجاد یک شاخه جدید و اعمال آخرین stash روی آن

git clean حذف دائمی فایل‌های untracked (خارج از گیت)
git clean -f

حذف فایل‌های untracked در پوشه جاری

git clean -fd

حذف فایل‌ها و پوشه‌های untracked

git clean -n

پیش‌نمایش مواردی که حذف خواهند شد (dry run ایمن)

🏷️ تگ‌ها

دستور

مثال

توضیح

git tag ایجاد، لیست یا حذف تگ‌ها برای علامت‌گذاری نقاط خاص در تاریخچه (مثل انتشارها)
git tag -a v1.0 -m "Version 1.0"

ایجاد یک تگ annotated به نام v1.0 با پیام (ذخیره‌شده به‌عنوان یک object کامل گیت)

git tag -d v1.0

حذف تگ محلی به نام v1.0 (روی remote تأثیری ندارد)

git push آپلود کامیت‌ها، شاخه‌ها و تگ‌ها از محلی به مخزن راه‌دور
git push origin --tags

push همه تگ‌های محلی به remote (مفید پس از تگ‌گذاری چند نسخه)

git push origin v1.0

push یک تگ مشخص (مثلاً v1.0) به remote

git push origin :refs/tags/v1.0

حذف تگ v1.0 در remote (با استفاده از دستور colon)

🛠️ رفع تعارض‌ها

دستور

مثال

توضیح

git mergetool بازکردن یک ابزار تصویری برای کمک به رفع conflictها
git mergetool --tool=meld

استفاده از یک ابزار merge مشخص (مثل Meld) برای رفع conflict

git rerere به گیت اجازه دهید نحوه رفع conflictهای قبلی شما را به یاد بسپارد
git config --global rerere.enabled true

فعال‌سازی استفاده مجدد خودکار از راه‌حل‌های conflict گذشته

git rerere status

نمایش فایل‌هایی که راه‌حل conflict ذخیره‌شده دارند

git rerere diff

نمایش تغییراتی که گیت برای استفاده مجدد ذخیره کرده است

⚙️ دستورات پیشرفته

دستور

مثال

توضیح

git bisect استفاده از جستجوی دودویی برای پیدا کردن کامیتی که باگ را معرفی کرده است
git bisect start

شروع جستجوی دودویی بین یک کامیت سالم و یک کامیت خراب برای یافتن باگ

git bisect bad

علامت‌گذاری کامیت جاری به‌عنوان “خراب” (شامل باگ)

git bisect good <commit>

علامت‌گذاری یک کامیت شناخته‌شده به‌عنوان “سالم” که باگ وجود نداشته

git blame نمایش اینکه چه کسی آخرین تغییر هر خط از یک فایل را داده، همراه با نسخه و نویسنده
git blame file.txt

نمایش نویسنده و اطلاعات کامیت برای هر خط فایل

git blame -L 10,20 file.txt

نمایش اطلاعات blame فقط برای خطوط ۱۰ تا ۲۰

git blame --show-email file.txt

نمایش آدرس ایمیل نویسندگان در کنار تغییرات خط‌ها

git reflog مشاهده و مدیریت لاگ ارجاعات (reflog) شاخه‌ها و HEAD
git reflog show main@{1.week.ago}

دیدن اینکه شاخه main یک هفته قبل کجا اشاره می‌کرد

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

پیش‌نمایش ورودی‌های reflog قدیمی‌تر از ۳۰ روز که می‌توانند پاک شوند

git reflog delete HEAD@{2}

حذف یک ورودی مشخص reflog (با احتیاط، زیرا می‌تواند روی بازیابی اثر بگذارد)

git submodule افزودن، مقداردهی اولیه، به‌روزرسانی یا بررسی زیرماژول‌ها (مخازن داخل مخزن‌ها)
git submodule add URL path

افزودن یک مخزن خارجی به‌عنوان زیرماژول در مسیر مشخص

git submodule update --init

مقداردهی اولیه و دانلود همه زیرماژول‌های لیست‌شده

git submodule foreach git pull

اجرای git pull داخل هر زیرماژول برای به‌روزرسانی آن‌ها به آخرین کامیت

git submodule sync --recursive

همگام‌سازی آدرس‌های زیرماژول پس از تغییر در فایل .gitmodules

git submodule update --remote --merge

به‌روزرسانی زیرماژول‌ها به آخرین کامیت از شاخه‌های راه‌دور آن‌ها

git archive ایجاد یک آرشیو (zip, tar و غیره) از فایل‌های یک کامیت یا شاخه مشخص
git archive --format=zip HEAD > archive.zip

ایجاد آرشیو ZIP از فایل‌های پروژه در HEAD

git archive -o release.tar.gz HEAD

ایجاد آرشیو فشرده .tar.gz از HEAD جاری

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

ایجاد آرشیو فشرده .tar.gz از پروژه جاری و قرار دادن همه فایل‌ها در پوشه project/ داخل آرشیو

git gc پاک‌سازی فایل‌های غیرضروری و بهینه‌سازی مخزن برای عملکرد
git gc --aggressive

اجرای یک پاک‌سازی و بهینه‌سازی کامل (ممکن است کند باشد ولی مؤثر است)

git gc --prune=now

حذف فوری همه objectهای غیرقابل‌دسترس (خطرناک اگر مطمئن نباشید)

git shortlog خلاصه سریع از نویسندگان و کامیت‌های آن‌ها
git shortlog -e

نمایش لیست نویسندگان همراه ایمیل آن‌ها (برای تحلیل مشارکت‌ها)

git shortlog -s -n

نمایش تعداد کامیت‌های هر نویسنده، مرتب‌شده بر اساس تعداد

git shortlog -sne

مانند بالا، ولی شامل نام‌ها و ایمیل‌ها — مفید برای ردیابی دقیق فعالیت

git revert ایجاد یک کامیت جدید که تغییرات یک کامیت قبلی را بدون بازنویسی تاریخچه لغو می‌کند
git revert HEAD

لغو آخرین کامیت با ایجاد یک کامیت جدید که تغییرات آن را برمی‌گرداند

git revert <commit_hash>

لغو یک کامیت مشخص با hash، با افزودن یک کامیت جدید که آن را برمی‌گرداند

🐙 GitHub CLI

gh به شما اجازه می‌دهد GitHub را از طریق ترمینال مدیریت کنید.

دستور

مثال

توضیح

gh auth login احراز هویت با یک هاست GitHub برای اجازه به دستورات CLI جهت تعامل با حساب شما
gh auth login --with-token < mytoken.txt

احراز هویت با استفاده از یک personal access token ذخیره‌شده در فایل (mytoken.txt)

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 لیست کردن issues در یک مخزن GitHub، با امکان فیلتر بر اساس معیارهای مختلف
gh issue list --assignee "@me"

لیست کردن issues اختصاص داده‌شده به شما

gh issue list --state all

لیست کردن issues صرف‌نظر از وضعیت (باز یا بسته)

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

لیست کردن issues مطابق با “error”، بدون مسئول، مرتب‌شده بر اساس تاریخ ایجاد به‌صورت صعودی

gh pr create ایجاد یک pull request در GitHub از طریق CLI
gh pr create --title "..."

ایجاد یک pull request با عنوان داده‌شده

gh pr create --project "Roadmap"

لینک‌کردن pull request به یک پروژه GitHub با نام “Roadmap”

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

ایجاد یک PR از شاخه feature در fork به نام monalisa به شاخه develop

gh repo create ایجاد یک مخزن جدید در GitHub از طریق CLI
gh repo create my-project

ایجاد مخزن جدید به نام my-project در GitHub (با اعلان‌های تعاملی)

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

ایجاد یک مخزن عمومی و کلون کردن آن به‌صورت محلی

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

ایجاد یک مخزن خصوصی از پوشه جاری و افزودن remote به نام 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-branch. با احتیاط استفاده شود

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

جایگزینی گروهی رشته‌ها یا الگوها در سراسر تاریخچه (مثلاً حذف اطلاعات حساس)

git filter-repo --subdirectory-filter src

استخراج تاریخچه یک زیرپوشه به یک مخزن جدید با حفظ متادیتای کامیت‌ها

git worktree مدیریت چندین پوشه کاری متصل به یک مخزن، برای کار همزمان روی شاخه‌های مختلف بدون کلون اضافی
git worktree add ../feature feature-branch

ایجاد یک پوشه کاری اضافی متصل به همان مخزن برای checkout موازی شاخه‌ها

git worktree list

لیست کردن همه worktreeهای فعال، مسیرها و شاخه‌های مرتبط

git worktree remove ../feature

حذف یک worktree متصل هنگام عدم نیاز، با پاک‌سازی ایمن پوشه‌های کاری

git replace ایجاد ارجاعات موقت برای جایگزینی objectهای موجود، جهت دستکاری محلی تاریخچه به‌صورت غیرمخرب و تست
git replace <old_commit> <new_commit>

به‌طور موقت جایگزین کردن یک کامیت با دیگری در مخزن محلی، مفید برای تست یا اصلاح تاریخچه بدون بازنویسی

git replace --list

نمایش همه refهای جایگزینی فعال

git replace -d <replace_ref>

حذف یک ref جایگزینی مشخص برای بازگردانی رفتار

git stash ذخیره موقت تغییرات ذخیره‌نشده در یک پشته، برای تغییر زمینه بدون نیاز به کامیت کار نیمه‌تمام
git stash push -p

انتخاب تعاملی بخش‌هایی از تغییرات برای stash، جهت کنترل دقیق‌تر

git stash push -m "WIP selective stash"

ایجاد stash با پیام سفارشی برای شناسایی راحت‌تر

git stash apply stash@{2}

اعمال یک stash مشخص از لیست بدون حذف آن

git rebase اعمال مجدد کامیت‌ها روی یک پایه جدید، برای تاریخچه خطی‌تر و تمیزتر و ویرایش تعاملی تاریخچه
git rebase --interactive --autosquash

شروع یک rebase تعاملی که به‌طور خودکار کامیت‌های fixup یا squash را مرتب و ادغام می‌کند

git rebase -i --autosquash HEAD~10

مرتب‌سازی و squash خودکار کامیت‌های fixup یا squash برای پاکسازی تاریخچه قبل از push

git commit --fixup <commit>

ایجاد یک fixup commit که هنگام rebase تعاملی به‌طور خودکار squash می‌شود

git commit --squash <commit>

ایجاد یک squash commit برای ادغام با کامیت مشخص‌شده در rebase

git bisect ابزار جستجوی دودویی برای شناسایی کارآمد کامیتی که باگ را معرفی کرده با تست متوالی و محدود کردن تغییرات معیوب
git bisect run

خودکارسازی فرآیند bisect با اجرای یک اسکریپت تست روی هر کامیت برای شناسایی سریع باگ بدون دخالت دستی

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 ثبت تغییرات در مخزن با گزینه‌های دقیق برای اصلاح، امضا، fixup و سفارشی‌سازی پیام برای تاریخچه پروژه با کیفیت بالا
git commit --gpg-sign

ایجاد یک کامیت امضاشده با کلید GPG شما برای اطمینان از صحت و اصالت

git commit -S -m "Signed commit"

امضای رمزنگاری‌شده کامیت‌ها با کلید GPG برای تضمین صحت و اصالت

git config --global user.signingkey <key_id>

تنظیم کلید GPG مورد استفاده برای امضای کامیت‌ها به‌صورت global

git log --show-signature

بررسی و نمایش اطلاعات امضای GPG برای کامیت‌ها

git reflog نگهداری لاگ به‌روزرسانی‌های HEAD و شاخه‌ها، ضروری برای بازیابی کامیت‌های گم‌شده و درک حرکات محلی تاریخچه
git reset --hard HEAD@{3}

بازنشانی شاخه جاری به یک وضعیت قبلی از reflog برای بازیابی یا بازگردانی تغییرات

git reflog expire --expire=now --all

منقضی‌کردن فوری همه ورودی‌های reflog برای پاک‌سازی تاریخچه (با احتیاط استفاده شود)

🧰 نکات و خودکارسازی حرفه‌ای در گردش‌کار

موضوع

دستورات / مثال

توضیحات و نکات حرفه‌ای

پاک‌سازی تهاجمی مخزن

git gc --aggressive --prune=now

اجرای garbage collection عمیق و هرس objectهای غیرقابل‌دسترس برای بهینه‌سازی مخزن. استفاده در زمان نگهداری

Worktreeهای موازی شاخه‌ها

git worktree add ../feature-branch feature

نگهداری چندین worktree برای توسعه همزمان ویژگی‌ها، جلوگیری از overhead کلون

تاریخچه خطی و تمیز

git rebase -i --autosquash

قبل از push، یک rebase تعاملی با autosquash انجام دهید تا تاریخچه تمیز و خوانا بماند

کامیت‌های امن

git commit -S

امضای کامیت‌ها با GPG برای افزایش اعتماد در مخازن مشترک، که در بسیاری از محیط‌های سازمانی الزامی است

Bisect خودکار

git bisect run ./test-script.sh

شکار باگ را با اجرای یک اسکریپت تست روی هر کامیت کاندید در طول bisect خودکار کنید

حافظه کش رفع تعارض‌ها

git config --global rerere.enabled true

فعال‌سازی استفاده مجدد از راه‌حل‌های conflict برای تسریع رفع تعارض‌های تکراری در rebase یا merge

نام‌های مستعار و hookهای مشترک

ذخیره aliasهای متداول گیت و commit hookها در یک مخزن مشترک یا pipeline CI برای اجرای استانداردهای تیمی و افزایش بهره‌وری

📚 منابع اضافی

🧠 نکته

لازم نیست همه‌چیز را حفظ کنید. از --help استفاده کنید، کاوش کنید و به‌طور منظم تمرین کنید:

git help <command>
git status

🌐 لینک‌های مفید

📘 مستندات رسمی Git — راهنمای دقیق برای همه دستورات Git:
https://git-scm.com/docs

📙 یادگیری شاخه‌بندی در Git — آموزش تصویری تعاملی برای تسلط بر مفاهیم شاخه‌بندی:
https://learngitbranching.js.org

📕 کتاب Pro Git (رایگان، نوشته Scott Chacon و Ben Straub):
https://git-scm.com/book

📗 برگه تقلب Git (مرجع رسمی و خلاصه):
https://education.github.com/git-cheat-sheet-education.pdf