Branch به ما اجازه میدهد که یک مسیر جدید برای توسعه کدها ایجاد کنیم. ما میتوانیم از این امکان برای ایجاد دو جهت مختلف برای توسعه کدها استفاده کنیم. برای مثال ما نسخه 6ام را منتشر کردهایم و حالا میتوانیم یک branch برای توسعه نسخه و یک هم برای اصلاح bug ها ایجاد کنیم
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 آورده شده است:
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 استفاده کردیم. 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 را با استفاده از 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
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
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 جدید به شکل زیر درخواهد آمد
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@howcodex.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@howcodex.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 مانند شکل زیر میشود
حالا که 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 MouseDate: 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
دستور ,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 های قبلی اضافه شود