לדלג לתוכן

8.5 בקרת גרסאות 2 מרג הרצאה

גיט באסה

  • בפרק הקודם יצרנו קומייט עם ההודעה הבאה: "some changes..", זוהי הודעה נוראית. אתה רוצה לכתוב הודעות שמתכנתים אחרים יוכלו להבין את השינויים שעשית בקוד מבלי לקרוא אותו, אלה רק מלקרוא את ההודעה. בנוסף אם תחזור לקומייט שעשית לפני שנתיים וההודעה שלה תהיה דומה, יהיה לך קשה להבין מה זה הקומייט הזה. בדיוק בשביל זה חשוב מאוד לתת שמות טובים לקומיטים שלנו, יש דרך מאוד קלה בגיט לשנות את ההודעה של הקומיט האחרון, הריצו את הפקודה הבאה:
    git commit --amend -m "Reformated main.py"
    

    Pasted image 20240210143621.png
  • מעולה, ומה אם נרצה לבטל לגמריי את הקומיט? מה נוכל לעשות?
  • נוכל להשתמש בפקודה git revert שתצור קומייט חדש שמוחק את כל השינויים הקומייט האחרון, הריצו:
    git revert main
    

    Pasted image 20240210144120.png
  • ניתן לראות שנוצר קומייט חדש לmain, שפשוט מוחק את השינויים שהקומייט הקודם עשה

גיט מרג' - git merge

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

git checkout dev
git merge main
git commit -m "dev merged with main!"

Pasted image 20240210145013.png
- נוכל לראות שנוצר קומייט חדש בmain עם השינויים של הענף dev!
- נוכל גם להשתמש בgit pull כדי לאחד בין הענפים, קודם כל נוסיף עוד שינויים לdev
git checkout dev
# Adding changes..
git status
git add .
git commit -m "Added doc string to functions"

- עכשיו נמזג את הענפים עם git pull, נעשה זאת באמצעות הפקודות הבאות:
git checkout main
git pull dev
git commit -m "pulled dev to main"

Pasted image 20240210150523.png
- שימו לב, git merge ממזג את הbranch הנוכחי עם הbranch שציינו ו - git pull מושך את הbranch שציינו לbranch הנוכחי

גיט קונפליקט - git conflict

  • המון פעמים כשאנחנו עושים מירג'וג' בין ענפים, קונפליקטים יכולים לקרות.
  • גיט קונפליקט קורה כאשר אותו קובץ השתנה בשני ענפים שונים, אז גיט לא מצליח למרג'ג' ענפים.
  • תראו את הדוגמה הבאה:
    Pasted image 20240211202205.png
    # 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 ואתם תראו שיש המון סימוניים על הקבצים שלהם של <<<<<<<, =======, ו - >>>>>>> הנה דוגמה לקובץ כזה:
    <<<<<<< HEAD
    Changes in dev branch
    =======
    Conflicting changes in main branch
    >>>>>>> main
    
  • אפשר לראות שבקובץ יש את השינויים של שני הbranch-ים וגיט מאפשר לנו לבחור איזה שינוי אנחנו רוצים שיהיה לקובץ הסופי, מחקו כל את כל השורות והשינויים שאתם לא רוצים שיהיה לקובץ הסופי וכשאתם מסיימים לערוך את כל הקבצים הריצו את הפקודה:
    git merge --continue
    
  • אם הmerge רץ עכשיו בהצלחה נעשה commit לשינויים:
    git commit -m "merged dev sucessfully"
    

גיט diff

  • המון פעמים בגיט נרצה לראות את השינויים שקרו בין commit-ים, ענפים וגם שינויים שאנחנו עושים על המחשב (לפני קומייט). נוכל לעשות זאת באמצעות הפקודה git diff, נראה דוגמאות:
  • הריצו את הפקודה הבאה כדי לראות את הקוד ששנינו מאז הקומייט האחרון:
    git diff
    
  • הריצו את הפקודה הבאה כדי לראות את השינויים של הקבצים שעשינו להם git add:
    git diff --staged
    
  • הריצו את הפקודה הבאה כדי לראות את ההבדלים בין שני קומייטים:
    git diff commit1 commit2
    
  • הריצו את הפקודה הבאה כדי לראות את ההבדלים בין שני ענפים:
    git diff branch1 branch2 
    

גיט רי-בייס - 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
    

    Pasted image 20240212222108.png

או שיט, גיט! - Oh Shit, Git!

  • כמו שהבנתם, מאוד קל לדפוק לכם את הפרויקט עם גיט :(
  • האתר "Oh Shit, Git!" מביא המון פתרונות לבעיות גיט נפוצות שקורות לכל המפתחים, ממליץ מאוד לקרוא אותו ולעבור עליו שיש לכם בעיה עם גיט!
  • קישור לאתר: https://ohshitgit.com/

גיט - מאחורי הקלעים

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