Claude Code בעברית
ההתקדמות שלכם בקורס0 מתוך 14 פרקים

פרק 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, אפשר לדלג להגדרה. אם לא:

Windows PowerShell
winget install Git.Git

או הורידו את Git for Windows והתקינו עם ברירות המחדל.

אחרי ההתקנה סגרו ופתחו את הטרמינל, ובדקו שוב עם 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. ככה נראה הפלט שלה:

git status (פלט לדוגמה)
On branch main
Changes not staged for commit:
        modified:   app/page.tsx
        modified:   lib/recipes.ts
 
Untracked files:
        components/SearchBar.tsx

modified אומר שקובץ קיים השתנה, ו-Untracked אומר שזה קובץ חדש ש-Git עוד לא מכיר.

הודעות שמירה שאומרות משהו

הודעת השמירה היא מכתב לעצמכם בעתיד. בעוד חודש, כשתחפשו "מתי שברנו את החיפוש?", ההודעות הן מה שיעזור לכם למצוא.

בקשה חלשה

תעשה commit

בקשה חזקה

תסתכל על כל השינויים ותשמור אותם ב-git. ההודעה צריכה להתחיל בשורה קצרה שמתארת מה השתנה ולמה, ואחריה רשימה קצרה של השינויים העיקריים. אם יש שינויים שלא קשורים זה לזה, תפצל אותם לכמה שמירות נפרדות.

שמירה לכל נושא, עם הודעה ברורה, הופכת את ההיסטוריה ליומן קריא. ״commit״ בלי הנחיות מקבל לרוב הודעה כללית כמו ״update files״.

ככה נראות הודעות טובות מול הודעות חלשות:

הודעות חלשות
update
fix
changes
asdf
הודעות טובות
Add search and category filter to home page
Fix servings calculator rounding to 1 decimal
Increase ingredient list font size for readability

מסתכלים על ההיסטוריה

תראה לי את 10 השמירות האחרונות, ותסביר בקצרה מה קרה בכל אחת

git log --oneline (פלט לדוגמה)
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, תעבור אליו, ותגיד לי כשאפשר להתחיל

מה Claude מריץ (לדוגמה)
$ 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 עשה בשיחה הנוכחית.

בתוך Claude Code
/diff

3. לבקש מ-Claude סיכום, וזו הדרך הכי שימושית כשיש הרבה שינויים:

תשווה את הענף הנוכחי ל-main, ותסכם לי: אילו קבצים השתנו, מה הפיצ'ר עושה עכשיו, ומה יכול להישבר בגלל השינויים האלה. תהיה כן, גם אם זה קוד שאתה כתבת

ככה נראה diff גולמי, למקרה שתרצו להציץ:

git diff main (פלט לדוגמה)
--- 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

מה צריך

  1. חשבון GitHub: נרשמים בחינם ב-github.com. את זה עושים בעצמכם.
  2. GitHub CLI (gh): כלי שמאפשר ל-Claude לעבוד מול GitHub, כלומר ליצור מאגרים ו-Pull Requests:
Windows PowerShell
winget install GitHub.cli
  1. התחברות: בטרמינל רגיל (לא בתוך 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ענף חדש מתוך maingit switch -c feature/favorites
2עבודה ושמירות, כמה פעמיםgit commit
3דחיפת הענף ל-GitHubgit push -u origin feature/favorites
4פתיחת PRgh 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.

תיאור טוב הופך את ה-PR למסמך שאפשר לחזור אליו. ״תראה לי לפני״ נותן לכם הזדמנות לתקן לפני שזה מתפרסם.

סקירת קוד: Claude בודק את Claude

הנה שלוש דרכים לקבל סקירה, מהפשוטה לרשמית:

1. בקשה רגילה, בשיחה חדשה. אחרי /clear, Claude מסתכל על השינויים בעיניים רעננות, בלי להיות קשור לקוד שהוא עצמו כתב:

תסקור את השינויים בענף הנוכחי לעומת main כמו מפתח בכיר וקפדן. תחפש באגים, מקרי קצה שלא טופלו, בעיות נגישות ובעיות בתצוגה בטלפון. תציג רשימה לפי חומרה, עם הפניה לקובץ ולשורה, ועוד בלי לתקן

2. הפקודה המובנית /code-review (או בקיצור /review): סוקרת את השינויים הנוכחיים ומחפשת באגים, בסוכן נפרד עם הקשר נקי.

בתוך Claude Code
/code-review

אפשר גם לסקור PR לפי המספר שלו, למשל /code-review 3, ולהוסיף --comment כדי שההערות יפורסמו ישירות ב-PR ב-GitHub.

3. סקירת אבטחה עם /security-review: בודקת את השינויים בענף מול main ומחפשת בעיות אבטחה, כמו מידע רגיש שנחשף או קלט שלא נבדק. מומלץ במיוחד לפני מיזוג של כל דבר שקשור לטפסים, להתחברות או לשמירת מידע.

בתוך Claude Code
/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

CLAUDE.md
## Git
- אף פעם לא git push --force, ואף פעם לא push ישירות ל-main.
- כל פיצ'ר בענף משלו, ומיזוג ל-main רק דרך Pull Request.
- לפני פקודה שמוחקת שינויים (reset, clean, restore), תעצור ותשאל.
- הודעות commit באנגלית, שורה ראשונה קצרה שמתארת מה ולמה.

זה משפיע מאוד על ההתנהגות של Claude, אבל זו הנחיה, לא נעילה. בשביל נעילה אמיתית צריך את השכבות הבאות.

שכבה 3: חוקי הרשאות ב-Claude Code

בקובץ ההגדרות של הפרויקט אפשר לקבוע פקודות ש-Claude Code חוסם תמיד (deny), ופקודות שעליהן הוא תמיד שואל (ask), בכל מצב הרשאות, גם במצב האוטומטי:

.claude/settings.json
{
  "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:

  1. לחצו על Settings (בתפריט העליון של המאגר).
  2. בתפריט הצד, תחת Code and automation, בחרו Rules → Rulesets.
  3. לחצו New ruleset → New branch ruleset.
  4. תנו שם, למשל protect-main, ושנו את Enforcement status ל-Active.
  5. תחת Target branches לחצו Add target → Include default branch.
  6. סמנו את החוקים:
    • Restrict deletions: אי אפשר למחוק את main.
    • Block force pushes: אי אפשר לדרוס את main.
    • Require a pull request before merging: שינויים נכנסים ל-main רק דרך PR.
  7. לחצו Create.

מעכשיו, אם מישהו ינסה לדחוף בכוח ל-main, GitHub יסרב:

ניסיון force push ל-main מוגן (פלט לדוגמה)
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) ונוסיף לו מועדפים: כפתור לב בכל כרטיס מתכון, ודף שמציג רק את המתכונים שסומנו.

  1. חגורות בטיחות: צרו את .claude/settings.json עם חוקי ה-deny וה-ask מחלק 6, והוסיפו ל-CLAUDE.md את כללי ה-Git.
  2. GitHub: אם המאגר עוד לא ב-GitHub, צרו אותו ודחפו את main (חלק 4).
  3. ענף: בקשו מ-Claude ליצור את feature/favorites.
  4. עבודה: בקשו את הפיצ'ר:

תוסיף כפתור לב בכל כרטיס מתכון ובדף המתכון, שמסמן את המתכון כמועדף. המועדפים יישמרו בדפדפן. תוסיף לכותרת קישור ״המועדפים שלי״ לדף שמציג רק את המתכונים שסומנו, ואם אין מועדפים, הודעה ידידותית. תשמור כל שלב בשמירה נפרדת עם הודעה ברורה

  1. בדיקה: בדפדפן, ובסיכום של Claude לשינויים לעומת main (חלק 3).
  2. PR: בקשו לדחוף ולפתוח Pull Request עם תיאור מלא.
  3. סקירה: הריצו /code-review, ותקנו את מה שחשוב.
  4. מיזוג: מזגו בעצמכם ב-GitHub, ואז בקשו מ-Claude לעדכן את main במחשב.
  5. מבחן ההגנה (רק אם הפעלתם הגנה ב-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?

פתרון כל שאלות החידון מסמן את הפרק כהושלם אוטומטית.