این آزمون پنج درس بخش «شاخهها» را میسنجد. جواب هر سؤال همان لحظه با توضیح نشان داده میشود و نتیجهات در همین مرورگر ذخیره میشود (پیشرفت من).
ساختن یک شاخهی جدید در Git چقدر هزینه دارد؟
branch یک برچسب سبک است.
کدام دستور شاخهی جدید میسازد و همان لحظه به آن میرود؟
git branch فقط میسازد.
ادغام fast-forward چه زمانی انجام میشود؟
وگرنه three-way merge با commit دو والده.
git branch -d چه فرقی با -D دارد؟
پیام not fully merged یعنی commit ها با حذف بیصاحب میشوند.
روی detached HEAD چند commit زدهای. چطور نگهشان میداری؟
commit های بدون شاخه با جابهجایی گم میشوند (در reflog هستند).
علامت «<<<<<<< HEAD» تا «=======» در conflict مال کدام طرف است؟
از ======= تا >>>>>>> نسخهی شاخهی ادغامشده است.
بعد از حل کردن فایل conflict دار چه باید کرد؟
add به Git میگوید فایل حل شد.
git merge --abort چه میکند؟
بیخطر و بدون ردپا.
git rebase main (روی شاخهی feature) چه میکند؟
تغییرها همان است، پایه عوض میشود.
قانون طلایی rebase؟
rebase شناسهها را عوض میکند و روی کار مشترک تاریخچه را بههم میریزد.
در rebase تعاملی، تفاوت squash و fixup؟
اولین خط فهرست باید pick بماند.
بعد از rebase یک شاخهی شخصی که قبلاً push شده، کدام push درست است؟
--force-with-lease از --force امنتر است.
git stash بهصورت پیشفرض چه چیزی را کنار نمیگذارد؟
و -a حتی فایلهای ignoreشده را هم میگیرد.
git stash pop با conflict تمام شد. stash چه میشود؟
برای امنیت کار تو.
در SemVer، افزودن یک ویژگی جدید که با قبل سازگار است کدام بخش را بالا میبرد؟
MAJOR تغییر ناسازگار؛ PATCH باگفیکس.
آیا git push معمولی tag ها را به سرور میفرستد؟
با git ls-remote --tags origin میبینی چه رفته.
تفاوت اصلی tag و branch؟
برای همین tag برای نسخههای منتشرشده مناسب است.
با آنچه در این بخش آموختی، چرخهی کار یک برنامهنویس را شبیهسازی کن:
۱. مخزن quiz2 را بساز و روی main یک فایل index.html با سه خط (title، body، footer؛ در footer یک غلط تایپی عمدی) در دو commit ثبت کن.
۲. شاخهی feature/body را بساز و بدنه را عوض کن (commit نکن). حالا یک باگ فوری آمده: git stash بزن، روی main غلط تایپی footer را درست و commit کن، برگرد و کارت را با stash pop بیاور.
۳. تغییر بدنه را commit کن. در همین حال روی main همان خط بدنه را هم عوض کن (conflict عمدی). feature/body را در main ادغام کن و conflict را با ترکیب هر دو حل کن.
۴. شاخهی feature/wip را با سه commit نیمهکارهی wip بساز، آنها را با rebase تعاملی به یک commit با پیام معنادار تبدیل کن و با fast-forward در main بگیر.
۵. نسخهی v1.0.0 را tag بزن؛ بعد باگی در آن پیدا میشود: از tag یک شاخهی hotfix/1.0.1 بساز، درست کن و v1.0.1 را tag بزن.
۶. گراف نهایی را با git log --oneline --graph --all --decorate نشان بده و همهچیز را پاک کن.
راهنمایی
برای ۲: بعد از git stash، با git switch main به main برو. برای ۳: git merge feature/body conflict میدهد؛ فایل را با دست بنویس و git add و git commit --no-edit بزن. برای ۴: GIT_SEQUENCE_EDITOR="sed -i '2s/^pick/squash/;3s/^pick/squash/'" بههمراه یک GIT_EDITOR که پیام را بنویسد (مثلاً اسکریپتی که $MSG را در فایل میریزد). برای ۵: git switch -c hotfix/1.0.1 v1.0.0.
راهحل
git config --global user.name "Ali"git config --global user.email "ali@example.com"git config --global init.defaultBranch maincat > ~/set-msg.sh <<'EOF'#!/bin/shprintf '%s\n' "$MSG" > "$1"EOFchmod +x ~/set-msg.shmkdir -p ~/gitlab/quiz2 && cd ~/gitlab/quiz2 && git init -qprintf 'title: Shop\nbody: welcome\nfooter: Copyrigth 2026\n' > index.htmlgit add index.html && git commit -qm "Add homepage"echo "<!-- v1 -->" >> index.html && git commit -qam "Add version comment"echo "== ۲) وسط کار و باگ فوری"git switch -qc feature/bodysed -i 's/^body: welcome/body: welcome to the shop/' index.htmlgit stash -qgit switch -q mainsed -i 's/Copyrigth/Copyright/' index.html && git commit -qam "Fix footer typo"git switch -q feature/bodygit stash pop -qgit status -secho "== ۳) conflict"git commit -qam "Extend body text"git switch -q mainsed -i 's/^body: welcome$/body: hello there/' index.html && git commit -qam "Change body on main"git merge feature/body 2>&1 | tail -1printf 'title: Shop\nbody: hello there, welcome to the shop\nfooter: Copyright 2026\n<!-- v1 -->\n' > index.htmlgit add index.html && git commit -q --no-editecho "== ۴) squash"git switch -qc feature/wipfor i in 1 2 3; do echo "<!-- wip $i -->" >> index.html; git commit -qam "wip $i"; doneGIT_SEQUENCE_EDITOR="sed -i '2s/^pick/squash/;3s/^pick/squash/'" MSG="Add wip markers" GIT_EDITOR=~/set-msg.sh git rebase -q -i HEAD~3git switch -q main && git merge -q feature/wipecho "== ۵) tag و hotfix"git tag -a v1.0.0 -m "Release 1.0.0"echo "<!-- next feature -->" >> index.html && git commit -qam "Start next feature"git switch -qc hotfix/1.0.1 v1.0.0sed -i 's/^title: Shop/title: Loop Shop/' index.html && git commit -qam "Fix title"git tag -a v1.0.1 -m "Hotfix 1.0.1"echo "== ۶) گراف نهایی"git log --oneline --graph --all --decoratecd ~ && rm -rf ~/gitlab ~/.gitconfig ~/set-msg.sh== ۲) وسط کار و باگ فوری M index.html== ۳) conflictAutomatic merge failed; fix conflicts and then commit the result.== ۴) squash[detached HEAD 511a50e] Add wip markers Date: Sun Oct 4 08:32:44 2026 +0000 1 file changed, 3 insertions(+)== ۵) tag و hotfix== ۶) گراف نهایی* 9696e86 (HEAD -> hotfix/1.0.1, tag: v1.0.1) Fix title| * ddd5f49 (main) Start next feature|/* 511a50e (tag: v1.0.0, feature/wip) Add wip markers* 85ded06 Merge branch 'feature/body'|\| * a29d719 (feature/body) Extend body text* | 2bbd5e5 Change body on main* | 487fea4 Fix footer typo|/* df9d274 Add version comment* f8819e3 Add homepage