چگونه روند پیشرفت پروژه را کنترل کنیم ؟ کنترلورژن یا Git چیست ؟
فایلها/تغییرات پروژه را چطوری کنترل کنیم ؟
در وهلهٔ اوّل شاید بگید چه نیازیه ؟ خب برنامه رو مینویسیم و میریم دیگه !. درسته برنامهاتون را مینویسید و میروید؛ امّا به کجا چنین شتابان ؟ آیا همیشه برنامهٔ شما کوچکخواهد بود ؟ آیا قراره برنامهٔ شما در صد خط تمام بشه ؟ یا اینکه کلاً قصد توسعهاش رو دیگه ندارید ؟ خب شاید یکی دیگه داشت :).
فرض کنید برنامهٔتان را نوشتید :
void parsing(int argc, char **argv){
top = 0;
for (unsigned i=1; i < (unsigned)argc; i+=2){
listArgs[top].name = argv[i];
listArgs[top].value = argv[i+1];
top++;
}
}
خب، برنامهکار میکنه و میرید و یک هفتهٔ دیگه میاید و مثلاً خط : top = 0;
را حذف میکنید. و برنامه در اجرای اوّل درست کار میکنه؛ پیشخودتون میگید خب چه نیازی بود، الکی ماهم کد نوشتیم :). امّا بعداً در اجراهای متوالی برنامه شروع میکنه به دادن خروجیهای نامتعارف. اینجاس که باید ساعتها وقت بزارید و بگردید ببینید آخرینبار چه چیزی رو تغییر دادید و کدوم فایل را ویرایش کردید.
کار مسخره و اعصابخورد کنی میشه، درسته ؟. امّا برای مدیریت این دَنگٌوفَنگها میتونید از سیستمهایمدیریتپروژه استفاده بکنید. مثل Git حالا اینکه چرا گیت ؟ به خاطر اینکه راحتترینه و بهترینه. چرا ؟ چون امتحانش را پس داده، پروژهٔ بزرگ "کرنللینوکس" را داره مدیریت میکنه.
حالا بیاید ببینیم اگه ما ازت گیت (git) استفاده میکردیم، چطوری میتوانستیم بفهمیم که چه بلایی سر کد آمده :
۱- اوّل گزارشات را چک میکنم، تا ببینم آخرین گزارشی که از تغییرات ذخیره کردم چه بوده ؟:
$> git log
commit bb513a5f9ec429222de03afa690e7fa5d2fbdf6e (HEAD -> master)
Author: Ghasem Ramezani <g1999ramezani@gmail.com>
Date: Sun May 5 00:05:22 2019 +0430
create a bug
commit ab176fa8a282a74e6badfc285c0986bc66ee6b7d (origin/master, origin/HEAD)
Author: Ghasem Ramezani <g1999ramezani@gmail.com>
Date: Sat May 4 10:40:32 2019 +0430
make `top` to be 0 at first of parsing() function
and make class storage of listArgs to be `extern`
and getOption() function return "NULL" on Failure.
خب فهمیدم که آخرین تغییرم با عنوان create a bug ثبت شده، حالا باید از شناسهاش استفاده کنم.
۲- تغییراتی که در آن گزارش ثبت شده است را مشاهده میکنم. :
$> git show bb513a5f9ec429222de03afa690e7fa5d2fbdf6e
commit bb513a5f9ec429222de03afa690e7fa5d2fbdf6e (HEAD -> master)
Author: Ghasem Ramezani <g1999ramezani@gmail.com>
Date: Sun May 5 00:05:22 2019 +0430
create a bug
diff --git a/source/arg.c b/source/arg.c
index c776ff2..a75c91d 100644
--- a/source/arg.c
+++ b/source/arg.c
@@ -7,7 +7,6 @@ unsigned top=0;
struct ARGS listArgs[MAX_ARG];
void parsing(int argc, char **argv){
- top = 0;
for (unsigned i=1; i < (unsigned)argc; i+=2){
listArgs[top].name = argv[i];
listArgs[top].value = argv[i+1];
دیدی به چه سادگی توانستیم تغییری که دادیم را پیدا کنیم ؟ البته این انتهای ماجرا نیست ! الآن که متوجه شدیم در کدام گزارشما خرابکاری کردیم؛ کافیه که تغییرات را به گزارش قبل از خرابکاری برگردانیم :
$> git reset --hard ab176fa8a282a74e6badfc285c0986bc66ee6b7d
البته قابل ذکره که ما اینجا تنها داخل این گزارش فقط یک تغییر داشتیم، مسلماً کار میتونه کمی پیچیدهتر بشه اگه تغییرات زیاد باشن، که همیشه هستن .
چگونه با گیت (git) کار کنیم ؟
بسیار ساده، مسلماً اوّل نیاز دارید که این برنامه را نصب کنید. این برنامه به طور پیشفرض در سیستمعاملتون نصب نیست. کافیه که از مدیربستهٔ سیستمعاملتون کمک بگیرید، مثلاً برای Debian - Ubuntu - Ubuntu Mint به اینصورت کار تمام میشود :
$ apt install git
حالا بعد از نصب، نیاز دارید که مشخصاتتان را ثبت کنید، دقت کنید که تمام توضیحاتی که بنده میدهم را میتوانید بهصورت کاملتر از سایت گیت (git) دنبال کنید.
$> git config --global user.name "Ghasem Ramezani"
$> git config --global user.email "g1999ramezani@gmail.com"
$> git config --global core.editor emacs
دو مورد اوّل که واضح هستن، امّا مورد آخر دلبخواه خودتان هست، زمانیکه نیاز باشه گیت (git) ویرایشگرمتنی را جهت ویرایشباز بکند باید بداند که کدام ویرایشگر مورد علاقهٔ شماست. میتوانید هر برنامهای را قرار بدهید. امّا دقت کنید که بهترین ویرایشگرها میتوانند Vim, Emacs, Notepad++
باشند؛ فایل این تنظیمات را میتوانید از این مسیرها دنبال کنید :
User Space : ~/.gitconfig
System Wide: /etc/gitconfig
ساخت مخازن (repository)
خب حالا که نصب/پیکربندی انجام شد، کافیه که مخزن (repository) خودمان را راهاندازی کنیم. یک پروژهٔ جدید درست کنید و گیت (git) را مقداردهی (Initialize) کنید :
$> mkdir project ; cd project
$> git init
ما یک دایرکتوری به اسم project درست کردیم، و مخزن (repository) خودمان را با دستور git init
راهاندازی کردیم، یک سری فایلهایی گیت (git) برای ما داخل آن دایرکتوری با اسم .git
درست کرده.
تغییراتیکه نیاز رو انجام میدیم، مثلاً در وهلهٔ اوّل دایرکتوریها و فایلهای پروژه را راهاندازی میکنیم :
$> mkdir header source build object
$> touch header/arg.h source/arg.c Makefile
$> tree
.
├── build
├── Makefile
├── header
│ └── arg.c
├── object
└── source
└── arg.h
4 directories, 3 files
$>
اگه درمورد Makefile نمیدانید، میتوانید از اینجا با GNU Make و Makefile آشنا بشید.
الآن بد نیست که خروجی دستور git status
را ببینیم تا توضیحاتی در اینباره بدیم (این دستور، وضعیتجاری مخزنمان را نشان میدهد) :
$> git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
Makefile
header/
source/
nothing added to commit but untracked files present (use "git add" to track)
عکس زیر را مشاهدهکنید تا توضیحبهتری بدم :
فایلهای شما داخل گیت (git) دارای حالاتهای مختلفیهستن، به طورکلّی یا شناختهشدناند (tracked) یا ناشناختهاند (untracked)؛ فایلها/دایرکتوریهایی که ما بعد از مقداردهی مخزنمان ساختیم، در حالت ناشناخته (untracked) هستند. که خود گیت (git) هم همینرا به ما گفتهاست :
Untracked files:
(use "git add <file>..." to include in what will be committed)
برای اینکه شناختهشده (tracked) بشند، باید آنها را به صحنه (stage) ببریم. برای اینکار خود گیت گفتهاست که باید چه کرد که میتوانیم به دوصورت انجام دهیم :
$> git add Makefile source header
$> git add -A
خب حالا دوباره خروجی git status
را نگاه میکنیم :
$> git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: Makefile
new file: header/arg.c
new file: source/arg.h
الآن فایلهای ما به stage رفتند، و آمادهٔ اینهستند که گزارش (commit) بشوند. دقت کنید که Git از خِیر دایرکتوریهای خالی میگذرد.
حالا کافیهکه ما تغییراتی که دادیم را گزارش کنیم، که با دستور git commit
به دوصورت انجام میشود :
$> git commit
$> git commit -m "My Message"
در حالتاوّل، گیت ادیتور پیشفرضتان را باز میکند و از شما میخواهد که یک توضیحکوتاه درمورد تغییراتیکه دادهاید بنویسید، در حالتدوّم، شما مستقیم توضیحکوتاه خود را وارد میکنید. حال دوباره برگردیم و خروجی دستور git status
را ببینیم :
$> git status
On branch master
nothing to commit, working tree clean
خیلیهم عالی، این نشان دهندهٔ ایناست که ماهیچ فایل ناشناخته (َUntracked) یا دستکاریشده (Modified) یا درصحنه (Stage) نداریم. هنگامیکه تغییراتی را در فایلهای شناختهشده (Tracked) بدید، آن فایل از حالت دستکارینشده (Unmodified) به حالت دستکاریشده (Modified) درمیاید، که نیاز است شما تغییرات را درصورتنیاز وارد صحنه (Stage) کنید و بعد گزارشکنید (Commit).
حال تغییراتیاعمال میکنیم، و مراحلمورد نیاز تا درصحنه (Stage) بردنفایلها انجام میدهیم :
$> git add -A
$> git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: Makefile
modified: header/arg.h
modified: source/arg.c
امّا شاید شما نخواید که مثلاً Makefile گزارشش با مابقیه فایلها یکی باشه، و نیاز دارید که از Stage بیرون بیاریدش؛ دقّت کنید خود Git هم راهنمایی کرده که باید چهکار کرد :
$> git reset HEAD Makefile
$> git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: header/arg.h
modified: source/arg.c
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: Makefile
و حالا میتوانید به راحتی گزارش فایلهای خودتان را برای header/arg.h
و source/arg.c
بنویسید :
$> git commit -m "Done With Print() Function"
فایل .gitignore
بیاید تا make
را اجرا کنیم (درصورتیکه با GNU Make آشنا نیستید، برای آشنایی اینقسمت را مطالعه کنید) :
$> git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: Makefile
Untracked files:
(use "git add <file>..." to include in what will be committed)
build/
object/
no changes added to commit (use "git add" and/or "git commit -a")
اینجا دایرکتوریهای build و object هم اضافه شدند،امّا ما نیازی نداریم که Git این دایرکتوریها را مدیریت کند، پس کافیه که یک فایل به اسم .gitignore
درست کنیم. و فایلها و دایرکتوریهایی که نمیخواهیم Git آنها را دنبال کند را در آن ذکر کنیم :
$> echo -e "/build/*\n/object/*" > .gitignore
$> cat .gitignore
/build/*
/object/
$> git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: Makefile
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
no changes added to commit (use "git add" and/or "git commit -a")
و مشاهده میکنید که دیگر Git اخطاری برای دایرکتوریهای build و object نداد.
خب دوستان،امیدوارم دلیل اهمیّت Git و کلاً برنامههای کنترلورژن را درککرده باشید؛ امّا شرمنده، دنیای Git بزرگتر از آنچه هست که من بخوام خلاصهای از هر قسمت را در یک پست بازگو کنم؛ شدیداً پیشنهاد میکنم که اینکتاب را برای فراگیری هرچه بهتر Git بخوانید.
- موفق و پیروز باشید.
- 2
- 1
- 2
2 دیدگاه
نظرهای پیشنهاد شده