Mojtaba Pourkhanlar
About meProjectsBlog

  • 👤About me
  • 🧰Projects
  • ✍️Blog

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