Skip to content

Delta: תצוגה נוחה יותר להבדלים ב־Git ובקובצי תצורה

פרסום המקור: . עדכון המקור: . תרגום ובדיקה: .

הפקודות git diff ו־git show עוזרות לבדוק שינויים לפני שמכניסים אותם להיסטוריית המאגר. אבל כששינוי קטן נמצא בתוך מקטע ארוך, לא תמיד קל לזהות אותו בפלט הרגיל. גם בקובצי תצורה, הבדל של תו אחד יכול להיות חשוב.

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

Delta, שהחבילה שלו נקראת לעיתים git-delta, הוא כלי שנכתב ב־Rust לעיצוב ולהדגשת תחביר בפלט של Git, diff וכלי חיפוש נתמכים. הוא מוסיף שכבת תצוגה לפלט הקיים, ויכול להעביר אותו לכלי גלילה כמו less. נסקור את האפשרויות, את ההגדרות ואת אופן עיבוד ההבדלים.

מה קשה לראות בתצוגת ההבדלים הרגילה

ברירת המחדל של Git מציגה הבדלים לפי שורות. שינוי בשם משתנה עשוי להופיע כשורה ישנה שנמחקה ושורה חדשה שנוספה. עם זאת, ל־Git יש גם יכולות מובנות כמו --word-diff ו־--color-words להבלטת שינויים בתוך שורה. Delta אינו הדרך היחידה לראות אותם. ראו תיעוד git diff.

בתצוגה רגילה המבוססת על שורות אפשר להיתקל בכמה קשיים:

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

Delta מעבד את זרם הטקסט שהתקבל מ־Git ומציג אותו עם הדגשות, בתצוגה מאוחדת או בשתי עמודות. הוא מזהה חלקים שונים בפלט ההשוואה; אין פירוש הדבר שהוא בונה עץ תחביר מופשט (AST) של קוד המקור.

היכולות המרכזיות של Delta

מעבר לצבעים, ההגדרות מאפשרות לבחור איך שורות, קבצים ומקטעי שינוי יוצגו. אלה האפשרויות העיקריות שכדאי להכיר:

1. הדגשת הבדלים בתוך שורה

Delta משווה שורות שהוסרו ונוספו ומחשב התאמה ביניהן לפי מרחק עריכה. כך הוא יכול להבליט את החלק שהשתנה בתוך השורה, ולא רק את השורה כולה. אפשר לעצב את הרקע של החלק שהשתנה בנפרד משאר השורה.

2. הדגשת תחביר לפי השפה

הכלי משתמש בספריית syntect של Rust, שקוראת הגדרות תחביר של Sublime Text — לא במנוע הפנימי של העורך עצמו. הדבר מאפשר להציג מילים שמורות, מחרוזות והערות בצבעים שונים, למשל בקובצי Rust, TypeScript ו־YAML. השפות הזמינות תלויות בנכסים הכלולים בהתקנה; אפשר לראות אותן באמצעות delta --list-languages. ראו תיאור syntect והשפות וערכות הנושא הנתמכות.

3. השוואה בשתי עמודות במסוף

מי שמעדיף לראות גרסה ישנה וחדשה זו לצד זו, בדומה לתצוגות השוואה ב־GitHub או GitLab, יכול להפעיל side-by-side. התצוגה כוללת הדגשת תחביר בשתי העמודות, ושורות ארוכות יכולות להישבר בהתאם לרוחב המסוף ולהגדרות הגלישה. במסוף צר, התצוגה המאוחדת עשויה להיות נוחה יותר. תיעוד התצוגה בשתי עמודות.

4. כותרות, מספרי שורות וניווט

במקום להסתמך רק על כותרת כגון diff --git a/src/main.rs b/src/main.rs, אפשר לעצב את פרטי הקובץ ולהוסיף מספרי שורות. השילוב עם less מאפשר גם קיצורי ניווט בין חלקי ההשוואה, כפי שמפורט בהגדרות בהמשך.

התקנה והגדרה של Delta

Delta מופץ כתוכנית מקומפלת למערכת ההפעלה. במצב הגלילה הרגיל הוא משתמש ב־less, וכדאי לוודא שגרסה מתאימה שלו זמינה. דרך ההתקנה תלויה במערכת ובמנהל החבילות.

התקנה

בחרו את הדרך המתאימה למחשב שאתם מורשים לנהל; אין צורך להריץ את כל הדוגמאות. Homebrew צריך להיות מותקן מראש, התקנת החבילה ב־Arch Linux דורשת הרשאות מתאימות, והמסלול של Cargo דורש סביבת בנייה של Rust:

# macOS עם Homebrew
brew install git-delta

# Arch Linux, עם הרשאות התקנה מתאימות
pacman -S git-delta

# בנייה מהמקור בעזרת Cargo של Rust
cargo install git-delta

ב־Debian וב־Ubuntu זמינות חבילה במאגרים תלויה בגרסת ההפצה. השתמשו בחבילה מתאימה ממאגר מהימן, אם קיימת, או עקבו אחר הוראות הפרויקט להתקנת קובץ .deb מעמוד המהדורות הרשמי. אין כאן הבטחה ש־apt install git-delta זמין בכל גרסה. בדרך כלל שם החבילה הוא git-delta, אך שם הפקודה המותקנת הוא delta. הוראות ההתקנה הרשמיות כוללות גם אפשרויות למערכות נוספות.

הגדרת הקובץ .gitconfig

לאחר ההתקנה אפשר להגדיר את Git להשתמש ב־Delta להצגת פלט. שמרו עותק של ההגדרות הקיימות ושלבו את הערכים הדרושים בקובץ ההגדרות האישי, שבדרך כלל נמצא ב־~/.gitconfig או ב־~/.config/git/config. אל תחליפו קובץ קיים בשלמותו: הגדרה אישית משפיעה על העבודה במאגרים של אותו משתמש.

[core]
    pager = delta

[interactive]
    diffFilter = delta --color-only

[delta]
    navigate = true    # ניווט בין מקטעי הבדלים
    dark = true        # למסוף כהה; ראו חלופות בהסבר
    side-by-side = true
    line-numbers = true

[merge]
    conflictstyle = zdiff3

משמעות ההגדרות:

  • core.pager: בפקודות שמשתמשות בכלי גלילה, כמו git diff, git show ו־git log -p, Git מעביר בדרך כלל את הפלט ל־Delta כשהוא מיועד למסוף. זו אינה הוראה לעצב אוטומטית כל פלט שמופנה לקובץ או לצינור.
  • interactive.diffFilter: משתמש ב־delta --color-only לתצוגה של בחירת מקטעים אינטראקטיבית, למשל ב־git add -p, בלי להחליף את מנגנון בחירת המקטעים של Git.
  • delta.navigate: מפעיל ניווט עם n קדימה ו־N אחורה בין חלקי ההשוואה. הניווט עובר בין קבצים, ובתצוגה של כמה רשומות שינוי גם בין גבולות commits; לא מדובר תמיד במעבר בין קבצים בלבד.
  • merge.conflictstyle = zdiff3: מוסיף לתצוגת התנגשות מיזוג גם מידע מגרסת הבסיס המשותפת. Delta יכול להציג השוואה מהבסיס לכל צד. זו בחירת תצוגה, לא פתרון אוטומטי להתנגשות; ודאו שגרסת Git שברשותכם תומכת בה.

הערך dark = true מתאים לרקע כהה. לרקע בהיר השתמשו במקום זאת ב־light = true; אפשר גם להשמיט את שניהם ולתת לכלי לזהות את הרקע. side-by-side ו־line-numbers מפעילים שתי עמודות ומספרי שורות. ראו הגדרות התחלה, ניווט ותצוגת התנגשויות מיזוג.

מאחורי התצוגה: איך Delta מעבד הבדלים

פלט השוואה של Git הוא זרם טקסט עם כותרות ומקטעי הבדלים. Delta קורא אותו דרך הקלט התקני, stdin, מזהה את המבנה ומייצר פלט עם רצפי צבע של ANSI. במצב גלילה הפלט מועבר לכלי כמו less. הוא נועד לקריאה בידי אדם, לא כפורמט נתונים חדש לסקריפטים.

מנגנון הניתוח פועל כמכונת מצבים ומבחין, בין היתר, בסוגי השורות הבאים:

  • כותרת רשומת השינוי ופרטי המידע הנלווים לה.
  • כותרות ההשוואה, ובהן שמות קבצים ופרטי טווחי שורות.
  • שורות הקשר שלא השתנו.
  • כותרות מקטעי שינוי (hunks), שבדרך כלל מתחילות ב־@@.
  • שורות שהוסרו, המסומנות ב־-.
  • שורות שנוספו, המסומנות ב־+.

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

זמן העיבוד תלוי בגודל ובאופי ההבדלים, בהגדרות ובמחשב. עצם השימוש ב־Rust אינו מבטיח שפלט גדול יעובד בתוך מספר קבוע של אלפיות שנייה.

התאמת המראה: צבעים וסגנונות

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

הדוגמה הבאה שומרת את קבוצת הסגנונות שבמקור. השורה של Nord מסומנת כהערה: לפני הפעלתה בדקו שהיא מופיעה בפלט delta --list-syntax-themes. אם לא, בחרו ערכה זמינה או השאירו את השורה מושמטת. שלבו את ההגדרות עם המקטע הקיים במקום ליצור ערכים סותרים.

[delta]
    features = decorations
    # syntax-theme = Nord
    line-numbers = true
    side-by-side = true

[delta "decorations"]
    commit-decoration-style = bold box ul
    file-style = bold yellow ul
    file-decoration-style = none
    hunk-header-style = syntax bold italic
    hunk-header-decoration-style = blue box
    line-numbers-minus-style = red italic
    line-numbers-plus-style = green italic

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

שילוב עם כלי שורת פקודה נוספים

Delta יודע לעבד פורמטים נתמכים של הבדלים ותוצאות חיפוש; אין להניח שכל פלט שרירותי יקבל משמעות נכונה. לדוגמה, כשכלי diff מותקן, אפשר להשוות שני קובצי תצורה מקומיים ולהעביר את הפלט בפורמט מאוחד ל־Delta:

diff -u config.old.json config.new.json | delta

החליפו את שמות הקבצים בקבצים שברצונכם להשוות. זהו צינור להצגת ההבדלים, לא הוראה למזג את הקבצים. באופן דומה, git diff | delta מפעיל את Delta במפורש, גם כאשר Git אינו מפעיל כלי גלילה אוטומטית. ראו מתי כלי הגלילה מופעל.

לחיפוש בעזרת ripgrep (rg), הפורמט --json מעביר תוצאות במבנה שהכלי תומך בו. החליפו את PATTERN בביטוי החיפוש הרצוי; הגרשיים בדוגמת מעטפת Bash או Zsh שומרים אותו כארגומנט אחד:

rg --json -C 2 'PATTERN' | delta

האפשרות -C 2 מוסיפה שתי שורות הקשר סביב התאמה. הפלט יכול לכלול הפרדה בין קבצים, הדגשת תחביר והבלטת התאמות. במקור הופיע כינוי פקודה (alias) שאינו מעביר נכון ביטוי חיפוש שנוסף אחריו: הביטוי היה מגיע אל Delta במקום אל rg. לכן מוצג כאן צינור מפורש, בלי להוסיף הגדרה לקובצי .bashrc או .zshrc. הדוגמה הרשמית לשילוב עם כלי חיפוש.

סיכום

כלי השוואה נוח יכול לעזור להתמקד בשינויים בקוד ובקובצי תצורה. Delta מוסיף אפשרויות תצוגה למסוף, אך גם יכולות ההשוואה המובנות של Git או של העורך עשויות להתאים לעבודה שלכם. אף תצוגה אינה מבטיחה שלא יחמקו טעויות.

בחרו תצוגה שקל לכם לקרוא, והתאימו אותה בהדרגה. אין צורך להחליף הרגל עבודה מועיל רק משום שכלי אחר מציע יותר צבעים או הגדרות.

באילו כלים אתם משתמשים במסוף?

מעדיפים Delta, diff-so-fancy או את תצוגת ההשוואה בעורך? אפשר לשתף בתגובות אילו הגדרות עוזרות לכם לקרוא שינויים. ב־The Useful Byte תמצאו מדריכים נוספים לכלי עבודה, אבטחה ותשתיות.

לקריאת המאמר המקורי באנגלית · תרגום לעברית עבור The Useful Byte.

Post a Comment

Previous Post Next Post