Atefeh Tahbaz
Atefeh Tahbaz
خواندن ۸ دقیقه·۴ ماه پیش

مفاهیم پیشرفته Git و مدیریت پروژه

git
git

در ادامه پست قبل که مفاهیم پایه ای 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:

  1. به آخرین commit اشاره می‌کند:وقتی شما یک commit جدید انجام می‌دهید، HEAD به این commit اشاره می‌کنه. پس می‌تونیم بگیم که HEAD همونطور که وضعیت پروژه رو نمایش می‌ده، به آخرین تغییرات شما هم اشاره می‌کنه.
  2. به شاخه جاری اشاره می‌کند:زمانی که شما روی یک شاخه خاص مثل main یا feature-branch هستید، HEAD به اون شاخه اشاره می‌کنه. یعنی HEAD هم شاخه‌ای که فعال هستید رو مشخص می‌کنه و هم آخرین commit توی همون شاخه.
  3. اگر به جایی برید که به یک commit خاص اشاره کنه، به این وضعیت می‌گیم Detached HEAD. یعنی HEAD دیگه به هیچ شاخه‌ای اشاره نمی‌کنه، بلکه مستقیماً به یک commit خاص اشاره داره. در این حالت، اگر تغییراتی ایجاد کنید و commit کنید، این تغییرات روی هیچ شاخه‌ای ذخیره نمی‌شن تا زمانی که شما دوباره به یک شاخه معین برگردید.

مثال‌ها:

حالت عادی (HEAD به شاخه اشاره می‌کنه):

git checkout main

# HEAD به شاخه main اشاره می‌کنه

حالت Detached HEAD:

git checkout 123abc # 123abc شناسه یک commit خاص است

# HEAD به commit 123abc اشاره می‌کنه

دستورات مرتبط با HEAD:

  • مشاهده وضعیت HEAD:

git log --oneline

این دستور تاریخچه commitها رو نشون می‌ده و می‌بینی که HEAD به کدوم commit اشاره می‌کنه.

  • برگشت به commit قبلی با استفاده از HEAD:

git reset --hard HEAD~1

این دستور به commit قبلی برمی‌گرده و تغییرات فعلی رو پاک می‌کنه.

چرا HEAD مهمه؟

  • به شما این امکان رو می‌ده که بدونید کجا هستید و در کدوم وضعیت از پروژه قرار دارید. همچنین، اگر بخواهید به یک 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های هر توسعه‌دهنده در پروژه رو نشون می‌ده.

۹. تنظیم ریموت و تغییر URL

📌 مشاهده 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



مدیریت پروژهگیتکدنویسیبرنامه نویسیgit
برنامه نویس جاوا هستم،سعی میکنم پستهایی بگذارم که مفید و قابل استفاده باشه
شاید از این پست‌ها خوشتان بیاید