مرور سریع Git
مهمترین دستورات و پرچمهای (flag) روزمرهٔ Git — از Clone و Commit تا Rebase، Stash و Blame.
این جزوه دستورات پرکاربرد Git را بر اساس دستهٔ کاری (Clone، Commit، Branch، Merge و ...) مرور میکند. برای هر دستور، رایجترین پرچمها با یک مثال کوتاه آمده تا در کار روزمره سریع پیدایشان کنید.
فهرست بخشها
- شروع مخزن: Init و Clone0/3
- افزودن و ثبت تغییرات: Add و Commit0/3
- وضعیت مخزن: Status و Diff0/2
- شاخهها: Branch و Checkout0/3
- ترکیب تاریخچه: Merge و Rebase0/2
- تاریخچه: Log و Blame0/2
- بازگردانی: Reset و Revert0/3
- کار با ریموت: Push، Pull، Fetch و Remote0/3
- ذخیرهٔ موقت و برچسبها: Stash و Tag0/2
- تنظیمات: Config0/1
شروع مخزن: Init و Clone0/3
ساخت مخزن جدید یا گرفتن نسخهٔ محلی از یک مخزن راه دور.
git init
git init --bare
git init --initial-branch=main
git clone <url>
git clone --branch develop --single-branch <url>
git clone --depth 1 <url>
git clone --recursive <url>
برای CI/CD یا بررسی سریع یک کامیت خاص، --depth 1 حجم دانلود را بهشدت کم میکند.
افزودن و ثبت تغییرات: Add و Commit0/3
انتقال تغییرات به Staging Area و ثبت آنها در تاریخچه.
git add .
git add -A
git add -u
git add -p
استفاده از git add . داخل یک سابفولدر ممکن است طبق .gitignore رفتار متفاوتی نسبت به انتظار داشته باشد.
git commit -m "fix: bug"
git commit -a -m "..."
git commit --amend -m "new message"
git commit --amend --no-edit
برای اصلاح آخرین کامیت بدون تغییر پیام، از git commit --amend --no-edit استفاده کنید.
اجرای --amend روی کامیتی که از قبل Push شده، تاریخچهٔ ریموت را بههم میریزد و نیاز به force-push دارد.
git commit -m "empty" --allow-empty
git commit --no-verify -m "..."
وضعیت مخزن: Status و Diff0/2
مشاهدهٔ تغییرات قبل از Commit.
git status -sb
git diff
git diff --staged
git diff --stat
git diff <commit1> <commit2>
تفاوت diff و diff --staged سؤال رایج مصاحبه است: اولی نسبت به Staging، دومی Staging نسبت به آخرین کامیت.
شاخهها: Branch و Checkout0/3
کار با شاخهها — ساخت، جابهجایی و مدیریت.
git branch
git branch -a
git branch -d old-feature
git branch -m new-name
git checkout -b feature/new
git checkout -- file.txt
git checkout -
در Git جدید معادل مدرنتر آن دو دستور جدا هستند: git switch برای شاخه و git restore برای فایل — اما checkout هنوز همهجا کار میکند.
git checkout --ours path/to/file
git checkout --theirs path/to/file
ترکیب تاریخچه: Merge و Rebase0/2
دو راه اصلی برای آوردن تغییرات یک شاخه به شاخهٔ دیگر.
git merge feature/x
git merge --no-ff feature/x
git merge --squash feature/x
git merge --abort
--no-ff برای حفظ تاریخچهٔ خوانا در پروژههای تیمی توصیه میشود؛ نشان میدهد یک Feature از کجا تا کجا بوده.
git rebase main
git rebase -i HEAD~3
git rebase --continue
git rebase --abort
قانون طلایی: هرگز شاخهای که دیگران روی آن کار میکنند یا Push شده را Rebase نکنید — چون هش کامیتها عوض میشود.
Rebase کردن یک شاخهٔ مشترک باعث میشود بقیهٔ تیم با تاریخچهٔ ناسازگار مواجه شوند و مجبور به force-push شوند.
تاریخچه: Log و Blame0/2
بررسی تاریخچهٔ کامیتها و اینکه هر خط را چه کسی نوشته.
git log --oneline --graph --all
git log --author="Ali" --since="2 weeks ago"
git log -p -n 3
git blame -L 10,20 file.cs
git blame -w file.cs
قبل از پرسیدن «این خط رو کی نوشته؟» در Code Review، اول git blame را چک کنید.
بازگردانی: Reset و Revert0/3
دو ابزار متفاوت برای خنثیکردن تغییرات — یکی تاریخچه را بازمینویسد، دیگری کامیت جدید میسازد.
git reset --soft HEAD~1
git reset --mixed HEAD~1
git reset --hard HEAD~1
تفاوت soft/mixed/hard یکی از پرتکرارترین سؤالات مصاحبهٔ Git است.
git reset --hard تغییرات Commitنشده را برای همیشه پاک میکند — قبل از اجرا حتماً git status بزنید.
git revert <commit>
git revert --no-commit <commit>
روی شاخههای عمومی (مثل main) همیشه revert را به reset --hard ترجیح دهید.
git rm --cached secrets.json
git rm -r old-folder
کار با ریموت: Push، Pull، Fetch و Remote0/3
همگامسازی مخزن محلی با مخزن راه دور.
git push -u origin feature/x
git push --force-with-lease
git push origin --delete old-branch
استفاده از --force بهجای --force-with-lease میتواند کار همکارتان را که همزمان Push کرده، پاک کند.
git fetch origin
git pull
git pull --rebase
برای تاریخچهٔ تمیزتر، git pull --rebase را به pull ساده ترجیح دهید تا از Merge Commitهای اضافه جلوگیری شود.
git remote add origin <url>
git remote -v
ذخیرهٔ موقت و برچسبها: Stash و Tag0/2
کنارگذاشتن موقت تغییرات و علامتگذاری نسخهها.
git stash push -u -m "wip"
git stash list
git stash pop
git stash apply stash@{1}
git stash drop
تفاوت pop و apply: pop تغییرات را از لیست Stash هم حذف میکند، apply آنها را نگه میدارد.
git tag -a v1.0 -m "release 1.0"
git push origin v1.0
git tag -l "v1.*"
تنظیمات: Config0/1
پیکربندی هویت و رفتار Git.
git config --global user.name "Ali"
git config --global user.email "ali@example.com"
git config --list
