🐙 گیت و GitHub CLI
دستورات پایه و پیشرفته گیت برای کنترل نسخه، شاخهها، مخازن راهدور، استش، تگها و 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" | پیدا کردن همه اشارهها به  | |
| git grep -n "TODO" | پیدا کردن خطوط شامل  | |
| git grep -i "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 | ایجاد یک شاخه جدید به نام  | |
| git branch -d old-feature | حذف یک شاخه محلی به نام  | |
| git checkout | تغییر شاخه یا بازگرداندن فایلها از یک کامیت دیگر | |
| git checkout main | تغییر به شاخه  | |
| git checkout -b new-branch | ایجاد و تغییر به یک شاخه جدید به نام  | |
| git switch | تغییر شاخهها (جایگزین سادهتر برای checkout) | |
| git switch main | تغییر به شاخه  | |
| git switch -c feature-x | ایجاد و تغییر به یک شاخه جدید به نام  | |
| git switch new-feature | تغییر به شاخه موجود به نام  | |
| git merge | ترکیب تغییرات از یک شاخه دیگر در شاخه جاری | |
| git merge new-feature | ادغام شاخه  | |
| git merge --no-ff new-feature | ایجاد یک merge commit حتی اگر fast-forward ممکن باشد | |
| git merge --abort | لغو ادغام و بازگرداندن تغییرات در صورت بروز conflict | |
| git rebase | جابجایی یا اعمال مجدد کامیتها روی یک کامیت پایه جدید | |
| git rebase 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 | اعمال بازهای از کامیتها از  | 
📡 مخازن راهدور
| دستور | مثال | توضیح | 
|---|---|---|
| git remote | مدیریت لینکها به مخازن راهدور (مثل GitHub) | |
| git remote -v | نمایش نام remoteها و آدرسهای آنها | |
| git remote add origin URL | افزودن یک remote به نام  | |
| git pull | دانلود و ادغام خودکار تغییرات از یک شاخه راهدور | |
| git pull origin main | دریافت و ادغام تغییرات از شاخه  | |
| git pull --rebase origin main | دریافت و rebase شاخه جاری روی شاخه راهدور بهجای ادغام | |
| git push | آپلود تغییرات محلی به یک مخزن راهدور | |
| git push origin main | push شاخه  | |
| git fetch | دانلود تغییرات از remote بدون ادغام | |
| git fetch origin | دریافت همه بهروزرسانیها از remote  | |
| git fetch origin main | دریافت فقط شاخه  | |
| git fetch --all | دریافت تغییرات از همه remoteها | |
| git fetch --prune | پاکسازی شاخههای حذفشده — حذف refهای محلی برای شاخههایی که از راهدور حذف شدند | |
| git fetch --dry-run | نمایش مواردی که دریافت خواهند شد بدون دانلود واقعی | |
| git fetch origin +main | بهروزرسانی اجباری شاخه محلی ( | 
📦 استش و پاکسازی
| دستور | مثال | توضیح | 
|---|---|---|
| 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 به نام  | |
| git tag -d v1.0 | حذف تگ محلی به نام  | |
| git push | آپلود کامیتها، شاخهها و تگها از محلی به مخزن راهدور | |
| git push origin --tags | push همه تگهای محلی به remote (مفید پس از تگگذاری چند نسخه) | |
| git push origin v1.0 | push یک تگ مشخص (مثلاً  | |
| git push origin :refs/tags/v1.0 | حذف تگ  | 
🛠️ رفع تعارضها
| دستور | مثال | توضیح | 
|---|---|---|
| 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} | دیدن اینکه شاخه  | |
| 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 submodule sync --recursive | همگامسازی آدرسهای زیرماژول پس از تغییر در فایل  | |
| 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 | ایجاد آرشیو فشرده  | |
| git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz | ایجاد آرشیو فشرده  | |
| 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 ذخیرهشده در فایل ( | |
| gh auth login --hostname enterprise.internal | احراز هویت در یک سرور GitHub Enterprise (نه github.com) | |
| gh repo clone | کلون کردن یک مخزن GitHub در دستگاه محلی شما | |
| gh repo clone user/repo | کلون مخزن متعلق به  | |
| gh repo clone cli/cli -- --depth=1 | کلون مخزن فقط با دانلود آخرین کامیت برای کلونی سریعتر و کوچکتر | |
| gh repo clone cli/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 از شاخه  | |
| gh repo create | ایجاد یک مخزن جدید در GitHub از طریق CLI | |
| gh repo create my-project | ایجاد مخزن جدید به نام  | |
| gh repo create my-project --public --clone | ایجاد یک مخزن عمومی و کلون کردن آن بهصورت محلی | |
| gh repo create my-project --private --source=. --remote=upstream | ایجاد یک مخزن خصوصی از پوشه جاری و افزودن remote به نام  | 
💡 نامهای مستعار 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 | جایگزینی گروهی رشتهها یا الگوها در سراسر تاریخچه (مثلاً حذف اطلاعات حساس) | |
| 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