Git - مدیریت Branch ها



Branch به ما اجازه میدهد که یک مسیر جدید برای توسعه کدها ایجاد کنیم. ما میتوانیم از این امکان برای ایجاد دو جهت مختلف برای توسعه کدها استفاده کنیم. برای مثال ما نسخه 6ام را منتشر کردهایم و حالا میتوانیم یک branch برای توسعه نسخه و یک هم برای اصلاح bug ها ایجاد کنیم

ایجاد Branch

Tom یک branch جدید با استفاده از git branch<branch name> ایجاد میکند. ما میتوانیم داخل یک branch, branch جدیدی ایجاد کنیم. میتوانیم از یک commit خاص یا یک tag به عنوان نقطه شروع استفاده کنیم. اگر یک commit خاص را انتخاب نکنیم branch از head pointer به عنوان نقطه شروع استفاده میکند

[jerry@CentOS src]$ git branch new_branch

[jerry@CentOS src]$ git branch
* master
new_branch

Branch جدید ایجاد شد Tom از دستور git branch برای لیست کردن branch های موجود استفاده میکند. دستور git show قبل از دستور git checkout نقطه فعلی را نشانه دار میکند

در زیر نمایش تصویری ایجاد branch آورده شده است:

git Tutorial git Tutorial

تغییر Branch

Jerry از git checkout برای تغییر branch استفاده میکند

[jerry@CentOS src]$ git checkout new_branch
Switched to branch 'new_branch'
[jerry@CentOS src]$ git branch
master
* new_branch

میانبر برای ایجاد و انتخاب branch

در مثال بالا ما از دو دستور برای ایجاد و انتخاب branch استفاده کردیم. git با git checkout -b علاوه بر ایجاد branch آن را انتخاب هم میکند

[jerry@CentOS src]$ git checkout -b test_branch
Switched to a new branch 'test_branch'

[jerry@CentOS src]$ git branch
master
new_branch
* test_branch

پاک کردن Branch

یک branch را با استفاده از git branch -d میتوانیم پاک کنیم. اما با پاک کردن یک branch به یک branch دیگر منتقل میشویم.

Jerry اکنون در test_branch است، میخواهد آن را پاک کند. بنابراین ابتدا branch را تغییر میدهد سپس آن را پاک میکند

[jerry@CentOS src]$ git branch
master
new_branch
* test_branch

[jerry@CentOS src]$ git checkout master
Switched to branch 'master'

[jerry@CentOS src]$ git branch -D test_branch
Deleted branch test_branch (was 5776472).

حالا فقط دو branch میبینیم

[jerry@CentOS src]$ git branch
* master
new_branch

تغییر نام Branch

Jerry تصمیم گرفت که یک پشتیبان برای wide characters در پروژه string ها ایجاد کند. او یک branch جدید ایجاد کردهبود که نامش مناسب نبود. بنابراین او با دستورهای old branch name -m, new branch name -m اینکار را انجام میدهد

[jerry@CentOS src]$ git branch
* master
new_branch

[jerry@CentOS src]$ git branch -m new_branch wchar_support

در حال حاضر، دستور شعبه دستگاه گوارش خواهد شد به نام شعبه جدید نشان می دهد.

[jerry@CentOS src]$ git branch
* master
wchar_support

متصل کردن دو Branch

Jerry یک تابع برای بازگرداندن طول یک رشته برای wide character نوشته است، کد جدید به شکل زیر است

[jerry@CentOS src]$ git branch
master
* wchar_support

[jerry@CentOS src]$ pwd
/home/jerry/jerry_repo/project/src

[jerry@CentOS src]$ git diff

دستورات بالا نتایج زیر را در برخواهند داشت:

t a/src/string_operations.c b/src/string_operations.c
index 8ab7f42..8fb4b00 100644
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@ -1,4 +1,14 @@
#include <stdio.h>
+#include <wchar.h>
+
+size_t w_strlen(const wchar_t *s)
+
{
   +
   const wchar_t *p = s;
   +
   +
   while (*p)
   + ++p;
   + return (p - s);
   +
}

بعد از تست کردن commit و تغییرات را push میکند:

[jerry@CentOS src]$ git status -s
M string_operations.c
?? string_operations

[jerry@CentOS src]$ git add string_operations.c

[jerry@CentOS src]$ git commit -m 'Added w_strlen function to return string lenght of wchar_t
string'

[wchar_support 64192f9] Added w_strlen function to return string lenght of wchar_t string
1 files changed, 10 insertions(+), 0 deletions(-)

دقت کنیم Jerry این تغییرات را در داخل branch جدیدpush کرد، این همان دلیلی است که او از wchar_support برای نام branch به جای master branch استفاده کرد

[jerry@CentOS src]$ git push origin wchar_support   <−−− Observer branch_name

دستورات بالا نتایج زیر را در برخواهند داشت:

Counting objects: 7, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 507 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
To gituser@git.server.com:project.git
* [new branch]
wchar_support -> wchar_support

بعد از commit کردن تغییرات در branch, branch جدید به شکل زیر درخواهد آمد

git Tutorial

Tom کنجکاو است که ببیند Jerry در wchar_support چه کار میکند بنابراین از git log استفاده میکند

[tom@CentOS src]$ pwd
/home/tom/top_repo/project/src

[tom@CentOS src]$ git log origin/wchar_support -2

دستورات بالا نتایج زیر را در برخواهند داشت:

commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3
Author: Jerry Mouse <jerry@tutorialspoint.com>
Date: Wed Sep 11 16:10:06 2013 +0530

Added w_strlen function to return string lenght of wchar_t string


commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <tom@tutorialspoint.com>
Date: Wed Sep 11 10:21:20 2013 +0530

Removed executable binary

با مطالعه پیامهای commit ها Tom متوجه تابع strlen میشود، او میخواهد این تابع را در master branch داشته باشد. او تصمیم میگیرد کد Jerry را با merge کردن در master branch داشته باشد

[tom@CentOS project]$ git branch
* master

[tom@CentOS project]$ pwd
/home/tom/top_repo/project

[tom@CentOS project]$ git merge origin/wchar_support
Updating 5776472..64192f9
Fast-forward
src/string_operations.c | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)

بعد از merge کردن master branch مانند شکل زیر میشود

git Tutorial

حالا که wchar_support branch با merge, master branch شد، ما میتوانیم با دیدن commit ها آن را بازبینی کنیم، همچنین با دیدن دستکاری شدن فایل string_operation.c میتوانیم تغییرات را بازبینی کنیم

[tom@CentOS project]$ cd src/

[tom@CentOS src]$ git log -1

commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3
Author: Jerry Mouse 
Date: Wed Sep 11 16:10:06 2013 +0530

Added w_strlen function to return string lenght of wchar_t string

[tom@CentOS src]$ head -12 string_operations.c

دستورات بالا نتایج زیر را در برخواهند داشت:

#include <stdio.h>
#include <wchar.h>
size_t w_strlen(const wchar_t *s)
{
   const wchar_t *p = s;

   while (*p)
      ++p;

   return (p - s);
}

او بعد از تست کردن تغییرات، آنها را به oush, bramch master میکند

[tom@CentOS src]$ git push origin master
Total 0 (delta 0), reused 0 (delta 0)
To gituser@git.server.com:project.git
5776472..64192f9 master −> master

Rebase Branches

دستور ,git repase دستور merge برای branch هاست اما تفاوتش این است که با توجه به commit ها دستکاری را انجام میدهد.

Git merge, commit ها را از یک branch به بالای head pointer متعلق به branch مقصد منتقل و merge میکند. برای مثال در branch محلی ما commit ها را به ترتیب زیر داریم A−>B−>C−>D branch ای که میخواهیم merge کنیم دارای ترتیب زیر است A−>B−>X−>Y دستور branch, git merge محلی را به ترتیب زیر تبدیل میکند A−>B−>C−>D−>X−>Y دستور git rebase با توجه به اشتراکهای commit های قبلی دو ترتیب A−>B−>C−>D−>, A−>B−>X−>Yرا با هم ادغام میکند، و نتیجه چیزی شبیه ترتیب زیر میشود A−>B−>X−>Y−>C−>D

هنگامی که چند برنامهنویس روی یک remote repository کار میکنند، نمیتوانیم ترتیب commit ها را دستکاری کنیم، بنابراین بهتر است از rebase استفاده کنیم تا تغییرات به انتهای commit های قبلی اضافه شود

Advertisements