איך (ולמה) לתת ל AI לטפל בריבייסים
שנים סיפרו לנו שריבייס זה אחלה מנגנון כי הוא שומר על היסטוריית גיט לינארית. הם לא סיפרו על הקונפליקטים כשמנסים לעשות ריבייס על main שהתקדם ובענף שלך גם היו לא מעט קומיטים. מה שקורה במצב כזה הוא:
גיט מייצר patch לקומיט הראשון, מנסה להפעיל אותו על המצב העדכני של main.
יש קונפליקט, אתה מתקן את הקונפליקט ואז גיט ממשיך לקומיט הבא.
גיט שוב מייצר patch ומנסה להפעיל אותו, שוב יש קונפליקט ואתה צריך לתקן גם את הקונפליקט השני.
וכן יש את rerere שזוכר איך תיקנת קונפליקט פעם אחת ויפעיל אותו אוטומטית. אבל הבעיה היותר משמעותית היא שמנגנון המיזוג פה עקום. הוא מניח שכל הקומיטים חשובים כשבפועל הרבה פעמים יש לנו בענף ניסויים ותיקונים. מתוך 20 קומיטים בענף יהיו לי 8 קומיטים חשובים ועוד 12 נסיונות שלא הצליחו ונדרסו. אבל ריבייס מכריח אותי למזג את כל הקומיטים לפי הסדר ולפתור את הקונפליקטים אחד אחד.
מזל שיש לנו AI.
המתג -p של קופיילוט מאפשר להעביר פרומפט משורת הפקודה. יחד עם --allow-all ו --autopilot יש לנו מפלצת סקריפטים. אני יוצר את הסקריפט git-llmrebase
# ~/.git-llmrebase
#!/usr/bin/env bash
branch=$(git rev-parse --abbrev-ref HEAD)
target="$1"
ollama launch copilot --model glm-5.1:cloud -- --allow-all --autopilot --share -p \
"Do an LLM rebase to ${target}: run git diff ${branch}...${target} review all changes from their merge-base and re-implement them on the ${target}. Move branches so ${target} won't change and ${branch} will point to the new implementation. Instead of applying the patches one by one just read the differences from ${target} and re-build the most recent changes of ${branch} there. End result: branch ${branch} is a single commit branch with the most recent changes and ${target} as its parent"
ואז מחבר אותו לגיט עם:
chmod +x ~/.git-llmrebase
git config --global alias.llmrebase '!~/.git-llmrebase'
ועכשיו נוכל להריץ:
git llmrebase foo
ולתת ל AI לשבור את הראש ולמצוא רק את השינויים הרלוונטיים.
כמובן שעם LLM תמיד נשארת השאלה אם זה יהיה יותר אמין מ rebase כשיש הרבה קונפליקטים. נו כמו שאומרים הסוכנים, חיים רק פעם אחת.