🐙 گیت و 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