رفتن به محتوا
LoopX

آزمون بخش ۲: شاخه‌ها

این آزمون پنج درس بخش «شاخه‌ها» را می‌سنجد. جواب هر سؤال همان لحظه با توضیح نشان داده می‌شود و نتیجه‌ات در همین مرورگر ذخیره می‌شود (پیشرفت من).

؟ آزمون بخش ۲
  1. ساختن یک شاخه‌ی جدید در Git چقدر هزینه دارد؟

  2. کدام دستور شاخه‌ی جدید می‌سازد و همان لحظه به آن می‌رود؟

  3. ادغام fast-forward چه زمانی انجام می‌شود؟

  4. git branch -d چه فرقی با -D دارد؟

  5. روی detached HEAD چند commit زده‌ای. چطور نگهشان می‌داری؟

  6. علامت «<<<<<<< HEAD» تا «=======» در conflict مال کدام طرف است؟

  7. بعد از حل کردن فایل conflict دار چه باید کرد؟

  8. git merge --abort چه می‌کند؟

  9. git rebase main (روی شاخه‌ی feature) چه می‌کند؟

  10. قانون طلایی rebase؟

  11. در rebase تعاملی، تفاوت squash و fixup؟

  12. بعد از rebase یک شاخه‌ی شخصی که قبلاً push شده، کدام push درست است؟

  13. git stash به‌صورت پیش‌فرض چه چیزی را کنار نمی‌گذارد؟

  14. git stash pop با conflict تمام شد. stash چه می‌شود؟

  15. در SemVer، افزودن یک ویژگی جدید که با قبل سازگار است کدام بخش را بالا می‌برد؟

  16. آیا git push معمولی tag ها را به سرور می‌فرستد؟

  17. تفاوت اصلی tag و branch؟

🏁 چالش: یک هفته‌ی کاری شبیه‌سازی‌شدهسخت

با آنچه در این بخش آموختی، چرخه‌ی کار یک برنامه‌نویس را شبیه‌سازی کن:

۱. مخزن 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.

راه‌حل
Terminal window
git config --global user.name "Ali"
git config --global user.email "ali@example.com"
git config --global init.defaultBranch main
cat > ~/set-msg.sh <<'EOF'
#!/bin/sh
printf '%s\n' "$MSG" > "$1"
EOF
chmod +x ~/set-msg.sh
mkdir -p ~/gitlab/quiz2 && cd ~/gitlab/quiz2 && git init -q
printf 'title: Shop\nbody: welcome\nfooter: Copyrigth 2026\n' > index.html
git add index.html && git commit -qm "Add homepage"
echo "<!-- v1 -->" >> index.html && git commit -qam "Add version comment"
echo "== ۲) وسط کار و باگ فوری"
git switch -qc feature/body
sed -i 's/^body: welcome/body: welcome to the shop/' index.html
git stash -q
git switch -q main
sed -i 's/Copyrigth/Copyright/' index.html && git commit -qam "Fix footer typo"
git switch -q feature/body
git stash pop -q
git status -s
echo "== ۳) conflict"
git commit -qam "Extend body text"
git switch -q main
sed -i 's/^body: welcome$/body: hello there/' index.html && git commit -qam "Change body on main"
git merge feature/body 2>&1 | tail -1
printf 'title: Shop\nbody: hello there, welcome to the shop\nfooter: Copyright 2026\n<!-- v1 -->\n' > index.html
git add index.html && git commit -q --no-edit
echo "== ۴) squash"
git switch -qc feature/wip
for i in 1 2 3; do echo "<!-- wip $i -->" >> index.html; git commit -qam "wip $i"; done
GIT_SEQUENCE_EDITOR="sed -i '2s/^pick/squash/;3s/^pick/squash/'" MSG="Add wip markers" GIT_EDITOR=~/set-msg.sh git rebase -q -i HEAD~3
git switch -q main && git merge -q feature/wip
echo "== ۵) 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.0
sed -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 --decorate
cd ~ && rm -rf ~/gitlab ~/.gitconfig ~/set-msg.sh
خروجی
== ۲) وسط کار و باگ فوری
M index.html
== ۳) conflict
Automatic 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