8.5 בקרת גרסאות 2 מרג הרצאה
גיט באסה¶
- בפרק הקודם יצרנו קומייט עם ההודעה הבאה: "some changes..", זוהי הודעה נוראית. אתה רוצה לכתוב הודעות שמתכנתים אחרים יוכלו להבין את השינויים שעשית בקוד מבלי לקרוא אותו, אלה רק מלקרוא את ההודעה. בנוסף אם תחזור לקומייט שעשית לפני שנתיים וההודעה שלה תהיה דומה, יהיה לך קשה להבין מה זה הקומייט הזה. בדיוק בשביל זה חשוב מאוד לתת שמות טובים לקומיטים שלנו, יש דרך מאוד קלה בגיט לשנות את ההודעה של הקומיט האחרון, הריצו את הפקודה הבאה:

- מעולה, ומה אם נרצה לבטל לגמריי את הקומיט? מה נוכל לעשות?
- נוכל להשתמש בפקודה
git revertשתצור קומייט חדש שמוחק את כל השינויים הקומייט האחרון, הריצו:

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

- נוכל לראות שנוצר קומייט חדש בmain עם השינויים של הענף dev!
- נוכל גם להשתמש ב
git pull כדי לאחד בין הענפים, קודם כל נוסיף עוד שינויים לdevgit checkout dev
# Adding changes..
git status
git add .
git commit -m "Added doc string to functions"
- עכשיו נמזג את הענפים עם
git pull, נעשה זאת באמצעות הפקודות הבאות:
- שימו לב, git merge ממזג את הbranch הנוכחי עם הbranch שציינו ו - git pull מושך את הbranch שציינו לbranch הנוכחי
גיט קונפליקט - git conflict¶
- המון פעמים כשאנחנו עושים מירג'וג' בין ענפים, קונפליקטים יכולים לקרות.
- גיט קונפליקט קורה כאשר אותו קובץ השתנה בשני ענפים שונים, אז גיט לא מצליח למרג'ג' ענפים.
- תראו את הדוגמה הבאה:

# Adding main.py git add main.py git commit -m "added main.py" # Changing main.py in dev branch git branch dev git checkout dev git add main.py git commit -m "changed main.py" # Changing main.py in main git checkout main git add main.py git commit -m "changed main.py" # try merge-ing dev to main git checkout dev git merge main
גיט פתרון - cherry pick¶
- אז איך פותרים קונפליקט? זכרו, קונפליקט קורה כאשר אותו קובץ עבר כמה שינויים בשני branch-ים ואנחנו מנסים לאחד בניהם, אז גיט מאפשר לנו לפתור קופליקטים בדרך באה:
- הריצו
git statusכדי לראות את הקבצים שיש להם קונפליקט. - עכשיו פתחו את הקבצים שיש להם conflict ואתם תראו שיש המון סימוניים על הקבצים שלהם של
<<<<<<<,=======, ו ->>>>>>>הנה דוגמה לקובץ כזה:
- אפשר לראות שבקובץ יש את השינויים של שני הbranch-ים וגיט מאפשר לנו לבחור איזה שינוי אנחנו רוצים שיהיה לקובץ הסופי, מחקו כל את כל השורות והשינויים שאתם לא רוצים שיהיה לקובץ הסופי וכשאתם מסיימים לערוך את כל הקבצים הריצו את הפקודה:
- אם הmerge רץ עכשיו בהצלחה נעשה commit לשינויים:
גיט diff¶
- המון פעמים בגיט נרצה לראות את השינויים שקרו בין commit-ים, ענפים וגם שינויים שאנחנו עושים על המחשב (לפני קומייט). נוכל לעשות זאת באמצעות הפקודה
git diff, נראה דוגמאות: - הריצו את הפקודה הבאה כדי לראות את הקוד ששנינו מאז הקומייט האחרון:
- הריצו את הפקודה הבאה כדי לראות את השינויים של הקבצים שעשינו להם git add:
- הריצו את הפקודה הבאה כדי לראות את ההבדלים בין שני קומייטים:
- הריצו את הפקודה הבאה כדי לראות את ההבדלים בין שני ענפים:
גיט רי-בייס - git rebase¶
- גיט רי-בייס זה עוד דרך למזג בין ענפים כמו
git mergeו -git rebase. מאחורי הקלעים זה עובד בצורה קצת שונה. - כאשר אנחנו עושים git merge, גיט יוצר קומייט חדש בbranch שמכיל את כל השינויים של הbranch שאותו אנחנו ממזגים. הכל בקומייט אחד.
- לעומת זאת שאנחנו עושים git rebase, גיט יוצר קומייט חדש בשביל כל קומייט שנוצר בbranch שאותו אנחנו ממזגים, כל שיכולים להיווצר מספר קומיטים חדשים לbranch שאליו אנחנו ממזגים.
דוגמה:
git add . git commit -m "init project" git branch dev git checkout dev # A git add . git commit -m "A" # B git add . git commit -m "B" git rebase main

או שיט, גיט! - Oh Shit, Git!¶
- כמו שהבנתם, מאוד קל לדפוק לכם את הפרויקט עם גיט :(
- האתר "Oh Shit, Git!" מביא המון פתרונות לבעיות גיט נפוצות שקורות לכל המפתחים, ממליץ מאוד לקרוא אותו ולעבור עליו שיש לכם בעיה עם גיט!
- קישור לאתר: https://ohshitgit.com/
גיט - מאחורי הקלעים¶
- כאשר אנחנו מריצים את הפקודה
git initנוצר לנו תקייה חדשה בפרויקט בשם.git, זוהי התקייה של גיט שמכילה את כל השינויים, הענפים, ואת כל הגיט שיצרנו. - אל תמחקו אותה! - הסבר על הקבצים והתקיות ב
.git:- התקייה
.git/objects/- מכילה את כל הקומיטים בפרויקט. - התקייה
.git/refs/- מכילה את כל הבראנצ'ים והטאגים של הפרויקט (טאגים זה דומה לבראנצ'ים) - הקובץ
.git/config- קובץ קונפיגורציה (הגדרות) שמכיל דברים רגישיים (סיסמאות וכו) - התקייה
.git/index/- מכילה את כל הקבצים שעשינו להם add (לפני קומייט) - התקייה
.git/logs/- מכילה מידע על הקומייטים.
- התקייה