במאמרים הקודמים יצאנו קצת מהתיאוריה וראינו פקודות של ממש ב-SVN שמממשות את התיאוריה. אז עד כה אנחנו יודעים על איך לתפעל את מערכת ה-SVN ואת המונחים הבסיסיים – ענף, קומיט, מיזוג וכמובן המילה האהובה על הכל: קונפליקט ופתרונו.
במאמר הזה אנחנו נדבר קצת על תיאוריה וקצת על פרקטיקה ונתמקד באחת הסיבות העיקריות לקיום ניהול הגרסאות – היכולת לעבור מגרסה לגרסה ולבחון את השינויים בין הגרסאות. בואו ונראה איך עושים את זה. הדבר הראשון שאנחנו צריכים לראות הוא הלוג. לוג מראה לנו את השינויים שנערכו בגרסה שיש לנו. את הלוג מוציאים באמצעות פקודת svn log שאותה מריצים בתיקית האב של הפרויקט. הפלט נראה כך:
$ svn log ------------------------------------------------------------------------ r7 | ran | 2015-10-10 21:28:48 +0300 (ב', 12 אוק 2015) | 2 lines Making it decisive ------------------------------------------------------------------------ r2 | ran | 2015-10-10 20:33:16 +0300 (ש', 10 אוק 2015) | 4 lines Adding echo M trunk/index.php ------------------------------------------------------------------------ r1 | ran | 2015-10-10 20:13:17 +0300 (ו', 9 אוק 2015) | 5 lines Initial A trunk A trunk/index.php ------------------------------------------------------------------------
אפשר לראות כאן את הקומיטים האחרונים שנעשו לפרויקט והקבצים השונים. למשל, אפשר לראות שב19 באוקטובר שיניתי את index.php. ההערה שלי היא "Adding echo". שימו לב שלכל קומיט יש מספר סידורי – למשל r1 או r7. אם מיזגנו ענף, ב-SVN המיזוג נחשב כקומיט והוא אינו שונה מכל קומיט אחר. למשל השינוי r7 הוא מיזוג של שני ענפים ולא רואים את זה בלוג. לפחות ב-SVN.
הגרסה האחרונה היא r7 במקרה הזה והיא הגרסה המייצגת.
זה מעולה שאנחנו יכולים לראות את כל הקומיטים האחרונים, אך מה בנוגע להשוואות? ההשוואה הבסיסית נעשית באמצעות פקודת diff. אם אני רוצה לראות אילו שינויים יש בין הגרסה האחרונה ששמורה במנהל הגרסאות לגרסה הלוקלית – כלומר זו שנמצאת אצלי במחשב אך לא נדחפה למנהל הגרסאות עדיין – אני צריך להריץ את הפקודה הבאה:
svn diff
אני אקבל משהו בסגנון הזה:
$ svn diff Index: index.php =================================================================== --- index.php (revision 11) +++ index.php (working copy) @@ -1,6 +1,6 @@ <?php //Printing Hello World! -print "Hello World :)"; +print "Hello World :O";
זה יכול להראות מבלבל וגם קצת מפחיד, אבל אם נסתכל על זה קצת לעומק, נראה שזה די קריא. בגדול אנחנו מקבלים את רשימת הקבצים שנעשו בהם שינויים. במקרה שלנו index.php. מה שיש ליד ה-@@ הוא פירוט של השורות שבהם יש את ההבדלים. במקרה שלנו – הוא מציג את שורה 1-6 בשני הקבצים.
בתחילה ה-diff מראה כמה שורות שאין בהם שינוי, זה ה- <?php וההערה. ליד המינוס הוא מציג את השורה שנמחקה (במקרה הזה ה-hello world עם החיוך) השורה הזו בעצם היא שורה שנמצאת בגרסה האחרונה במנהל הגרסאות אך לא נמצאת בגרסה המקומית. ליד הפלוס הוא מציג שורות שנמצאות בגרסה המקומית ולא נמצאות בגרסה ששמורה במנהל הגרסאות. במקרה הזה השורה עם הסמיילי המופתע.
מה אנחנו למדים מה-diff הזה? שהחלפתי את הסמיילי, זה הכל!
אני יכול לבצע checkin לקוד שנמצא אצלי במחשב ולהכניס אותו למנהל הגרסאות כגרסה האחרונה. אם אעשה זאת, יקרו שני דברים: הראשון הוא שב-svn log אני אראה את ה-checkin. השני הוא שאם אני אריץ svn diff אני לא אקבל דבר, כי אין שינוי כלל בין הגרסה במנהל הגרסאות לגרסה המקומית אצלי.
אני יכול גם לעשות revert, שזה בעצם למחוק את כל השינויים בגרסה הלוקלית ולחזור לגרסה שיש במנהל הגרסאות. לעשות revert זה מאוד קל, רק צריך לציין את שם הקובץ:
svn revert index.php
הפקודה הזו מוחקת את השינויים שנעשו ב-index.php ומשווה את הקובץ המקומי לקובץ של הגרסה האחרונה במנהל הגרסאות.
אם יש יותר מקובץ אחד, אפשר לעשות revert להכל:
svn revert -R .
ה-revert להכל נקרא גם revert head. כשאומרים revert head מתכוונים לחזרה לגרסה האחרונה.
כמו שאפשר לעשות diff בין הגרסה הלוקלית לגרסה האחרונה ששמורה ב-SVN אפשר לעשות diff בין הגרסה הלוקלית לכל גרסה ששמורה ב-SVN. את הגרסאות אנו מזהים באמצעות המספרים הסידוריים שלהן שנמצאים בלוג. ראינו קודם שזה r1, r2 ו-r7.
כך מבצעים השוואה בין הגרסה הלוקלית לגרסת r1:
svn diff --revision r1
וכך מבצעים השוואה בין גרסת r1 ל-r2.
svn diff --revision r1:r2
הפלט הוא אותו פלט של diff שלמדנו לנתח קודם לכן.
על מנת לחזור לגרסה מסוימת שעבדה בעבר (למשל r1), אנחנו מכניסים את הפקודה הזו:
svn update -r r1
כדי לחזור לגרסה הנוכחית ששמורה במנהל הגרסאות, אנו יכולים להשתמש בפקודה הזו:
svn update
את הפקודה הזו אנו מכירים. זו פקודת update שאותה אפשר להריץ בכל שלב כדי למשוך את השינויים שנעשו ב-SVN לגרסה המקומית שלנו. נהוג להריץ את הפקודה הזו לפני הקומיט כדי לא לדרוס שינויים של מתכנתים אחרים.
למדנו כאן כמה מונחים מאוד חשובים:
לוג – מדובר ברשימת השינויים שנעשו במנהל הגרסאות. כל קומיט וכל מיזוג.
מספר גרסה – כל שינוי בגרסה, בין אם מדובר בשינוי של קובץ אחד או בשינוי של עשרות קבצים מתועד במספר גרסה.
diff – הפעולה שאנו עושים על מנת לראות את ההבדלים בין הגרסאות. זה יכול להיות בין הגרסה הלוקלית לגרסה כלשהי ששמורה במנהל הגרסאות (האחרונה או גרסה המזוהה על ידי מספר גרסה) או בין שתי גרסאות המזוהות על ידי מספר גרסה. את מספר הגרסה, אתם בוודאי זוכרים, אפשר למצוא באמצעות ה-log.
revert – פעולה בגרסה הלוקלית שמבצעת חזרה לגרסה מסוימת. אנחנו יכולים להחזיר קובץ אחד לגרסה העדכנית במנהל הגרסאות או לגרסה מסימת שמזוהה על ידי מספר גרסה.
אפשר לראות ש-SVN נותן לנו כאן כלים רבי עוצמה בכל מה שנוגע לתכנות אתר האינטרנט או התוכנה שלנו. אם הרסנו משהו בטעות/ גרמנו לבאג וגילינו רק אחרי פרק זמן מסוים, אנחנו יכולים לחזור לגרסה האחרונה שעבדה (אפילו אם זו לא הגרסה האחרונה), לוודא שהיא עובדת ולראות מה השינויים שנעשו על מנת למצוא את הבאג. מלבד שמירה קלה של התוכנה/אתר ומתן אפשרות לעבודה משותפת של כמה מתכנתים על פרויקט אחד תוך תיעוד ההתקדמות, זה אחד השימושים העיקריים של SVN וזה שימושי גם למפתח בודד שעובד על התוכנה.
במאמר הבא נלמד על כלים נוספים לעבודה עם SVN