היסטוריה ו-log

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

git log - צפייה בהיסטוריה

git log                          # היסטוריה מלאה
git log --oneline                # שורה אחת לכל commit
git log --graph                  # ייצוג גרפי של branches
git log --all                    # מכל ה-branches
git log -n 5                     # 5 commits אחרונים
git log -p                       # עם ה-diff המלא של כל commit
git log --stat                   # סיכום שינויים (כמה שורות בכל קובץ)

הצירוף הפופולרי

git log --all --decorate --oneline --graph

נותן תצוגה יפה של כל ה-branches יחד. אפשר לקצר ל-git log --adog.

סינון לפי קריטריונים

git log --since="2 weeks"            # לפי תאריך
git log --until="2025-01-01"
git log --author="Nafi"              # לפי מחבר
git log --grep="login"               # חיפוש בהודעות commit
git log file.js                      # היסטוריה של קובץ ספציפי
git log -p file.js                   # עם diff מלא לקובץ
git log -S "functionName"            # חיפוש מתי שורה הוספה / נמחקה

git show - מידע על commit ספציפי

git show                  # ה-commit האחרון (HEAD)
git show HEAD             # אותו דבר
git show HEAD~1           # commit אחד אחורה
git show HEAD~3           # 3 commits אחורה
git show a3f5c2d          # לפי SHA חלקי
git show main             # ה-commit שאליו main מצביע

הפלט מציג: - מי המחבר ומתי - הודעת ה-commit - ה-diff המלא של מה שהשתנה

git diff - השוואות

git diff                          # working directory מול staging
git diff --staged                 # staging מול ה-commit האחרון
git diff --cached                 # זהה ל---staged
git diff HEAD                     # working directory מול ה-commit האחרון
git diff main feature/login       # השוואה בין branches
git diff a3f5c2d b8e7f1a          # השוואה בין שני commits
git diff HEAD~3 HEAD              # השוואה בין נקודות בהיסטוריה
git diff main -- file.js          # השוואה של קובץ ספציפי בלבד

git blame - מי שינה כל שורה

git blame file.js
git blame -L 10,20 file.js        # רק שורות 10-20

הפלט מציג ליד כל שורה את ה-SHA, המחבר והתאריך של ה-commit שהוסיף את השורה. שימושי כשרוצים להבין למה קוד מסוים נכתב.

git grep - חיפוש בקבצי המאגר

git grep "TODO"                   # חיפוש בכל הקבצים tracked
git grep -n "TODO"                # עם מספרי שורה
git grep "useState" -- "*.jsx"    # רק בקבצי jsx
git grep "useState" HEAD~3        # חיפוש בנקודה היסטורית

reflog - ההצלה האחרונה

git reflog

reflog מציג את כל הפעולות שעשיתם ב-HEAD - גם פעולות שהיו "destructive" (כמו git reset --hard). אם בטעות מחקתם commits, אתם כמעט תמיד יכולים לשחזר אותם דרך reflog:

git reflog
# ...
# a3f5c2d HEAD@{2}: commit: Add important feature
# ...
git reset --hard a3f5c2d

דוגמאות מעשיות

"מי הוסיף את השורה הזו ולמה?"

git blame -L 50,55 src/auth.js
# מוצאים SHA, ואז:
git show a3f5c2d

"איפה ההודעה 'fix login' הופיעה?"

git log --grep="fix login" --oneline

"מה השתנה השבוע?"

git log --since="1 week ago" --oneline --author="Nafi"

בדקו את עצמכם

נסו לענות לבד לפני שאתם פותחים את התשובה.

  1. מה מציג git log --oneline?

    1. את הקוד
    2. רשימה מקוצרת של ה-commits, שורה לכל אחד
    3. שגיאות
    4. את הענפים בלבד
    הצגת התשובה

    תשובה ב. hash מקוצר והודעה.

  2. איך מוצאים commit שאבד אחרי reset?

    1. אי אפשר
    2. git reflog מציג את כל התנועות של HEAD
    3. git diff
    4. git status
    הצגת התשובה

    תשובה ב. reflog הוא רשת הביטחון המקומית.