این آزمون شش درس بخش «مبانی» را میسنجد. جواب هر سؤال همان لحظه با توضیح نشان داده میشود و نتیجهات در همین مرورگر ذخیره میشود (پیشرفت من).
توزیعشده بودن Git یعنی چه؟
برای همین هر کلون یک بکاپ کامل است.
فرق Git و GitHub؟
Git بدون GitHub هم کامل کار میکند.
اگر پوشهی .git را پاک کنی؟
تمام commit ها داخل .git هستند.
پیام «Author identity unknown» یعنی چه؟
هر commit نویسنده میخواهد.
اگر user.email را هم در ~/.gitconfig و هم در .git/config تنظیم کنی، داخل آن مخزن کدام استفاده میشود؟
اولویت: local ← global ← system.
مسیر درست یک تغییر در Git؟
add از پوشهی کاری به staging میبرد؛ commit از staging به مخزن.
git add -u چه فایلهایی را آماده میکند؟
-A و . برای همه (جدیدها هم).
پس از ویرایش فایل، git add و دوباره ویرایش، git status -s چه نشان میدهد؟
add محتوای آن لحظه را ذخیره میکند.
کدام پیام commit بهتر است؟
عنوان کوتاه، فعل امری، چه چیزی عوض شد.
git diff --staged چه چیزی را مقایسه میکند؟
git diff بدون آرگومان کاری را با staging مقایسه میکند.
کدام دستور commit هایی را پیدا میکند که متنی را (مثلاً «0.9») به کد اضافه یا از آن حذف کردهاند؟
--grep در پیامهاست؛ -S در تغییر کد (pickaxe).
HEAD~2 یعنی؟
HEAD~1 والد؛ HEAD~2 والدِ والد.
git restore --staged فایل چه میکند؟
بیخطر؛ فقط ناحیهی staging را عوض میکند.
تفاوت reset --soft و --hard؟
soft ← شاخه؛ mixed ← شاخه و staging؛ hard ← هر سه.
یک commit را push کردهای و دیگران گرفتهاند. حالا اشتباه بودنش مشخص شده. کدام روش امن است؟
reset و amend تاریخچه را بازنویسی میکنند؛ revert فقط اضافه میکند.
بعد از «git reset --hard HEAD~2»، commit های کنارگذاشتهشده را چطور برمیگردانی؟
commit های ثبتشده در reflog میمانند (تغییر commit نشده نه).
فایل .env را بعد از commit شدن به .gitignore اضافه کردی. چه میشود؟
.gitignore فقط روی فایلهای untracked اثر دارد.
چرا «build/» و سپس «!build/README.md» کار نمیکند؟
نمیشود فایلی را از پوشهی ignoreشده بازگرداند.
با آنچه در این بخش آموختی، یک مخزن تازه بساز و این مراحل را بهترتیب انجام بده:
۱. نام و ایمیل و شاخهی پیشفرض main را تنظیم کن (git config --global)، یک مخزن به نام quiz1 بساز و قبل از هر چیز یک .gitignore بنویس که node_modules/، *.log و .env را نادیده بگیرد؛ همان را commit کن.
۲. فایلهای app.js، .env (یک رمز ساختگی)، node_modules/x/index.js و debug.log را بساز. ثابت کن git status -s فقط app.js را نشان میدهد؛ تلاش کن .env را با git add .env اضافه کنی و خطای Git را ببین. بعد app.js را commit کن.
۳. پیام آن commit را (عمداً با یک غلط تایپی نوشته بودی) با --amend درست کن و نشان بده شناسهی commit عوض شد.
۴. فایل feature.js را (با یک «باگ» در آن) در یک commit جدا اضافه کن؛ بعد فرض کن این commit به اشتراک گذاشته شده و آن را با git revert خنثی کن.
۵. ثابت کن: (الف) git log --oneline یک تاریخچهی خوانا دارد، (ب) .env هرگز در هیچ commit ای نبوده، و (ج) با git log -S پیدا کن کدام commit کلمهی «bug» را اضافه کرده است.
۶. همهچیز را پاک کن.
راهنمایی
برای (ب): git log --all -- .env باید خالی باشد و git ls-files نباید .env را نشان دهد. برای ۴: git revert --no-edit HEAD. برای بررسی اینکه ignore شده: git check-ignore -v .env.
راهحل
git config --global user.name "Ali"git config --global user.email "ali@example.com"git config --global init.defaultBranch mainmkdir -p ~/gitlab/quiz1 && cd ~/gitlab/quiz1 && git init -qprintf 'node_modules/\n*.log\n.env\n' > .gitignoregit add .gitignore && git commit -qm "Add .gitignore"echo "== ۲) فایلها و ignore"echo "console.log('hi')" > app.jsecho "DB_PASSWORD=fake-123" > .envmkdir -p node_modules/x && echo m > node_modules/x/index.jsecho "oops" > debug.loggit status -sgit add .env 2>&1 | head -3git add app.js && git commit -qm "Add app entry piont"echo "== ۳) اصلاح پیام"git log --oneline -1git commit --amend -qm "Add app entry point"git log --oneline -1echo "== ۴) فایل باگدار و revert"echo "const bug = true" > feature.jsgit add feature.js && git commit -qm "Add feature"git revert --no-edit HEAD > /dev/nullecho "== ۵) بررسی"git log --onelineecho "-- .env در تاریخچه؟ (باید خالی باشد):"git log --all --oneline -- .envecho "-- فایلهای tracked:"; git ls-filesecho "-- commit ای که «bug» را اضافه کرد:"git log -S"bug" --format='%h %s'echo "== ۶) پاکسازی"cd ~ && rm -rf ~/gitlab ~/.gitconfig== ۲) فایلها و ignore?? app.jsThe following paths are ignored by one of your .gitignore files:.envhint: Use -f if you really want to add them.== ۳) اصلاح پیام855f4d0 Add app entry piont30a51c3 Add app entry point== ۴) فایل باگدار و revert== ۵) بررسی6f6f8c2 Revert "Add feature"a9b0ef3 Add feature30a51c3 Add app entry pointf639119 Add .gitignore-- .env در تاریخچه؟ (باید خالی باشد):-- فایلهای tracked:.gitignoreapp.js-- commit ای که «bug» را اضافه کرد:6f6f8c2 Revert "Add feature"a9b0ef3 Add feature== ۶) پاکسازیدقت کن git log -S"bug" هر دو commit را نشان میدهد: آنکه «bug» را اضافه کرد (Add feature، پایینتر و قدیمیتر) و آنکه حذفش کرد (Revert)؛ چون -S هر commit ای را که تعداد آن متن را عوض کرده پیدا میکند.