Git - عملیات بهروزرسانی


Advertisements

دستکاری توابع موجود

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 کند

گرفتن 5 آخرینتغییرات

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
Advertisements