در ادامه پست قبل که مفاهیم پایه ای git ، گفته شد، در این پست میخوام راجع به مفاهیم پیشرفته ترgit صحبت کنم.
📌 مشاهده تغییرات قبل از commit
:
git diff
✅ این دستور تغییرات انجامشده در فایلها رو قبل از اضافه کردن به staging area
نشون میده.
📌 مشاهده تغییرات فایل خاص:
git diff filename
📌 مشاهده تغییرات بین دو commit
:
git diff commit1 commit2
📌 مشاهده تغییرات آماده برای commit
:
git diff --staged
stash
(ذخیره تغییرات موقت بدون commit
)📌 ذخیره تغییرات بدون commit
:
git stash
✅ این دستور تغییراتتون رو موقتاً ذخیره میکنه و working directory
رو به آخرین commit
برمیگردونه.
📌 مشاهده لیست تغییرات stash
شده:
git stash list
📌 برگرداندن آخرین تغییرات stash
:
git stash pop
📌 برگرداندن تغییرات بدون حذف stash
:
git stash apply
📌 حذف stash
:
git stash drop
📌 حذف تمام stash
ها:
git stash clear
📌 مشاهده لیست شاخهها:
git branch
📌 مشاهده شاخههای راه دور:
git branch -r
📌 حذف یک شاخه محلی:
git branch -d branch-name
📌 حذف یک شاخه راه دور:
git push origin --delete branch-name
📌 تغییر نام شاخهی فعلی:
git branch -m new-branch-name
rebase
و merge
📌 ادغام شاخهها (merge
):
git merge branch-name
✅ اگر روی شاخه main
هستید و میخواهید تغییرات feature-branch
رو بهش اضافه کنید:
git checkout main
git merge feature-branch
📌 ادغام بدون merge commit
(rebase
):
git rebase branch-name
✅ تاریخچهی commit
ها رو مرتبتر نگه میداره و تغییرات رو روی branch
فعلی اعمال میکنه.
📌 لغو rebase
در صورت بروز مشکل:
git rebase --abort
commit
و بازگشت به حالت قبلی📌 حذف آخرین commit
و نگهداشتن تغییرات در staging area
:
git reset --soft HEAD~1
📌 حذف آخرین commit
و انتقال تغییرات به working directory
:
git reset --mixed HEAD~1
📌 حذف آخرین commit
و حذف کامل تغییرات:
git reset --hard HEAD~1
📌 برگشت به یک commit
خاص بدون حذف تغییرات:
git reset --soft commit-id
📌 برگشت به یک commit
خاص و حذف کامل تغییرات بعد از آن:
git reset --hard commit-id
در گیت، HEAD
یک اشارهگر خاص هست که به آخرین commit
یا شاخهای که در حال حاضر روی اون کار میکنید، اشاره میکنه. به عبارت دیگه، HEAD
همیشه نشاندهندهی وضعیت فعلی مخزن گیت شما است.
HEAD
:commit
اشاره میکند:وقتی شما یک commit
جدید انجام میدهید، HEAD
به این commit
اشاره میکنه. پس میتونیم بگیم که HEAD
همونطور که وضعیت پروژه رو نمایش میده، به آخرین تغییرات شما هم اشاره میکنه.main
یا feature-branch
هستید، HEAD
به اون شاخه اشاره میکنه. یعنی HEAD
هم شاخهای که فعال هستید رو مشخص میکنه و هم آخرین commit
توی همون شاخه.commit
خاص اشاره کنه، به این وضعیت میگیم Detached HEAD. یعنی HEAD
دیگه به هیچ شاخهای اشاره نمیکنه، بلکه مستقیماً به یک commit
خاص اشاره داره. در این حالت، اگر تغییراتی ایجاد کنید و commit
کنید، این تغییرات روی هیچ شاخهای ذخیره نمیشن تا زمانی که شما دوباره به یک شاخه معین برگردید.حالت عادی (HEAD به شاخه اشاره میکنه):
git checkout main
# HEAD به شاخه main اشاره میکنه
حالت Detached HEAD:
git checkout 123abc # 123abc شناسه یک commit خاص است
# HEAD به commit 123abc اشاره میکنه
HEAD
:git log --oneline
این دستور تاریخچه commit
ها رو نشون میده و میبینی که HEAD
به کدوم commit
اشاره میکنه.
commit
قبلی با استفاده از HEAD:git reset --hard HEAD~1
این دستور به commit
قبلی برمیگرده و تغییرات فعلی رو پاک میکنه.
commit
خاص برگردید یا تغییرات جدیدی اعمال کنید، HEAD
به شما نشون میده که کجا باید برید.commit
بعد از ارسال📌 ویرایش آخرین commit
(اگر هنوز push
نکردید):
git commit --amend -m "پیام جدید"
📌 ویرایش commit
های قبلی (اگر push
کردید، احتیاط کنید!):
git rebase -i HEAD~3
✅ این دستور لیستی از ۳ commit
آخر رو باز میکنه و میتوانید تغییرات لازم رو اعمال کنید.
📌 مشاهده لیست فایلهای حذفشده:
git ls-files -d
📌 بازیابی یک فایل حذفشده:
git checkout -- filename
📌 بازیابی یک فایل حذفشده از یک commit
خاص:
git checkout commit-id -- filename
📌 مشاهده تاریخچه تغییرات یک فایل خاص:
git log filename
📌 مشاهده تمام commit
های یک کاربر خاص:
git log --author="User Name"
📌 مشاهده تعداد commit
های هر فرد:
git shortlog -s -n
✅ این دستور تعداد commit
های هر توسعهدهنده در پروژه رو نشون میده.
📌 مشاهده remote
های متصل به پروژه:
git remote -v
📌 تغییر URL
ریموت:
git remote set-url origin new-url
📌 افزودن remote
جدید:
git remote add upstream URL
📌 حذف remote
:
git remote remove remote-name
tag
ها (نسخهبندی پروژه)📌 ایجاد یک tag
جدید:
git tag v1.0.0
📌 ایجاد tag
همراه با توضیحات:
git tag -a v1.0.0 -m "نسخه ۱.۰.۰"
📌 مشاهده لیست tag
ها:
git tag
📌 حذف tag
محلی:
git tag -d v1.0.0
📌 حذف tag
از remote
(مثلاً گیتهاب):
git push origin --delete v1.0.0
blame
, bisect
, reflog
)۱.۱. بررسی تغییرات یک فایل (git blame
)
📌 اگر میخواهید بدونید که چه کسی و در کدام commit
یک خط خاص از یک فایل رو تغییر داده:
git blame filename
✅ این دستور نام نویسنده، commit id
و تاریخ آخرین تغییر رو برای هر خط فایل نشون میده.
۱.۲. پیدا کردن commit
مشکلدار (git bisect
)
📌 این دستور بهتون کمک میکنه تا commit
ی که باعث ایجاد یک باگ شده رو پیدا کنید:
git bisect start
git bisect bad # وضعیت فعلی که باگ دارد
git bisect good commit-id # یک commit قبلی که درست کار میکرده
✅ حالا گیت بین good
و bad
به عقب و جلو میره تا commit
مشکلدار رو پیدا کنه.
📌 بعد از پیدا کردن مشکل، برای خروج از bisect
:
git bisect reset
۱.۳. مشاهده تاریخچه HEAD
و تغییرات (git reflog
)
📌 اگه commit
ای رو پاک کردید و میخواهید پیداش کنید:
git reflog
✅ این دستور تمام تغییرات HEAD
رو نشون میده، حتی commit
های حذفشده رو.
📌 اگه میخواهید به commit
ی که پاک شده برگردید:
git reset --hard HEAD@{1}
submodules
(مدیریت چند مخزن داخل یک پروژه)📌 افزودن submodule
(مخزن داخل مخزن):
git submodule add https://github.com/example/repo.git path/to/submodule
📌 کلون کردن مخزن با submodule
هایش:
git clone --recursive URL
📌 بهروزرسانی تمام submodule
ها:
git submodule update --init --recursive
📌 مقایسه دو شاخه:
git diff branch1 branch2
📌 مشاهده commit
هایی که در branch1
هست ولی در branch2
نیست:
git log branch2..branch1
📌 مشاهده commit
هایی که در branch1
نیست ولی در branch2
هست:
git log branch1..branch2
cherry-pick
(انتخاب commit
خاص از یک شاخه)📌 کپی کردن یک commit
از یک شاخهی دیگر به شاخهی فعلی:
git cherry-pick commit-id
✅ این دستور تغییرات یک commit
خاص رو از یک شاخه به شاخهی فعلی میاره.
📌 اگر cherry-pick
مشکل ایجاد کرد، لغوش کنید:
git cherry-pick --abort
commit
ها (GPG Signing)📌 امضای commit
ها برای امنیت و اعتبار:
git commit -S -m "پیام commit"
✅ برای این کار باید GPG Key
بسازید و به گیت معرفی کنید.
📌 مشاهده امضای commit
:
git log --show-signature
commit
بعد از push
(احتیاط کنید!)📌 اگر commit
ی رو push
کردید ولی میخواهید حذفش کنید:
git reset --hard HEAD~1
git push --force
🚨 هشدار: این کار میتونه تغییرات بقیه اعضای تیم رو هم پاک کنه! بهتره بهجای reset --hard
از revert
استفاده کنید.
📌 برگرداندن یک commit
بدون حذف سابقه:
git revert commit-id
✅ این کار یک commit
جدید ایجاد میکنه که تغییرات commit
قبلی رو برمیگردونه.
commit
ها (squash
)📌 اگر میخواهید چند commit
اخیر رو یکی کنید:
git rebase -i HEAD~3
✅ یک صفحه باز میشه که میتونید commit
های قبلی رو به squash
تغییر بدید تا یکی بشن.
📌 اگه rebase
خراب شد، برگرد به حالت قبل:
git rebase --abort
commit
بهصورت patch
(ذخیره موقت برای استفاده بعدی)📌 ذخیره commit
به فایل:
git format-patch -1 commit-id
📌 اعمال patch
روی مخزن دیگر:
git apply patch-file.patch
commit
که باعث ایجاد یک bug
شده (با pickaxe
)📌 پیدا کردن commit
هایی که یک مقدار خاص رو تغییر دادن:
git log -S "متن موردنظر"
✅ این کار خیلی مفیده وقتی که دنبال commit
خاصی میگردید که یه bug
رو ایجاد کرده.
worktree
(چند نسخه از یک مخزن در یک زمان)📌 ایجاد یک worktree
جدید برای یک شاخه:
git worktree add ../new-folder branch-name
✅ این دستور بهتون اجازه میده که دو شاخه مختلف رو همزمان روی کامپیوترتون داشته باشید.
📌 مشاهده worktree
های فعال:
git worktree list
📌 حذف یک worktree
:
git worktree remove ../new-folder