גיט

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

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

היוצר של גיט הוא לינוס טורבאלדס והוא יצר את המערכת באפריל של שנת 2005. נכון לשנת 2020, היא נחשבת למערכת ניהול הגרסאות הפופולרית ביותר.<ref>ראה לדוגמה סקר Stack Exchange שמוזכר בהמשך הערך</ref>

== היסטוריה ==
החל משנת 2002, הפיתוח של פרויקט לינוקס השתמש במערכת ניהול הגרסאות המבוזרת הקניינית BitKeeper . בשנת 2005 הצליח אנדרו טריגל לפתח לקוח עצמאי, ובעקבות כך נשלל רישיון השימוש במערכת לפרויקט לינוקס. טורבאלדס לא היה מרוצה ממערכות ניהול הגרסאות האחרות שהיו קיימות באותו שלב,<ref></ref> והחליט לכתוב אחת משלו. הוא החל לעבוד על גיט ב-3 באפריל 2005. פחות מחודש לאחר מכן כבר הייתה גרסה שאפשרה פיתוח יעיל של לינוקס (מערכת מרקוריאל נכתבה באותו הזמן ומאותן הסיבות). ביולי של אותה השנה, הפך ג'וניו המאנו למתחזק הראשי.

ברחבי העולם, מספר עצום של חברות הזנק (סטארט-אפ), קולקטיבים וחברות בין-לאומיות, כולל גוגל ומיקרוסופט, משתמשים בגיט כדי לשמור על קוד המקור של פרויקטי התוכנה שלהם. חלקם מארחים פרויקטי גיט משלהם, אחרים משתמשים בגיט באמצעות חברות אירוח מסחריות כמו GitHub (נוסדה בשנת 2007), Bitbucket (נוסדה בשנת 2010) ו-GitLab (נוסדה בשנת 2011). הגדולה שבהן, GitHub, מונה 40 מיליון מפתחים רשומים ונרכשה על ידי מיקרוסופט תמורת 7.5 מיליארד דולר בשנת 2018.<ref></ref>

עדות לדומיננטיות השוק של גיט ניתן למצוא בסקר מפתחים שנערך על ידי Stack Overflow. בסקר של שנת 2018, לדוגמה, נמצא כי 88.4% מכלל 74,298 המשתתפים בסקר בשנת השתמשו בגיט (עלייה מ -69.3% בשנת 2015). המתחרים הקרובים ביותר היו Subversion, עם כניסה של 16.6% (ירידה מ -36.9%); Team Foundation Version Control עם 11.3% (ירידה מ -12.2%); ו-Mercurial, עם 3.7% (ירידה מ -7.9%). למעשה, גיט הפכה לכה דומיננטית עד כדי כך שמדעני הנתונים ב-Stack Overflow לא טרחו לשאול את השאלה בסקר שלהם ב-2019<ref></ref> <ref></ref>.

== מבנה ==
גיט היא מערכת ניהול גרסאות מבוזרת - כל עותק מקומי של המאגר מכיל את כל המידע (כל ההיסטוריה). המידע הזה נשמר בדרך כלל בתת-תיקייה בשם ".git". גיט שומרת אובייקטים מסוג מידע (blob, בדרך כלל קובץ), עץ (tree, מבנה ספריות) וגרסה (commit). האובייקטים מזוהים על ידי שם שהוא גיבוב תוכנם לפי SHA-1.

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

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

== מונחים ==
=== גרסה (revision או commit) ===
: כל שינוי שנשמר הוא צומת בגרף, המכונה גרסה. בדרך כלל מדובר על שינוי ביחס לגרסה קודמת, אולם השינוי יכול להיות גם מיזוג (merge) של שתי גרסאות קודמות משני ענפי פיתוח שונים. שם הגרסה הוא פלט של SHA-1, שהוא למעשה מספר הקסדצימלי באורך 40 "ספרות" הקסדצימליות (לדוגמה: b70df95dbae39b3f0447be5c214d1dee33245827). אפשר להשתמש ברוב המקרים במספר יותר קטן של תווים מתחילת המספר (לדוגמה: b70df95) כשם מקוצר לאותה גרסה.

=== ענף (branch) ===
: הוא תת גרף בגרף הגרסאות. כל גרסה, כלומר כל צומת, מוצגת כאן בשמה המקוצר. גיט מחזיק רשימה של ענפים מקומיים והם בדרך כלל הקצוות הנוכחיים של השינויים. מקובל לקרוא לענף הראשי master או main. כמו כן HEAD הוא שם שמור לצומת שבו אנחנו נמצאים כרגע (בדרך כלל: בענף הפיתוח הפעיל). כל גרסה מסומנת על ידי שם מקוצר.

=== תגית (tag) ===
: אפשר לסמן גרסה מסוימת בתג. זה מאפשר לתת שם סמלי למקום מסוים (לדוגמה: תג בשם v1.23.5-beta2 יכול לסמל את גרסה מס' 1.23.5-beta2 של התוכנה). בגיט התג יכול לכלול גם חתימה דיגיטלית. בכך אפשר להתחייב על תוכנו של תג.

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

דוגמה, מ-[http://tzafrir.org.il/~tzafrir/git_test/.git http://tzafrir.org.il/~tzafrir/git_test/.git], של מאגר גיט פשוט:

<div dir="ltr">

 * 8f56b9b (HEAD, tag: v0.3, master) Some integration work
 * 45ace55 Merge branch 'feature-branch'
 |\
 | * 5f90c8c (feature-branch) Add a new feature
 | | * b76c518 (experiment) Testing an experimental feature
 | |/
 |/|
 * | b70df95 (tag: v0.2) Adding a new header
 * | b65d3e3 Adding documentation
 |/
 * 5742dfe (tag: v0.1) Adding hello.

</div>

בדוגמה זו נראה מאגר תוכנה קטן. כל גרסה נקראת בשמה המקוצר, ב-7 ספרות הקסאדצימליות. שלוש גרסאות סומנו בתגיות (v0.1, v0.2, v0.3). רוב התיקונים נעשו בענף הראשי (master). כל התגיות הם של גרסאות על הענף הראשי. אולם היו שני ענפי פיתוח צדדיים: הענף 'feature-branch' נוצר לאחר גרסה v0.1 ומוזג לענף הראשי לאחר סימון v0.2. הענף השני הוא הענף הניסיוני 'experiment' שלא מוזג עדיין.

=== איסוף זבל ===
איסוף זבל (Garbage Collection) הוא תהליך שבו תוכנה מוחקת אובייקטים שקיימים עדיין בזיכרון למרות שהצורך בהם הסתיים.

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

==שרת==
המאגר בגיט עובד מול מאגרים אחרים. המאגרים הללו יכולים להיות קבצים על מערכת הקבצים המקומית או קבצים מרוחקים על שרתים אחרים. אם הקבצים יושבים על שרתים אחרים יש כמה אפשרויות לגשת אליהם:
* פרוטוקול טיפש (dumb) - HTTP, HTTPS (כאשר שרתים מאפשרים גישה לקבצים בתיקייה) או כל פרוטוקול אחר שמאפשר גישה לתוכנם של קבצים על שרת מרוחק (לדוגמה: FTP). לקריאה בלבד.
* שרת גיט: מקשיב בדרך כלל על פורט TCP 9148. לקריאה בלבד.
* חיבור דרך SSH

ההתחברות דרך SSH או דרך שרת גיט יעילה יותר (מהירה יותר וצורכת פחות נפח תעבורה) מאשר הפרוטוקול הטיפש, מכיוון שאפשר להשתמש במידע בצורה יעילה יותר (בקשת fetch-pack). פרוטוקול גיט לא כולל הזדהות ולכן לא נהוג לאפשר העלאת תוכן דרכו. נהוג לאפשר העלאת תוכן רק דרך SSH (במקרים רבים ההזדהות היא על ידי מפתחות ציבוריים).<ref></ref><ref></ref>

== ממשקי גיט ==
ממשק האתר GitLab
במצבו הטבעי, Git הוא יישום הפועל בטרמינל Linux.

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

הוא חינמי ומגיע בחבילות Linux, BSD, Illumos ומערכות הפעלה אחרות דמויות Unix. הוא נראה כך:

ככל הנראה, ממשקי הגיט הכי מוכרים הם מבוססי אתרים: אתרים כמו GitHub, המקור הפתוח GitLab, Savannah, BitBucket ו־SourceForge כולם מציעים אירוח קוד מקוון כדי למקסם את ההיבט הציבורי והחברתי של קוד פתוח, ברמות שונות, יחד עם GUI מבוסס-דפדפן כדי למזער את עקומת הלמידה של השימוש בגיט. השילוב השקוף ביותר מגיע בצורה של תמיכה במנהל קבצים. מנהל הקבצים KDE, Dolphin, יכול להראות את מצב הגיט של תיקייה ואף ליצור התחייבויות, דחיפות ומשיכות. משתמשת בגיט כבסיס לממשק שיתוף קבצים בסגנון Dropbox.<br />

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

בקרב המפתחים קיימות קונבנציות לשמות של ענפים בהתאם לתפקידם, ונהוג שלכל פרויקט יש ענף ראשי שכל הענפים מסתעפים ממנו, ומתמזגים אליו בסיום הפיתוח הנקודתי. במשך שנים רבות היה נהוג לכנות את הענף הראשי בשם "master", אך ב-2021 שונה השם ל-"main" בעקבות מחאות על הקונוטציה השלילית של השם master שמתקשרת לעבדות.<ref></ref> ענף נוסף שנהוג להשתמש בו הוא "develop" - ענף שמשמש לייצוג גרסת הפיתוח היציבה שעדיין לא שוחררה לשימוש. לעיתים נעשה שימוש גם ב-"stable" שמשמש ליצוג הגרסה האחרונה של מערכת שהיא יציבה בוודאות.<ref></ref>

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

== גרסאות ==
רשימה של גרסאות:
{| class="wikitable"
|+[https://github.com/git/git/tags מקור]
!מספר גרסה
!תאריך שחרור גרסה
|-
|0.99
|11-07-2005
|-
|1.0
|21-12-2005
|-
|1.1
|08-01-2006
|-
|1.2
|12-02-2006
|-
|1.3
|18-04-2006
|-
|1.4
|10-06-2006
|-
|1.5
|14-02-2007
|-
|1.6
|17-08-2008
|-
|1.7
|13-02-2010
|-
|1.8
|21-10-2012
|-
|1.9
|14-02-2014
|-
|2.0
|28-05-2014
|-
|2.1
|16-08-2014
|-
|2.2
|26-11-2014
|-
|2.3
|05-02-2015
|-
|2.4
|30-04-2015
|-
|2.5
|27-07-2015
|-
|2.6
|28-09-2015
|-
|2.7
|04-10-2015
|-
|2.8
|28-03-2016
|-
|2.9
|06-06-2016
|-
|2.10
|02-09-2016
|-
|2.11
|29-11-2016
|-
|2.12
|24-02-2017
|-
|2.13
|10-05-2017
|-
|2.14
|04-08-2017
|-
|2.15
|30-10-2017
|-
|2.16
|17-01-2018
|-
|2.17
|02-04-2018
|-
|2.18
|21-06-2018
|-
|2.19
|10-09-2018
|-
|2.20
|09-12-2018
|-
|2.21
|24-02-2019
|-
|2.22
|07-06-2019
|-
|2.23
|16-08-2019
|-
|2.24
|04-11-2019
|-
|2.25
|13-01-2020
|-
|2.37
|27-07-2022
|-
|2.38
|03-10-2022
|-
|2.38.1
|18-10-2022
|}

== ארגון ==
טורבאלדס פיתח את גיט בחודשים הראשונים. לאחר מכן הפך ג'וניו המאנו למפתח הראשי. גיט לא דורשת השמת זכויות יוצרים, ונכון לסוף 2010 יותר מ-600 אנשים תרמו קוד למיזם.<ref>מספר התורמים: 683, נכון ל־21 בדצמבר 2010, לפי הדף [http://git-scm.com/about About Git] בדף הבית של המיזם</ref> החל מה־16 בדצמבר 2010 המיזם מנוהל בחסות מוסד חופש התוכנה (Software Freedom Conservatory). גוף זה מספק ישות משפטית (לדוגמה: עבור תרומות) וייעוץ משפטי.<ref>[http://sfconservancy.org/news/2010/dec/16/git-joins/ הודעה לעיתונות] על הצטרפות מיזם גיט ל-Software Freedom Conservatory</ref>

== ראו גם ==
* ניהול גרסאות
*GitHub
*Team Foundation Server

== קישורים חיצוניים ==

* 
*[https://github.com אתר גיטהאב] 
*[http://git-scm.com/documentation תיעוד והסברים מלאים אודות גיט ואופן השימוש בו] 
*[https://www.welcometothejungle.com/en/articles/btc-history-git welcometothejungle] 
*[https://git-scm.com/about git-scm.com] 
*[https://opensource.com/resources/what-is-git opensource.com] 

== הערות שוליים ==

קטגוריה:מערכות ניהול גרסאות
קטגוריה:תוכנה חופשית
קטגוריה:תוכנה חוצת פלטפורמות
קטגוריה:תוכנות שהושקו ב-2005