Git Interview Cheat Sheet
Fork vs Clone
clone → کپی از repo fork → کپی در GitHub account (برای مشارکت در پروژهها)
Detached HEAD
وقتی روی commit خاص checkout میکنی نه branch:
git checkout <commit>
- commit جدید بسازی → orphan میشود
git bisect
برای پیدا کردن commit مشکلدار:
git bisect start
git bisect bad
git bisect good <commit>
خب git با binary search مشکل رو پیدا میکنه
git merge Vs git rebase
خب merge یک commit جدید ایجاد میکنه که دو برنچ رو با هم ادغام میکنه. تاریخچه رو حفظ میکنه ولی غیرخطی میشه.
اما rebase میاد کامیت ها را روی branch مقصد باز نویسی میکنه و تاریخچه را خطی می کنه
نکته مهم:
از rebase روی branchهای shared استفاده نکن (history rewrite)
- Merge = تاریخچه واقعی و کامل
- Rebase = تاریخچه تمیز و خطی
git reset Vs git revert
خب reset تاریخچه را تغییر میدهد (destructive - local)
انواع reset:
- --soft → فقط commit برمیگرده، stage حفظ میشه
- --mixed (default) → stage هم پاک میشه
- --hard → همهچی پاک میشه (خطرناک)
git reset --soft
git reset --mixed
git reset --hard
اما revert یک commit جدید برای undo ایجاد میکند (safe).
کی کجا؟
- خب Reset برای کارهای لوکال و قبل از push.
- و Revert برای وقتی که commit رفته روی ریموت و نمیخوای تاریخچه خراب شه.
Cherry Pick
- یک یا چند commit مشخص رو از یک branch برداشته و روی branch فعلی اعمال میکنه.
چه زمانی استفاده میشه؟
یه fix تو feature/login انجام دادی ولی team lead میگه همینو فوری تو main هم نیاز داریم
کامیت مورد نظرت رو cherry-pick میکنی:
git cherry-pick <commit-hash>
// مثال
git cherry-pick a3b2f17
نکته
- خب cherry-pick یک کپی جدید از کامیت ایجاد میکنه یعنی hash جدید میگیره
- ممکنه conflict بده، مخصوصاً اگر بخشهای مشترکی هم در شاخهها تغییر کرده باشد
- برای کار تیمی اگر زیاد استفاده بشه تاریخ را messy میکنه بنابراین با مسئولیت استفاده شود!
- مناسب hotfix، emergency fix، یا انتقال selective commits
Stash
تغییرات فعلی (stage و unstaged) رو بطور موقت ذخیره میکنه تا بتونی branch عوض کنی بدون اینکه تغییراتت برن هوا.
پرکاربرد:
- وسط کار هستی و یه bug فورس میاد
- میخوای سریع branch عوض کنی
نکته : git stash فقط فایلهایی که تو .gitignore نیستن رو ذخیره میکنه.
stash با پیام
git stash push -m "Fix navbar hover"
برای stash کردن فایل های untracked
git stash -u
مثال کاربردی (داینامیک!):
وسط استایل دادن به Navbar هستی… یهو لید میگه «فوری بیا یه Hotfix بزن».
git stash
git switch main
آخرین استش رو برگردون و حذف کن
git stash pop
بدون حذف:
git stash apply
پاک کردن یک stash خاص
git stash drop stash@{2}
پاک کردن همهی stashها
git stash clear
git fetch Vs git pull
fetch
- خب fetch فقط تغییرات ریموت رو دانلود میکنه.
pull
- پیشفرض: fetch + merge
- اگر تنظیم شده باشه: fetch + rebase
پس:
- Fetch = فقط چک میکنم ببینم چیبهچیه.
- Pull = دانلود + اعمال تغییرات.
پس git fetch هیچوقت چیزی رو merge نمیکنه برای دیدن تفاوت:
git diff main origin/main
مثل اینه که بگی: «بذار ببینم پشت پرده چه خبره اما هیچی رو دست نزن.»
New Branch and Delete Branch?
// ساخت
git branch new-feature
// ساخت و جابجایی همزمان:
git switch -c new-feature
// Or
git checkout -b new-feature
حذف لوکال:
git branch -d new-feature
حذف ریموت:
git push origin --delete new-feature
Current branch?
git branch
// Or
git status
چجوری آخرین کامیت رو اصلاح کنیم؟
git commit --amend
چجوری فایل های staged رو از حالت stage خارج کنیم؟
حذف فایل از Stage بدون حذف تغییرات
git reset HEAD <file>
یا همه رو از stage خارج کن:
git reset
چطور مخزن Remote رو اضافه کنیم یا تغییر بدیم؟
تغییر Remote بدون خرابکاری:
git remote rename origin old-origin
بعد:
git remote add origin NEW_URL
Origin Vs Upstream
خب origin به ریپوی خودمون اشاره میکنه اما upstream به ریپوی اصلی پروژه اشاره میکنه
- خب تو یک repo از GitHub clone میکنی → origin
- پروژهٔ اصلی مال تیم بزرگه → upstream
git fetch upstream
git rebase upstream/main
چطور از تغییرات remote مطلع بشیم؟
git fetch origin
git log HEAD..origin/main
چیا اونجا هست که من ندارم؟
چطور commit های قبلی رو ببینیم؟
git log --oneline --graph --all
حرفه ای ترش:
git log --decorate --all --graph --oneline
چطور یه commit خاص رو برگردونیم؟
خب git revert تاریخچه رو پاک نمیکنه → برعکس commit جدید میسازه.
git revert <hash>
چطور چند کامیت اخیر رو یکی کنیم؟
فرض کن میخوای ۳ commit آخر رو یکی کنی.
git rebase -i HEAD~3
گیت یه ادیتور باز میکنه و چیزی شبیه این میبینی:
pick a1b2c3 fix header bug
pick d4e5f6 add responsive styles
pick g7h8i9 clean css
حالا باید اینجوری تغییرش بدی:
pick a1b2c3 fix header bug
squash d4e5f6 add responsive styles
squash g7h8i9 clean css
- pick → نگه دار
- squash → با commit قبلی یکی کن
چطور تغییری که هنوز commit نشده رو ذخیره موقت میکنیم؟
git stash
git stash list
اگر commit رو پوش کردیم و بعد بخوایم اصلاح کنیم؟
git push --force-with-lease
این امنتر از --force هست
و از خراب کردن کار بقیه جلوگیری میکنه.
حذف فایل از Git ولی نگه داشتنش در سیستم
git rm --cached <file>
مثال:
git rm --cached .env
پاک کردن فایل همراه با حذف از دیسک
git rm <file>
ساخت یک Tag همراه با پیام (annotated tag)
این بهترین نوع Tagه و در Releaseها استفاده میشه.
git tag -a v1.0.0 -m "First stable release"
و اما Push کردن تگها
git push origin --tags
حذف یک Tag لوکال و ریموت
برای زمانی که اشتباهی v2.0 رو دو بار ساختی
git tag -d v1.0.0
git push origin --delete tag v1.0.0
دیدن اینکه روی چه فایلهایی conflict داری
git diff --name-only --diff-filter=U
مراحل حل:
- resolve دستی
- add
git rebase --continue
# یا
git commit
اگر conflict زیاد شد چی کار کنیم؟
git rebase --abort
بردن تغییرات به یک شاخه دیگر بدون commit
git stash
git switch <branch>
git stash pop
سوییچ استاندارد جدید به جای checkout
خب Git جدید switch و restore رو پیشنهاد میده:
git switch <branch>
git switch -c <new-branch>
جمع بندی
- history rewrite = خطرناک در تیم
- نوشتن commitهای کوچک و معنیدار
- و rebase برای clean history قبل از PR