Tom یک عملیات clone انجام داده و بعد از آن فایل جدیدی با نام string.c دید و حالا میخواهد بداند چه کسی این فایل را به انبار اضافه کرده است؟، هدفش چه بوده ?, بنابراین او بعد از clone, git log را اجرا میکند
[tom@CentOS ~]$ git clone gituser@git.server.com:project.git
دستورات بالا نتایج زیر را در برخواهند داشت:
Initialized empty Git repository in /home/tom/project/.git/ remote: Counting objects: 6, done. remote: Compressing objects: 100% (4/4), done. Receiving objects: 100% (6/6), 726 bytes, done. remote: Total 6 (delta 0), reused 0 (delta 0)
عملیات clone یک directory جدید در working directory ایجاد میکند. او working directory را به directory جدید تغییر میدهد و git log را اجرا میکند
[tom@CentOS ~]$ cd project/ [tom@CentOS project]$ git log
دستورات بالا نتایج زیر را در برخواهند داشت:
commit d1e19d316224cddc437e3ed34ec3c931ad803958 Author: Jerry Mouse <jerry@howcodex.com> Date: Wed Sep 11 08:05:26 2013 +0530 Changed return type of my_strlen to size_t commit 19ae20683fc460db7d127cf201a1429523b0e319 Author: Tom Cat <tom@howcodex.com> Date: Wed Sep 11 07:32:56 2013 +0530 Initial commit
بعد از مشاهده لیست تغییرات (log), او متوجه شد که Jerry, string.c را برای راه اندازی string های پایه، ایجاد کرده است. حالا Tom کنجکاو شده که کد Jerry را ببیند. بنابراین اون فایل string.c را با ویرایشگر متن 1 باز میکند و به سرعت یک باگ یدا میکند Jerry از constant pointer در تابع my_strlen استفاده نکرده است. بنابراین Tom تصمیم میگیرد کد Jerry را اصلاح کند، بعد از اصلاح یا دستکاری، کد به شکل زیر در میآید
[tom@CentOS project]$ git diff
دستورات بالا نتایج زیر را در برخواهند داشت:
diff --git a/string.c b/string.c index 7da2992..32489eb 100644 --- a/string.c +++ b/string.c @@ -1,8 +1,8 @@ #include <stdio.h> -size_t my_strlen(char *s) +size_t my_strlen(const char *s) { - char *p = s; + const char *p = s; while (*p) ++p; }
بعد از تست کردن کد, Tom تصمیم به commit کردن تغییرات میگیرد
[tom@CentOS project]$ git status -s M string.c ?? string [tom@CentOS project]$ git add string.c [tom@CentOS project]$ git commit -m 'Changed char pointer to const char pointer' [master cea2c00] Changed char pointer to const char pointer 1 files changed, 2 insertions(+), 2 deletions(-) [tom@CentOS project]$ git log
دستورات بالا نتایج زیر را در برخواهند داشت:
commit cea2c000f53ba99508c5959e3e12fff493b Author: Tom Cat <tom@howcodex.com> Date: Wed Sep 11 08:32:07 2013 +0530 Changed char pointer to const char pointer commit d1e19d316224cddc437e3ed34ec3c931ad803958 Author: Jerry Mouse <jerry@howcodex.com> Date: Wed Sep 11 08:05:26 2013 +0530 Changed return type of my_strlen to size_t commit 19ae20683fc460db7d127cf201a1429523b0e319 Author: Tom Cat <tom@howcodex.com> Date: Wed Sep 11 07:32:56 2013 +0530 Initial commit
Tom با استفاده از git push تغییرات خود را روی Push, Git server میکند:
[tom@CentOS project]$ git push origin master
دستورات بالا نتایج زیر را در برخواهند داشت:
Counting objects: 5, done. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 336 bytes, done. Total 3 (delta 1), reused 0 (delta 0) To gituser@git.server.com:project.git d1e19d3..cea2c00 master −> master
در همین زمان, Jerry تصمیم گرفته تا یک تابع مقایسه String compare را به فایلش اضافه کند. بنابراین او string.c را دستکاری میکند. بعد از دستکاری، فایل به شکل زیر خواهد بود:
[jerry@CentOS project]$ git diff
دستورات بالا نتایج زیر را در برخواهند داشت:
index 7da2992..bc864ed 100644 --- a/string.c +++ b/string.c 30Git Tutorials @@ -9,9 +9,20 @@ size_t my_strlen(char *s) return (p -s ); } +char *my_strcpy(char *t, char *s) + { + char *p = t; + + while (*t++ = *s++) + ; + + return p; + } + int main(void) { int i; + char p1[32]; char *s[] = { "Git tutorials", "Howcodex" @@ -20,5 +31,7 @@ int main(void) for (i = 0; i < 2; ++i) printf("string lenght of %s = %lu\n", s[i], my_strlen(s[i])); + printf("%s\n", my_strcpy(p1, "Hello, World !!!")); + return 0; } }
بعد از تست کردن کدها، او آماده push کردن به git server است:
[jerry@CentOS project]$ git status -s M string.c ?? string [jerry@CentOS project]$ git add string.c [jerry@CentOS project]$ git commit -m "Added my_strcpy function" [master e944e5a] Added my_strcpy function 1 files changed, 13 insertions(+), 0 deletions(-)
قبل از push او یک بار log ها را بازبینی میکند
[jerry@CentOS project]$ git log
دستورات بالا نتایج زیر را در برخواهند داشت:
commit e944e5aab74b26e7447d3281b225309e4e59efcd Author: Jerry Mouse <jerry@howcodex.com> Date: Wed Sep 11 08:41:42 2013 +0530 Added my_strcpy function commit d1e19d316224cddc437e3ed34ec3c931ad803958 Author: Jerry Mouse <jerry@howcodex.com> Date: Wed Sep 11 08:05:26 2013 +0530 Changed return type of my_strlen to size_t commit 19ae20683fc460db7d127cf201a1429523b0e319 Author: Tom Cat <tom@howcodex.com> Date: Wed Sep 11 07:32:56 2013 +0530 Initial commit
Jerry خوشحال از کارهایش، میخواهد تغییرات را push کند
[jerry@CentOS project]$ git push origin master
دستورات بالا نتایج زیر را در برخواهند داشت:
To gituser@git.server.com:project.git ! [rejected] master −> master (non-fast-forward) error: failed to push some refs to 'gituser@git.server.com:project.git' To prevent you from losing history, non-fast-forward updates were rejected Merge the remote changes before pushing again. See the 'Note about fast-forwards' section of 'git push --help' for details.
اما git به Jerry اجازه نمیدهد تا تغییراتش را push کند. به این دلیل که git تشخیص میدهد که remote repository یا git server یا انبار روی سرور، با انبار محلی Jerry همگامسازی 1 نشدهاند و این باعث خواهد شد که Jerry بخشی از تاریخچه پروژه را از دست داده باشد و یا از دست بدهد. به همین دلیل برای جلوگیری کردن از این اتفاق ناخوشایند, git عملی push توسط Jerry را رد 4 میکند. حالا Jerry ابتدا باید انبار محلی خودش را به روزرسانی کند، سپس و فقط بعد از آن میتواند تغییرات خودش را push کند
Jerry دستور git pull را اجرا میکند تا انبار محلیاش را با remote repository همگام سازد
[jerry@CentOS project]$ git pull
دستور بالا نتایج زیر را نشان میدهد:
remote: Counting objects: 5, done. remote: Compressing objects: 100% (3/3), done. remote: Total 3 (delta 1), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From git.server.com:project d1e19d3..cea2c00 master −> origin/master First, rewinding head to replay your work on top of it... Applying: Added my_strcpy function
بعد از عملیات Jerry, Pull با git log ها را مشاهده میکند تا ببیند چه تغییراتی ایجاد شده اند و commit ای که Tom انجام داده بود را با commit IDمقابل پیدا میکند cea2c000f53ba99508c5959e3e12fff493ba6f69
[jerry@CentOS project]$ git log
دستور بالا نتایج زیر را نشان میدهد:
commit e86f0621c2a3f68190bba633a9fe6c57c94f8e4f Author: Jerry Mouse <jerry@howcodex.com> Date: Wed Sep 11 08:41:42 2013 +0530 Added my_strcpy function commit cea2c000f53ba99508c5959e3e12fff493ba6f69 Author: Tom Cat <tom@howcodex.com> Date: Wed Sep 11 08:32:07 2013 +0530 Changed char pointer to const char pointer commit d1e19d316224cddc437e3ed34ec3c931ad803958 Author: Jerry Mouse <jerry@howcodex.com> Date: Wed Sep 11 08:05:26 2013 +0530 Changed return type of my_strlen to size_t commit 19ae20683fc460db7d127cf201a1429523b0e319 Author: Tom Cat <tom@howcodex.com> Date: Wed Sep 11 07:32:56 2013 +0530 Initial commit
حالا انبار محلی Jerry با انبار git server به روزرسانی شده است. او حالا میتواند با خیال آسوده تغییراتش را push کند
[jerry@CentOS project]$ git push origin master
دستور بالا نتایج زیر را نشان میدهد:
Counting objects: 5, done. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 455 bytes, done. Total 3 (delta 1), reused 0 (delta 0) To gituser@git.server.com:project.git cea2c00..e86f062 master −> master