פרק 8
ניהול גרסאות, Git ו-GitHub עם Claude Code
בפרקים הקודמים ביקשנו מ-Claude שוב ושוב "תשמור את המצב הנוכחי ב-git", והבטחנו להסביר בהמשך. הגיע הזמן.
Git הוא כמו כפתור "שמירת משחק" לפרויקט שלכם. בכל פעם ששומרים, Git זוכר בדיוק איך נראה כל קובץ באותו רגע. אם משהו נשבר אחר כך, אפשר לחזור לכל נקודת שמירה קודמת. GitHub הוא אתר ששומר עותק של הפרויקט בענן, כדי שלא ילך לאיבוד, כדי שתוכלו לשתף אותו עם אחרים, וכדי שאפשר יהיה להעלות אותו לאוויר (פרק 9).
החדשות הטובות: לא צריך לזכור פקודות Git. Claude מכיר אותן מצוין. אתם צריכים להבין מה אתם רוצים, וממה להיזהר.
מילון קצר
| מושג | באנגלית | מה זה, בפשטות |
|---|---|---|
| מאגר | Repository (Repo) | תיקיית פרויקט ש-Git עוקב אחריה |
| שמירה | Commit | נקודת שמירה עם הודעה קצרה שמתארת מה השתנה |
| ענף | Branch | עותק מקביל של הפרויקט שבו אפשר לנסות דברים בלי לגעת בגרסה הראשית |
| הענף הראשי | main | הגרסה ה"רשמית" של הפרויקט, זו שעולה לאוויר |
| הבדלים | Diff | רשימה של מה בדיוק השתנה: שורות שנוספו ושורות שנמחקו |
| מאגר מרוחק | Remote | העותק של הפרויקט ב-GitHub |
| דחיפה | Push | שליחת השמירות מהמחשב שלכם ל-GitHub |
| משיכה | Pull | הורדת שינויים מ-GitHub למחשב שלכם |
| בקשת מיזוג | Pull Request (PR) | הצעה רשמית לאחד ענף לתוך main, עם אפשרות לסקור ולהגיב לפני האיחוד |
| מיזוג | Merge | איחוד השינויים מענף אחד לתוך ענף אחר |
שלב 0: מתקינים ומגדירים את Git
בודקים אם Git כבר מותקן
git --versionאם מופיע משהו כמו git version 2.47.0, אפשר לדלג להגדרה. אם לא:
winget install Git.Gitאו הורידו את Git for Windows והתקינו עם ברירות המחדל.
winget install Git.Gitאו הורידו את Git for Windows והתקינו עם ברירות המחדל.
ב-Mac, הפקודה הזאת מציעה להתקין את כלי הפיתוח של Apple, שכוללים את Git:
xcode-select --installב-Linux (Ubuntu / Debian):
sudo apt install gitאחרי ההתקנה סגרו ופתחו את הטרמינל, ובדקו שוב עם git --version.
אומרים ל-Git מי אתם
כל שמירה ב-Git חתומה בשם ובאימייל. את זה מגדירים פעם אחת במחשב. עשו את זה בעצמכם, בטרמינל רגיל, עם הפרטים שלכם:
git config --global user.name "השם שלכם"
git config --global user.email "your-email@example.com"חלק 1: שמירות והודעות מסודרות
מתחילים מאגר
פרויקט Next.js (כמו בפרק 6) כבר מגיע עם Git. בכל פרויקט אחר, בקשו:
תאתחל git בתיקייה הזאת, תוודא שיש קובץ .gitignore מתאים לפרויקט (בלי node_modules ובלי קבצי .env), ותשמור את המצב הנוכחי כנקודת התחלה
"מה השתנה?"
לפני ששומרים, תמיד כדאי לדעת מה הולך להישמר:
מה השתנה מאז השמירה האחרונה? תסכם לי בעברית, קובץ אחרי קובץ, במשפט אחד לכל קובץ
מאחורי הקלעים Claude יריץ פקודה כמו git status. ככה נראה הפלט שלה:
On branch main
Changes not staged for commit:
modified: app/page.tsx
modified: lib/recipes.ts
Untracked files:
components/SearchBar.tsxmodified אומר שקובץ קיים השתנה, ו-Untracked אומר שזה קובץ חדש ש-Git עוד לא מכיר.
הודעות שמירה שאומרות משהו
הודעת השמירה היא מכתב לעצמכם בעתיד. בעוד חודש, כשתחפשו "מתי שברנו את החיפוש?", ההודעות הן מה שיעזור לכם למצוא.
בקשה חלשה
תעשה commit
בקשה חזקה
תסתכל על כל השינויים ותשמור אותם ב-git. ההודעה צריכה להתחיל בשורה קצרה שמתארת מה השתנה ולמה, ואחריה רשימה קצרה של השינויים העיקריים. אם יש שינויים שלא קשורים זה לזה, תפצל אותם לכמה שמירות נפרדות.
ככה נראות הודעות טובות מול הודעות חלשות:
update
fix
changes
asdfAdd search and category filter to home page
Fix servings calculator rounding to 1 decimal
Increase ingredient list font size for readabilityמסתכלים על ההיסטוריה
תראה לי את 10 השמירות האחרונות, ותסביר בקצרה מה קרה בכל אחת
a3f9c21 Add search and category filter to home page
7be4d10 Add recipe page with ingredients and steps
19c0e85 Set up Hebrew RTL layout and Rubik font
e6d2b47 Initial commit from Create Next Appכל שורה היא נקודת שמירה. המספר המוזר בהתחלה הוא ה"מזהה" שלה. לא צריך לזכור אותו, אבל אפשר לבקש לפיו: "מה השתנה בשמירה 7be4d10?".
חלק 2: ענפים, מקום בטוח לנסות
למה לעבוד בענף?
נניח שאתם רוצים לנסות עיצוב חדש לגמרי לאתר. אם תעבדו ישר על main ותתחרטו באמצע, יהיה לכם בלגן. בענף נפרד, main נשאר בדיוק כמו שהוא, ואם הניסוי לא הצליח, פשוט זורקים את הענף.
כלל אצבע: כל פיצ'ר חדש או ניסוי, בענף משלו.
אני רוצה להוסיף לאתר אפשרות לסמן מתכונים כמועדפים. תיצור ענף חדש בשם feature/favorites מתוך main, תעבור אליו, ותגיד לי כשאפשר להתחיל
$ git switch -c feature/favorites
Switched to a new branch 'feature/favorites'עכשיו כל העבודה נשמרת בענף feature/favorites. שם הענף הנוכחי מופיע גם בפינה התחתונה של Cursor, כך שתמיד רואים איפה אתם.
עוברים בין ענפים
תשמור את מה שעשינו בענף הזה, ותחזיר אותי ל-main. אני רוצה לראות שהאתר המקורי לא השתנה
רעננו את הדפדפן: האתר חזר למצב של main. בקשו לחזור ל-feature/favorites, והשינויים יחזרו. זה הקסם של ענפים.
חלק 3: לראות בדיוק מה השתנה
לפני שמשהו נכנס ל-main, צריך לדעת בדיוק מה הוא. יש שלוש דרכים, מהוויזואלית לטקסטואלית:
1. Source Control ב-Cursor (Ctrl + Shift + G): רשימת קבצים, והשוואה צד-לצד בלחיצה. הכי נוח לעין, כמו שלמדנו בפרק 5.
2. הפקודה /diff בתוך Claude Code: מציגה את כל השינויים בתיקייה, כולל אלה שClaude עשה בשיחה הנוכחית.
/diff3. לבקש מ-Claude סיכום, וזו הדרך הכי שימושית כשיש הרבה שינויים:
תשווה את הענף הנוכחי ל-main, ותסכם לי: אילו קבצים השתנו, מה הפיצ'ר עושה עכשיו, ומה יכול להישבר בגלל השינויים האלה. תהיה כן, גם אם זה קוד שאתה כתבת
ככה נראה diff גולמי, למקרה שתרצו להציץ:
--- a/components/RecipeCard.tsx
+++ b/components/RecipeCard.tsx
@@ -12,6 +12,10 @@ export function RecipeCard({ recipe }: Props) {
<h3 className="text-xl font-bold">{recipe.title}</h3>
+ <FavoriteButton slug={recipe.slug} />
<p className="text-gray-600">{recipe.time} דקות</p>
- <span>{recipe.category}</span>
+ <span className="rounded-full px-3">{recipe.category}</span>שורות עם + נוספו, שורות עם - נמחקו. השורות בלי סימן הן הקשר, כדי שתבינו איפה זה קורה.
חלק 4: מעלים ל-GitHub
מה צריך
- חשבון GitHub: נרשמים בחינם ב-github.com. את זה עושים בעצמכם.
- GitHub CLI (
gh): כלי שמאפשר ל-Claude לעבוד מול GitHub, כלומר ליצור מאגרים ו-Pull Requests:
winget install GitHub.cliwinget install GitHub.clibrew install ghב-Linux, ההוראות לכל הפצה נמצאות ב-cli.github.com.
- התחברות: בטרמינל רגיל (לא בתוך Claude), הריצו את הפקודה הזאת ועקבו אחרי ההוראות. היא תפתח דפדפן לאישור:
gh auth loginיוצרים מאגר ב-GitHub ודוחפים
תיצור מאגר פרטי חדש ב-GitHub בשם grandma-recipes בעזרת gh, תחבר אותו לפרויקט הזה, ותדחוף את הענף main. בסוף תן לי את הקישור למאגר
✓ Created repository your-username/grandma-recipes on GitHub
https://github.com/your-username/grandma-recipes
✓ Added remote https://github.com/your-username/grandma-recipes.git
✓ Pushed commits to https://github.com/your-username/grandma-recipes.gitפתחו את הקישור בדפדפן: כל הקבצים שלכם נמצאים שם.
חלק 5: Pull Requests וסקירת קוד
מה זה Pull Request, ולמה צריך אותו אם עובדים לבד?
Pull Request (או PR) הוא בקשה רשמית: "הנה ענף עם שינויים, אני מציע לאחד אותו לתוך main". ב-GitHub הוא מקבל דף משלו, עם תיאור, עם כל השינויים ועם מקום להערות.
גם כשעובדים לבד, PR הוא עצירה מכוונת לפני שמשהו נכנס לגרסה הרשמית: מקום לסקור, להריץ בדיקות ולחשוב פעם נוספת. ובפרק 9, כשהאתר יהיה מחובר ל-Vercel, כל PR יקבל גם כתובת תצוגה מקדימה משלו, ותוכלו לראות את השינוי באוויר לפני שהוא מגיע לאתר האמיתי.
התהליך המלא
| # | שלב | הפקודה שתראו |
|---|---|---|
| 1 | ענף חדש מתוך main | git switch -c feature/favorites |
| 2 | עבודה ושמירות, כמה פעמים | git commit |
| 3 | דחיפת הענף ל-GitHub | git push -u origin feature/favorites |
| 4 | פתיחת PR | gh pr create |
| 5 | סקירה ותיקונים | /code-review, ועוד שמירות לפי הצורך |
| 6 | מיזוג ל-main | כפתור Merge ב-GitHub |
| 7 | עדכון main במחשב | git switch main ואז git pull |
לא צריך להקליד אף אחת מהפקודות האלה. הן כאן כדי שתזהו אותן בבקשות האישור של Claude.
פותחים PR
כשהפיצ'ר מוכן ושמור בענף:
הפיצ'ר של המועדפים מוכן. תדחוף את הענף ל-GitHub ותפתח Pull Request ל-main. בתיאור: מה הפיצ'ר עושה, למה הוספנו אותו, אילו קבצים השתנו, ואיך לבדוק אותו ידנית צעד אחר צעד. אם יש סיכונים או דברים שלא בדקת, תכתוב גם אותם
Claude ישתמש ב-gh pr create, ובסוף יחזיר קישור לדף ה-PR:
Creating pull request for feature/favorites into main in your-username/grandma-recipes
https://github.com/your-username/grandma-recipes/pull/3בקשה חלשה
תפתח PR
בקשה חזקה
תפתח PR ל-main. בתיאור: מה השתנה ולמה, איך לבדוק ידנית, ומה הסיכונים. בסוף תראה לי את התיאור לפני שאתה יוצר את ה-PR.
סקירת קוד: Claude בודק את Claude
הנה שלוש דרכים לקבל סקירה, מהפשוטה לרשמית:
1. בקשה רגילה, בשיחה חדשה. אחרי /clear, Claude מסתכל על השינויים בעיניים רעננות, בלי להיות קשור לקוד שהוא עצמו כתב:
תסקור את השינויים בענף הנוכחי לעומת main כמו מפתח בכיר וקפדן. תחפש באגים, מקרי קצה שלא טופלו, בעיות נגישות ובעיות בתצוגה בטלפון. תציג רשימה לפי חומרה, עם הפניה לקובץ ולשורה, ועוד בלי לתקן
2. הפקודה המובנית /code-review (או בקיצור /review): סוקרת את השינויים הנוכחיים ומחפשת באגים, בסוכן נפרד עם הקשר נקי.
/code-reviewאפשר גם לסקור PR לפי המספר שלו, למשל /code-review 3, ולהוסיף --comment כדי שההערות יפורסמו ישירות ב-PR ב-GitHub.
3. סקירת אבטחה עם /security-review: בודקת את השינויים בענף מול main ומחפשת בעיות אבטחה, כמו מידע רגיש שנחשף או קלט שלא נבדק. מומלץ במיוחד לפני מיזוג של כל דבר שקשור לטפסים, להתחברות או לשמירת מידע.
/security-reviewאחרי הסקירה, מחליטים מה לתקן:
תתקן את הבעיות ברמת חומרה גבוהה ובינונית מהסקירה, תשמור כל תיקון בשמירה נפרדת עם הודעה ברורה, ותדחוף לאותו ענף. ה-PR יתעדכן לבד
ממזגים
את המיזוג עשו בעצמכם, ב-GitHub: פתחו את דף ה-PR, עברו על הלשונית Files changed כדי לראות את כל השינויים, ואם הכול טוב, לחצו Merge pull request ואז Confirm merge.
אחרי המיזוג, מעדכנים את המחשב:
מיזגתי את ה-PR ב-GitHub. תחזור ל-main, תמשוך את העדכונים מ-GitHub, ותמחק את הענף המקומי feature/favorites כי הוא כבר מוזג
חלק 6: חגורות בטיחות
Git הוא רשת ביטחון מצוינת, אבל יש כמה פקודות שיכולות לקרוע בה חורים. הנה אילו, ואיך בונים הגנה בכמה שכבות.
הפקודות שצריך להכיר (כדי לא לאשר אותן)
| פקודה | מה היא עושה | למה זה מסוכן |
|---|---|---|
git push --force (או -f) | דוחפת ודורסת את מה שיש ב-GitHub | מוחקת מ-GitHub שמירות שלא קיימות אצלכם, למשל עבודה של מישהו אחר או שמירות ממחשב אחר |
git reset --hard | מחזירה את התיקייה לשמירה קודמת | כל שינוי שלא נשמר נמחק, בלי אפשרות שחזור |
git clean -fd | מוחקת קבצים ש-Git לא מכיר | קבצים חדשים שעוד לא נשמרו נמחקים לגמרי |
git checkout -- . / git restore . | מבטלת את כל השינויים שלא נשמרו | עבודה שלא נשמרה הולכת לאיבוד |
git branch -D | מוחקת ענף גם אם לא מוזג | עבודה שנשמרה רק בענף הזה עלולה ללכת לאיבוד |
git commit --amend אחרי push | משכתבת שמירה שכבר עלתה | ההיסטוריה המקומית וזו שב-GitHub מתפצלות, ואז "צריך" force push |
שכבה 1: העיניים שלכם
במצב ידני (manual), כל פקודה עוברת דרככם, ואתם קוראים לפני שמאשרים, בדיוק כמו בפרק 3.
במצב אוטומטי (auto), מנגנון הבטיחות של Claude Code חוסם כברירת מחדל פקודות מסוכנות כמו force push, git reset --hard ו-git clean -fd. בנוסף, הוא מתייחס לגבולות שאתם מציבים בשיחה. אם תכתבו "אל תדחוף ל-GitHub בלי לשאול אותי", המנגנון יחסום דחיפות עד שתגידו אחרת.
שכבה 2: כללים ב-CLAUDE.md
## Git
- אף פעם לא git push --force, ואף פעם לא push ישירות ל-main.
- כל פיצ'ר בענף משלו, ומיזוג ל-main רק דרך Pull Request.
- לפני פקודה שמוחקת שינויים (reset, clean, restore), תעצור ותשאל.
- הודעות commit באנגלית, שורה ראשונה קצרה שמתארת מה ולמה.זה משפיע מאוד על ההתנהגות של Claude, אבל זו הנחיה, לא נעילה. בשביל נעילה אמיתית צריך את השכבות הבאות.
שכבה 3: חוקי הרשאות ב-Claude Code
בקובץ ההגדרות של הפרויקט אפשר לקבוע פקודות ש-Claude Code חוסם תמיד (deny), ופקודות שעליהן הוא תמיד שואל (ask), בכל מצב הרשאות, גם במצב האוטומטי:
{
"permissions": {
"deny": [
"Bash(git push --force *)",
"Bash(git push -f *)",
"Bash(git push --force-with-lease *)",
"Bash(git reset --hard *)",
"Bash(git clean *)"
],
"ask": [
"Bash(git push *)"
]
}
}deny: הפקודות האלה ייחסמו, נקודה.ask: כלgit pushאחר יבקש את אישורכם, גם במצב אוטומטי.
אפשר גם לבקש מ-Claude ליצור את הקובץ:
תיצור קובץ .claude/settings.json בפרויקט, עם חוקי הרשאות שחוסמים את git push --force, git push -f, git reset --hard ו-git clean, ושמבקשים אישור לפני כל git push אחר. תסביר לי כל שורה
ואת החוקים הקיימים אפשר לראות ולערוך בכל רגע עם הפקודה /permissions.
שכבה 4: הגנה על main ב-GitHub
זו השכבה החזקה ביותר, כי היא נאכפת בשרת של GitHub. לא משנה מי שולח את הפקודה ואיך היא מנוסחת: Claude, אתם, או כל אחד אחר.
בדף המאגר ב-GitHub:
- לחצו על Settings (בתפריט העליון של המאגר).
- בתפריט הצד, תחת Code and automation, בחרו Rules → Rulesets.
- לחצו New ruleset → New branch ruleset.
- תנו שם, למשל
protect-main, ושנו את Enforcement status ל-Active. - תחת Target branches לחצו Add target → Include default branch.
- סמנו את החוקים:
- Restrict deletions: אי אפשר למחוק את main.
- Block force pushes: אי אפשר לדרוס את main.
- Require a pull request before merging: שינויים נכנסים ל-main רק דרך PR.
- לחצו Create.
מעכשיו, אם מישהו ינסה לדחוף בכוח ל-main, GitHub יסרב:
remote: error: GH013: Repository rule violations found for refs/heads/main.
remote: - Cannot force-push to this branch
! [remote rejected] main -> main (push declined due to repository rule violations)ואם בכל זאת משהו נמחק?
Git כמעט אף פעם לא שוכח באמת. גם אחרי reset או מחיקת ענף, שמירות ישנות נשארות זמן מה ביומן פנימי שנקרא reflog. אם קרה משהו:
נראה לי שאיבדתי שמירות. אל תשנה כלום עדיין. תשתמש ב-git reflog כדי למצוא את המצב לפני הפעולה האחרונה, ותסביר לי מה אתה רואה ואיך מומלץ לשחזר
שימו לב ל"אל תשנה כלום עדיין": במצב חירום, הדבר הראשון הוא להבין, ורק אחר כך לפעול.
תרגיל: פיצ'ר מלא בדרך המקצועית
נעבוד על אתר המתכונים מפרק 6 (או על כל פרויקט אחר עם Git) ונוסיף לו מועדפים: כפתור לב בכל כרטיס מתכון, ודף שמציג רק את המתכונים שסומנו.
- חגורות בטיחות: צרו את
.claude/settings.jsonעם חוקי ה-denyוה-askמחלק 6, והוסיפו ל-CLAUDE.md את כללי ה-Git. - GitHub: אם המאגר עוד לא ב-GitHub, צרו אותו ודחפו את main (חלק 4).
- ענף: בקשו מ-Claude ליצור את
feature/favorites. - עבודה: בקשו את הפיצ'ר:
תוסיף כפתור לב בכל כרטיס מתכון ובדף המתכון, שמסמן את המתכון כמועדף. המועדפים יישמרו בדפדפן. תוסיף לכותרת קישור ״המועדפים שלי״ לדף שמציג רק את המתכונים שסומנו, ואם אין מועדפים, הודעה ידידותית. תשמור כל שלב בשמירה נפרדת עם הודעה ברורה
- בדיקה: בדפדפן, ובסיכום של Claude לשינויים לעומת main (חלק 3).
- PR: בקשו לדחוף ולפתוח Pull Request עם תיאור מלא.
- סקירה: הריצו
/code-review, ותקנו את מה שחשוב. - מיזוג: מזגו בעצמכם ב-GitHub, ואז בקשו מ-Claude לעדכן את main במחשב.
- מבחן ההגנה (רק אם הפעלתם הגנה ב-GitHub): בקשו מ-Claude "תנסה לדחוף שינוי קטן ישירות ל-main". GitHub אמור לסרב ולדרוש PR.
סיימתם את התרגיל?
0 מתוך 9
סיכום
- Git שומר נקודות שמירה, ו-GitHub שומר אותן בענן. לא צריך לזכור פקודות: מבקשים מ-Claude, ומבינים מה מאשרים.
- שמירות טובות: נושא אחד בכל שמירה, עם הודעה שמסבירה מה ולמה.
- ענפים לכל פיצ'ר או ניסוי. main נשאר נקי.
- לראות מה השתנה: Source Control ב-Cursor,
/diff, או סיכום מ-Claude. - Pull Request: ענף ← PR עם תיאור ←
/code-reviewו-/security-review← מיזוג שאתם עושים בעצמכם. - ארבע שכבות בטיחות: העיניים שלכם, CLAUDE.md, חוקי
deny/askב-.claude/settings.json, והגנה על main ב-GitHub.
בפרק הבא נעלה את האתר לאוויר ב-Vercel: כל דחיפה ל-main תעדכן את האתר אוטומטית, וכל Pull Request יקבל כתובת תצוגה מקדימה משלו.
בדקו את עצמכם
1. מה השכבה החזקה ביותר נגד force push ל-main?
2. למה כדאי לעבוד בענף ולא ישר על main?
פתרון כל שאלות החידון מסמן את הפרק כהושלם אוטומטית.