توی این درس یاد میگیری روی ویژگیهای جدید کار کنی بدون اینکه شاخهی اصلی (main) را خراب کنی. میفهمی branch (شاخه) در Git فقط یک برچسب سبک روی یک commit است (برای همین ساختنش آنی است)، با git branch و git switch -c شاخه میسازی و جابهجا میشوی، با git merge کارت را به main برمیگردانی (دو حالت: fast-forward و three-way merge) و با git branch -d شاخهی تمامشده را پاک میکنی. تمرین: یک ویژگی را در branch جدا بساز و merge کن.
مسئله: کار نیمهتمام و پروژهی سالم
Section titled “مسئله: کار نیمهتمام و پروژهی سالم”تو در حال ساختن یک ویژگی بزرگ هستی (مثلاً جستجو). چند روز طول میکشد و وسطش پروژه کار نمیکند. ولی همین الان یک همکار باید یک باگ فوری را در main درست کند و سایت باید سالم بماند. اگر همه روی یک خط تاریخچه کار کنند، یا کار نیمهتمام تو سایت را خراب میکند یا باگ منتظر میماند. راهحل: هر کار یک خط جدا. وقتی تمام شد، آن را به خط اصلی ادغام (merge) میکنی.
تشبیه: جادهی فرعی
Section titled “تشبیه: جادهی فرعی”main مثل بزرگراه است: همیشه باز و امن. وقتی میخواهی چیزی را امتحان کنی، یک جادهی فرعی از بزرگراه جدا میکنی؛ هر چقدر در جادهی فرعی گشتی، بزرگراه تحت تأثیر نیست. وقتی راه فرعی به نتیجه رسید، دوباره به بزرگراه وصلش میکنی (merge)، یا اگر به درد نخورد، رهایش میکنی.
branch فقط یک برچسب است
Section titled “branch فقط یک برچسب است”بیشتر ابزارها برای شاخه، پوشه را کپی میکنند و کند هستند. در Git شاخه فقط یک اشارهگر به یک commit (یک فایل ۴۱ بایتی) است. ساختن شاخه یعنی نوشتن یک فایل کوچک؛ پس آنی است و بیهزینه. HEAD هم میگوید «الآن روی کدام شاخه هستم».
مثالهای عملی
Section titled “مثالهای عملی”یک پروژهی کوچک «وبسایت» با دو commit اولیه روی main:
mkdir -p ~/gitlab/site && cd ~/gitlab/site && git init -qecho "<h1>Home</h1>" > index.htmlgit add index.html && git commit -qm "Add homepage"echo "<p>About us</p>" > about.htmlgit add about.html && git commit -qm "Add about page"git log --oneline2d0f343 Add about page1433671 Add homepageمثال ۱: شاخهها را ببین
Section titled “مثال ۱: شاخهها را ببین”cd ~/gitlab/siteecho "--- git branch (ستاره = شاخهی فعلی):"git branchecho "--- با commit آخر هر شاخه (-v):"git branch -vecho "--- شاخهی فعلی را همینجا هم میگوید:"git status | head -1echo "--- HEAD و برچسب شاخه، فقط دو فایل متنی کوچکاند:"cat .git/HEADcat .git/refs/heads/main--- git branch (ستاره = شاخهی فعلی):* main--- با commit آخر هر شاخه (-v):* main 2d0f343 Add about page--- شاخهی فعلی را همینجا هم میگوید:On branch main--- HEAD و برچسب شاخه، فقط دو فایل متنی کوچکاند:ref: refs/heads/main2d0f343a29fe455cd77a441116d1279a1685bf11HEAD یک «اشارهگر به اشارهگر» است: به refs/heads/main اشاره میکند و آن فایل هش یک commit را دارد. (در «پشت پرده» برمیگردیم.)
مثال ۲: ساختن و جابهجایی، git switch -c
Section titled “مثال ۲: ساختن و جابهجایی، git switch -c”برای ویژگی جدید یک شاخه میسازم و همان لحظه به آن میروم (-c = create). در آن commit میزنم و بعد به main برمیگردم و میبینم فایلهای پوشه واقعاً عوض میشوند:
cd ~/gitlab/sitegit switch -c feature/searchecho "<form>search</form>" > search.htmlgit add search.html && git commit -qm "Add search page"echo "--- روی feature/search فایلها:"lsgit switch mainecho "--- بعد از برگشتن به main (search.html رفت!):"lsgit switch feature/searchecho "--- دوباره برگشتم به feature (search.html برگشت):"lsgit switch -q mainSwitched to a new branch 'feature/search'--- روی feature/search فایلها:about.htmlindex.htmlsearch.htmlSwitched to branch 'main'--- بعد از برگشتن به main (search.html رفت!):about.htmlindex.htmlSwitched to branch 'feature/search'--- دوباره برگشتم به feature (search.html برگشت):about.htmlindex.htmlsearch.htmlجادو نیست: git switch پوشهی کاری را مطابق commit آن شاخه میکند. فایلهای شاخهی دیگر در .git امناند. (قبل از Git ۲.۲۳ همین کار git checkout شاخه بود؛ switch فقط برای شاخه است و گیجکننده نیست. دستور git branch نام فقط شاخه میسازد بدون رفتن به آن.)
مثال ۳: ادغام ساده، fast-forward
Section titled “مثال ۳: ادغام ساده، fast-forward”main از زمان جداشدن شاخه، commit جدید ندارد. پس ادغام فقط یعنی «برچسب main را جلو ببر تا به آخر شاخه برسد». Git این را fast-forward مینامد و commit جدیدی نمیسازد:
cd ~/gitlab/sitegit switch -q maingit log --oneline --graph --allecho "--- merge:"git merge feature/searchecho "--- بعد از merge:"git log --oneline --graph --all* c27aadf Add search page* 2d0f343 Add about page* 1433671 Add homepage--- merge:Updating 2d0f343..c27aadfFast-forward search.html | 1 + 1 file changed, 1 insertion(+) create mode 100644 search.html--- بعد از merge:* c27aadf Add search page* 2d0f343 Add about page* 1433671 Add homepageFast-forward: تاریخچه خطی ماند؛ بدون commit ادغام. حالا main و feature/search به یک commit اشاره میکنند.
مثال ۴: ادغام واقعی، three-way merge
Section titled “مثال ۴: ادغام واقعی، three-way merge”وقتی هر دو شاخه از جداشدن، commit جدید گرفتهاند، fast-forward ممکن نیست (باید دو خط را به هم وصل کرد). Git یک commit ادغام با دو والد میسازد. به آن «سهطرفه» میگویند چون Git سه commit را مقایسه میکند: آخر هر شاخه و جدّ مشترکشان. این بار دو تغییر نامرتبط در دو شاخه میدهم:
cd ~/gitlab/sitegit switch -qc feature/contactecho "<p>Contact: 021</p>" > contact.htmlgit add contact.html && git commit -qm "Add contact page"git switch -q mainecho "<footer>2026</footer>" > footer.htmlgit add footer.html && git commit -qm "Add footer"echo "--- قبل از merge (دو خط جدا):"git log --oneline --graph --allgit merge --no-edit feature/contactecho "--- بعد از merge:"git log --oneline --graph --all--- قبل از merge (دو خط جدا):* c08164d Add contact page| * cbbbe95 Add footer|/* c27aadf Add search page* 2d0f343 Add about page* 1433671 Add homepageMerge made by the 'ort' strategy. contact.html | 1 + 1 file changed, 1 insertion(+) create mode 100644 contact.html--- بعد از merge:* 64ab011 Merge branch 'feature/contact'|\| * c08164d Add contact page* | cbbbe95 Add footer|/* c27aadf Add search page* 2d0f343 Add about page* 1433671 Add homepageهر دو تغییر (footer و contact) در main هستند و یک commit ادغام ساخته شد (--no-edit یعنی «پیام پیشفرض را همانطور نگه دار»؛ بدون آن ویرایشگر باز میشد). اگر دو شاخه یک خط را عوض کرده بودند، Git نمیدانست کدام را نگه دارد و conflict میداد؛ درس بعد.
مثال ۵: --no-ff، حفظ شکل شاخه
Section titled “مثال ۵: --no-ff، حفظ شکل شاخه”اگر ادغام fast-forward باشد، بعداً در تاریخچه معلوم نیست آن چند commit یک «ویژگی» بودند. با --no-ff (no fast-forward) Git حتی در حالت ساده هم یک commit ادغام میسازد تا شاخه دیده شود:
cd ~/gitlab/sitegit switch -qc feature/faqecho "faq" > faq.html && git add faq.html && git commit -qm "Add FAQ page"echo "faq 2" >> faq.html && git commit -qam "Extend FAQ"git switch -q mainecho "--- با --no-ff (commit ادغام ساخته میشود، با اینکه fast-forward ممکن بود):"git merge --no-ff --no-edit feature/faqgit log --oneline --graph -6--- با --no-ff (commit ادغام ساخته میشود، با اینکه fast-forward ممکن بود):Merge made by the 'ort' strategy. faq.html | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 faq.html* c79fb1c Merge branch 'feature/faq'|\| * 7641d6c Extend FAQ| * 1980381 Add FAQ page|/* 64ab011 Merge branch 'feature/contact'|\| * c08164d Add contact page* | cbbbe95 Add footer|/بعضی تیمها همیشه --no-ff را میخواهند تا «این ویژگی از کجا تا کجا بود» در گراف پیدا باشد؛ بعضی دیگر تاریخچهی خطی را ترجیح میدهند (با rebase یا squash، درسهای بعد). هر دو درستاند؛ مهم این است که تیم یکی را انتخاب کند.
مثال ۶: پاککردن شاخهی تمامشده
Section titled “مثال ۶: پاککردن شاخهی تمامشده”بعد از ادغام، شاخه کارش را کرده. حذفش فقط برچسب را پاک میکند، نه commit ها را:
cd ~/gitlab/siteecho "--- شاخههایی که کامل ادغام شدهاند (--merged):"git branch --mergedgit branch -d feature/search feature/contact feature/faqecho "--- باقیمانده:"git branch--- شاخههایی که کامل ادغام شدهاند (--merged): feature/contact feature/faq feature/search* mainDeleted branch feature/search (was c27aadf).Deleted branch feature/contact (was c08164d).Deleted branch feature/faq (was 7641d6c).--- باقیمانده:* main-d (کوچک) امن است: فقط وقتی پاک میکند که شاخه ادغام شده باشد. اگر ادغام نشده باشد، Git جلویت را میگیرد، چون commit های آن شاخه با حذف برچسب از دسترس خارج میشوند:
cd ~/gitlab/sitegit switch -qc experimentecho "idea" > idea.txt && git add idea.txt && git commit -qm "Try an idea"git switch -q mainecho "--- حذف شاخهی ادغامنشده با -d:"git branch -d experimentecho "--- شاخههایی که هنوز ادغام نشدهاند (--no-merged):"git branch --no-merged--- حذف شاخهی ادغامنشده با -d:error: the branch 'experiment' is not fully merged.If you are sure you want to delete it, run 'git branch -D experiment'--- شاخههایی که هنوز ادغام نشدهاند (--no-merged): experimentپیام not fully merged یعنی «کار این شاخه جای دیگری نیست». اگر مطمئنی آن را نمیخواهی، git branch -D experiment (حرف بزرگ) اجباری پاک میکند. (و اگر اشتباه کردی، reflog راه برگشت دارد: درس نجات.) یک نمایش عمومیتر: git branch -vv شاخهها را با commit و شاخهی راه دور نشان میدهد.
مثال ۷: تغییر نام شاخه
Section titled “مثال ۷: تغییر نام شاخه”cd ~/gitlab/sitegit switch -qc old-namegit branch -m new-namegit branchgit switch -q maingit branch -D new-name experiment main* new-nameDeleted branch new-name (was c79fb1c).git branch -m نام-جدید شاخهی فعلی را تغییر نام میدهد؛ git branch -m قدیم جدید هر شاخهای را. (همینطور مخزنهای قدیمی master را به main درمیآورند: git branch -m master main.) یک قرارداد نامگذاری رایج:
| پیشوند | کاربرد | نمونه |
|---|---|---|
feature/ |
ویژگی جدید | feature/search |
fix/ یا bugfix/ |
رفع باگ | fix/cart-total |
hotfix/ |
رفع باگ فوری روی نسخهی منتشرشده | hotfix/login-crash |
docs/ |
مستندات | docs/readme-update |
chore/ یا refactor/ |
کار فنی بدون تغییر رفتار | chore/update-deps |
مثال ۸: وقتی تغییر commit نشده داری و شاخه عوض میکنی
Section titled “مثال ۸: وقتی تغییر commit نشده داری و شاخه عوض میکنی”اگر تغییر commit نشده داشته باشی، Git آن را با خودت میبرد، مگر اینکه با فایلهای شاخهی مقصد تداخل کند:
cd ~/gitlab/sitegit switch -qc otherecho "<h1>Home on other</h1>" > index.htmlgit commit -qam "Change home on other"git switch -q mainecho "--- در main فایل index.html را (commit نکرده) ویرایش میکنم:"echo "<h1>Home draft</h1>" > index.htmlgit switch other 2>&1echo "--- در همین حال، یک فایل جدید (بدون تداخل) همراهم میآید:"git restore index.htmlecho "note" > note.txtgit switch other 2>&1git status -sgit switch -q main && rm note.txt && git branch -D other -q--- در main فایل index.html را (commit نکرده) ویرایش میکنم:error: Your local changes to the following files would be overwritten by checkout: index.htmlPlease commit your changes or stash them before you switch branches.Aborting--- در همین حال، یک فایل جدید (بدون تداخل) همراهم میآید:Switched to branch 'other'?? note.txtبار اول، چون index.html در دو شاخه فرق دارد و تغییر commit نشدهات روی آن است، Git جابهجایی را رد کرد تا کارت پاک نشود (Your local changes ... would be overwritten). بار دوم، فایل note.txt به هیچ فایل شاخهی دیگر مربوط نبود و با تو آمد. راهحلها: commit کن، یا git stash (درس بعدتر) تا موقتاً کنار بگذاری.
پشت پرده: برچسبها و والدها
Section titled “پشت پرده: برچسبها و والدها”شاخهها فایلهای سادهاند و commit ادغام فقط یک commit با دو والد:
cd ~/gitlab/siteecho "--- شاخهها فایلهایی با یک هش هستند:"ls .git/refs/headscat .git/HEADecho "--- یک شاخهی تازه فقط یک فایل جدید است:"git branch democat .git/refs/heads/demogit rev-parse maingit branch -D demo -qecho "--- commit ادغام دو والد (parent) دارد:"git log --merges --oneline | head -1git cat-file -p $(git log --merges --format=%h -1) | head -5--- شاخهها فایلهایی با یک هش هستند:experimentmainref: refs/heads/main--- یک شاخهی تازه فقط یک فایل جدید است:c79fb1c04cf712d614f3c8f10bece3877f31258ec79fb1c04cf712d614f3c8f10bece3877f31258e--- commit ادغام دو والد (parent) دارد:c79fb1c Merge branch 'feature/faq'tree 7ad72379df66380d495dce08633e0669dd41401dparent 64ab011f8f91b97e849f9450152d7cbce60fb440parent 7641d6cc0220b1db80e1315acfa5051ffcd4744eauthor Ali <ali@example.com> 1791102177 +0000committer Ali <ali@example.com> 1791102177 +0000دو خط parent یعنی «این commit از ادغام دو خط ساخته شد». برای همین git log --graph میتواند دو خط را رسم کند. و git merge در حالت fast-forward فقط فایل برچسب را عوض میکند و چیزی نمیسازد. (بعد از ساخت شاخهی demo هر دو برچسب به یک commit اشاره میکردند و هش یکسان چاپ شد.)
جدولهای مرجع
Section titled “جدولهای مرجع”| دستور | کار |
|---|---|
git branch / git branch -v |
فهرست شاخهها / با commit آخر |
git branch نام |
ساخت شاخه (بدون رفتن به آن) |
git switch نام |
رفتن به شاخه |
git switch -c نام |
ساخت و رفتن |
git switch - |
برگشت به شاخهی قبلی |
git merge نام |
ادغام آن شاخه در شاخهی فعلی |
git merge --no-ff نام |
همیشه commit ادغام بساز |
git branch -d نام |
حذف امن (فقط ادغامشده) |
git branch -D نام |
حذف اجباری ⚠ |
git branch -m قدیم جدید |
تغییر نام |
git branch --merged / --no-merged |
شاخههای ادغامشده / نشده |
git log --oneline --graph --all |
گراف همهی شاخهها |
| نوع ادغام | چه زمانی | نتیجه |
|---|---|---|
| fast-forward | شاخهی مقصد بعد از جداشدن commit جدید ندارد | فقط برچسب جلو میرود؛ commit جدید ندارد؛ تاریخچه خطی |
| three-way | هر دو شاخه commit جدید دارند | یک commit ادغام با دو والد |
--no-ff |
همیشه | commit ادغام حتی اگر fast-forward ممکن باشد |
اشتباهات رایج
Section titled “اشتباهات رایج”۱) commit روی main بهجای شاخهی ویژگی
Section titled “۱) commit روی main بهجای شاخهی ویژگی”خیلی رایج است: یادت میرود شاخه بسازی و دو commit روی main میزنی. تاریخچه را بدون از دستدادن کار اینطور درست کن: یک شاخه از همینجا بساز (commit ها را نگه میدارد)، و main را به عقب ببر:
mkdir -p ~/gitlab/oops && cd ~/gitlab/oops && git init -qecho 1 > a && git add a && git commit -qm "Base"echo 2 > b && git add b && git commit -qm "Feature work 1 (on main by mistake)"echo 3 > c && git add c && git commit -qm "Feature work 2 (on main by mistake)"echo "--- main حالا دو commit اضافه دارد:"git log --onelinegit branch featuregit reset -q --hard HEAD~2echo "--- بعد: main سالم، کار روی feature:"git log --onelinegit log --oneline feature--- main حالا دو commit اضافه دارد:a3726de Feature work 2 (on main by mistake)5b3e801 Feature work 1 (on main by mistake)5afbcd9 Base--- بعد: main سالم، کار روی feature:5afbcd9 Basea3726de Feature work 2 (on main by mistake)5b3e801 Feature work 1 (on main by mistake)5afbcd9 Basegit branch feature یک برچسب روی همین commit میگذارد؛ بعد reset --hard HEAD~2 فقط برچسب main را عقب میبرد و commit ها با برچسب feature در امان میمانند. (این reset فقط چون هیچچیز push نشده امن است؛ درس قبل.)
۲) -D بهجای -d
Section titled “۲) -D بهجای -d”-D شاخهی ادغامنشده را بیپرسش پاک میکند و commit هایش را بیصاحب میگذارد. راهحل: -d را بزن؛ اگر شکایت کرد، فکر کن. و اگر پاک شد: git reflog هش آخر آن شاخه را پیدا میکند و git branch نام هش برش میگرداند.
۳) ادغام در جهت اشتباه
Section titled “۳) ادغام در جهت اشتباه”git merge feature را باید از داخل main بزنی تا feature وارد main شود. اگر روی feature باشی و git merge main بزنی، main وارد feature میشود (که گاهی مطلوب است: گرفتن تغییرهای تازهی main). قبل از merge همیشه git status یا git branch را نگاه کن که روی کدام شاخهای.
۴) detached HEAD
Section titled “۴) detached HEAD”اگر بهجای شاخه، به یک commit بروی (git switch --detach commit یا git checkout هش)، HEAD دیگر روی هیچ شاخهای نیست:
cd ~/gitlab/oopsgit switch --detach feature~1 2>&1 | head -6echo "--- شاخهی فعلی؟"git branch --show-current; echo "(خالی: روی هیچ شاخهای نیستی)"git status | head -1echo "--- روی detached یک commit میزنم:"echo "new" > lost.txt && git add lost.txt && git commit -qm "Commit on detached HEAD"git log --oneline -2echo "--- با رفتن به main این commit بیصاحب میشود؛ پس همینجا یک شاخه میسازم:"git switch -c rescue 2>&1git switch -q maingit log --oneline rescue -2HEAD is now at 5b3e801 Feature work 1 (on main by mistake)--- شاخهی فعلی؟(خالی: روی هیچ شاخهای نیستی)HEAD detached at 5b3e801--- روی detached یک commit میزنم:3b49425 Commit on detached HEAD5b3e801 Feature work 1 (on main by mistake)--- با رفتن به main این commit بیصاحب میشود؛ پس همینجا یک شاخه میسازم:Switched to a new branch 'rescue'3b49425 Commit on detached HEAD5b3e801 Feature work 1 (on main by mistake)حالت detached برای نگاهکردن به یک commit قدیمی عالی است. ولی commit هایی که در آن میزنی به هیچ شاخهای وصل نیستند و با رفتن به جای دیگر گم میشوند. اگر میخواهی نگهشان داری، همانجا git switch -c نام بزن.
یک شاخهی feature/x بساز، در آن یک commit بزن، به main برگرد و ثابت کن فایل آن commit در main نیست.
دیدن جواب
mkdir -p ~/gitlab/ex1 && cd ~/gitlab/ex1 && git init -qecho base > base.txt && git add base.txt && git commit -qm "Base"git switch -qc feature/xecho x > x.txt && git add x.txt && git commit -qm "Add x"git switch -q mainlsgit log --oneline --allbase.txt755cabd Add x2294e3b Baseتمرین اصلی: یک ویژگی را در branch جدا بساز و merge کن. روی main یک فایل app.py با یک تابع بنویس؛ شاخهی feature/greet را بساز و تابع greet را اضافه کن؛ به main برگرد و آن را ادغام کن (چه نوعی؟)، بعد شاخه را پاک کن و گراف را ببین.
دیدن جواب
mkdir -p ~/gitlab/ex2 && cd ~/gitlab/ex2 && git init -qprintf 'def main():\n pass\n' > app.pygit add app.py && git commit -qm "Add app skeleton"git switch -qc feature/greetprintf '\ndef greet(name):\n return f"Hello {name}"\n' >> app.pygit commit -qam "Add greet function"git switch -q maingit merge feature/greetgit branch -d feature/greetgit log --oneline --graph --allcat app.pyUpdating df1c6a0..4292058Fast-forward app.py | 3 +++ 1 file changed, 3 insertions(+)Deleted branch feature/greet (was 4292058).* 4292058 Add greet function* df1c6a0 Add app skeletondef main(): pass
def greet(name): return f"Hello {name}"چون main بعد از جداشدن commit جدیدی نداشت، ادغام fast-forward بود.
دو ویژگی را موازی در دو شاخه بساز (feature/a و feature/b، هر کدام یک فایل مختلف)، هر دو را به main ادغام کن (اولی fast-forward و دومی three-way)، و در گراف ثابت کن یک commit ادغام با دو والد ساخته شد.
دیدن جواب
mkdir -p ~/gitlab/ex3 && cd ~/gitlab/ex3 && git init -qecho base > base.txt && git add base.txt && git commit -qm "Base"git switch -qc feature/a && echo a > a.txt && git add a.txt && git commit -qm "Add a"git switch -q maingit switch -qc feature/b && echo b > b.txt && git add b.txt && git commit -qm "Add b"git switch -q mainecho "--- ادغام اول (fast-forward):"git merge feature/a | head -2echo "--- ادغام دوم (main حالا جلوتر است، پس three-way):"git merge --no-edit feature/b | head -2git log --oneline --graphecho "--- والدهای commit ادغام:"git log -1 --format='%h والدها: %p'--- ادغام اول (fast-forward):Updating 2294e3b..5553204Fast-forward--- ادغام دوم (main حالا جلوتر است، پس three-way):Merge made by the 'ort' strategy. b.txt | 1 +* cdc3657 Merge branch 'feature/b'|\| * 65e738f Add b* | 5553204 Add a|/* 2294e3b Base--- والدهای commit ادغام:cdc3657 والدها: 5553204 65e738fآزمونک
Section titled “آزمونک”ساختن یک شاخهی جدید در Git چقدر هزینه دارد و چرا؟
branch فقط یک اشارهگر (برچسب) به یک commit است؛ برای همین شاخهسازی و جابهجایی در Git آنی است.
کدام دستور شاخهی جدید میسازد و همان لحظه به آن میرود؟
git branch فقط میسازد؛ switch -c میسازد و میرود.
ادغام fast-forward چه زمانی ممکن است؟
وقتی هر دو commit جدید دارند، three-way merge لازم است.
commit ادغام در three-way merge چه ویژگی دارد؟
git cat-file -p commit دو خط parent نشان میدهد.
git branch -d چه فرقی با -D دارد؟
پیام not fully merged یعنی با حذف، commit ها بیصاحب میشوند.
روی detached HEAD چند commit زدهای. برای نگهداشتنشان چه میکنی؟
commit های بیشاخه با جابهجایی گم میشوند (البته در reflog هستند).
جمعبندی
Section titled “جمعبندی”- branch یک برچسب سبک روی یک commit است؛ ساختنش آنی.
HEADمیگوید روی کدام شاخهای. git switch -c ناممیسازد و میرود؛git switch ناممیرود؛git switch -به قبلی برمیگردد. پوشهی کاری با commit آن شاخه یکی میشود.git merge نامشاخه را وارد شاخهی فعلی میکند: fast-forward (برچسب جلو میرود) یا three-way (commit ادغام با دو والد)؛--no-ffهمیشه commit ادغام میسازد.git branch -d(امن) بعد از ادغام؛-Dاجباری ⚠.--mergedو--no-mergedوضعیت ادغام را نشان میدهند.- commit روی شاخهی اشتباه:
git branch درستو بعدreset --hardبرای شاخهی اشتباه (فقط قبل از push). detached HEAD: برای نگهداشتن کار،git switch -c. - شاخهها فایلهای هشدار در
.git/refs/heads/هستند؛ commit ادغام دوparentدارد.
| دستور | کاری که میکند |
|---|---|
git branch / git branch -v | فهرست شاخهها |
git switch -c feature/x | ساخت و رفتن |
git switch main / git switch - | رفتن به شاخه / قبلی |
git merge feature/x | ادغام در شاخهی فعلی |
git merge --no-ff feature/x | همیشه commit ادغام |
git branch -d feature/x | حذف امن |
git branch -D feature/x | حذف اجباری ⚠ |
git branch -m قدیم جدید | تغییر نام |
git branch --merged / --no-merged | ادغامشدهها / نشدهها |
git log --oneline --graph --all | گراف همهی شاخهها |
git switch --detach commit | نگاه به یک commit (detached) |