فرمانهای پایه گیت
ساختن نخستین مخزن و چرخهٔ روزمرهٔ گیت با init، status، add، commit، log و diff.
آنچه در این درس میآموزید
- یک مخزن گیت بسازید و وضعیت فایلها را بخوانید
- تغییرات را با add آماده و با commit ثبت کنید
- تاریخچهٔ پروژه و تفاوتهای نسخهها را با log و diff ببینید
فهرست مطالب
در درس پیش با سه ناحیهٔ گیت آشنا شدید: پوشهٔ کاری، ناحیهٔ آمادهسازی و مخزن. در این درس همان مسیر را با فرمانهای واقعی طی میکنیم. این چند فرمان ۹۰ درصد کار روزانهٔ شما با گیت است؛ آنقدر که بعد از چند روز بدون فکر کردن تایپشان میکنید.
هر مثال این درس را میتوانید در پوشهای خالی روی سیستم خودتان تکرار کنید. اگر روی ویندوز هستید، Git Bash را باز کنید.
ساختن مخزن
به پوشهٔ پروژه بروید و مخزن را بسازید:
mkdir todo-app
cd todo-app
git initنمونهٔ خروجی:
Initialized empty Git repository in /home/sara/todo-app/.git/دستور git init پوشهٔ پنهان .git را میسازد؛ همانجا که کل تاریخچهٔ پروژه از این به بعد ذخیره میشود. از این لحظه این پوشه یک مخزن گیت است. اگر پوشه را جابهجا یا کپی کنید، تاریخچه همراهش میرود.
دیدن وضعیت: git status
فرمان status پرکاربردترین فرمان گیت است؛ همیشه اجرایش کنید تا بدانید کجایید:
git statusدر مخزن تازه و خالی، گیت میگوید هنوز هیچ کامیتی وجود ندارد و چیزی هم برای ثبت نیست. حالا یک فایل بسازید و دوباره وضعیت را ببینید:
echo "print('hello')" > app.py
git statusنمونهٔ خروجی:
On branch main
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
app.py
nothing added to commit but untracked files present (use "git add" to track)کلمهٔ «Untracked» یعنی گیت این فایل را میبیند، اما هنوز تاریخچهای برایش ندارد و تغییراتش را دنبال نمیکند.
آمادهسازی: git add
با add فایل را به ناحیهٔ آمادهسازی میبرید:
git add app.py
git statusنمونهٔ خروجی:
On branch main
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: app.pyحالا فایل «آمادهٔ ثبت» است. سه شکل رایج این فرمان را بشناسید:
git add app.py # stage a single file
git add . # stage all changes in the current directory
git add -A # stage all changes across the repositoryثبت: git commit
با commit همهٔ چیزهای آمادهشده بهعنوان یک نقطهٔ ثابت در تاریخچه ذخیره میشوند. پیام را با گزینهٔ -m میدهید:
git commit -m "Add initial app file"نمونهٔ خروجی:
[main (root-commit) 3f2a1c9] Add initial app file
1 file changed, 1 insertion(+)
create mode 100644 app.pyخروجی میگوید کدام شاخه، با چه شناسهای (اینجا 3f2a1c9) و چند خط تغییر. اگر بعد از کامیت فایل را ویرایش کنید، git status آن را «modified» نشان میدهد و باید دوباره چرخهٔ add و سپس commit را طی کنید.
پیام کامیت را جدی بگیرید؛ شش ماه بعد تنها راه فهمیدن دلیل هر تغییر همان پیام است. عرف رایج این است که پیام کوتاه و دستوری باشد، مثل «Fix login error» بهجای «کارهایی کردم».
دیدن تاریخچه: git log
git log --onelineنمونهٔ خروجی:
3f2a1c9 (HEAD -> main) Add initial app fileهر سطر یک کامیت است: شناسهٔ کوتاه، اشارهگر HEAD (یعنی همینجا هستید) و پیام. HEAD به کامیت فعلی اشاره میکند؛ در درس «شاخهها» نقش آن پررنگتر میشود. بدون --oneline، فرمان git log نویسنده، تاریخ و پیام کامل هر کامیت را جداگانه نشان میدهد.
دیدن تفاوتها: git diff
diff دقیقاً نشان میدهد چه چیزی تغییر کرده، خطبهخط. فایل را ویرایش کنید:
echo "print('bye')" >> app.py
git diffنمونهٔ خروجی:
diff --git a/app.py b/app.py
index 3c4d5e6..8f9a0b1 100644
--- a/app.py
+++ b/app.py
@@ -1 +1,2 @@
print('hello')
+print('bye')سطرهای شروعشده با + اضافهشدهها و با - حذفشدهها هستند. دقت کنید که git diff فقط تفاوت «پوشهٔ کاری با ناحیهٔ آمادهسازی» را میدهد. برای دیدن تفاوت چیزهایی که با add آماده کردهاید و هنوز کامیت نشدهاند، گزینهٔ --staged را اضافه کنید:
git add app.py
git diff --stagedتمرینها
تمرین
تمرین ۱ — اولین مخزن کامل
یک پوشهٔ تازه بسازید، آن را مخزن کنید، فایلی به نام notes.txt با هر محتوایی بسازید، آن را ثبت کنید و در پایان تاریخچهٔ تکخطی را نشان دهید.
# Write your commands hereنمایش راهحل
mkdir my-project
cd my-project
git init
echo "my first note" > notes.txt
git add notes.txt
git commit -m "Add first note"
git log --onelineنمونهٔ خروجی:
7e1c4ab (HEAD -> main) Add first note:::
تمرین
تمرین ۲ — تفکیک تغییرها
در مخزن تمرین قبل، دو فایل تازه بسازید اما فقط یکی از آنها را add کنید. خروجی git status را بررسی کنید: کدام فایل «Changes to be committed» است و کدام «Untracked»؟ سپس فایل دوم را هم آماده و هر دو را با هم کامیت کنید.
# Write your commands hereنمایش راهحل
echo a > a.txt
echo b > b.txt
git add a.txt
git status --short
git add b.txt
git commit -m "Add a and b files"در git status --short فایل آمادهشده سطر A a.txt و فایل آمادهنشده سطر ?? b.txt را دارد. بعد از add دوم، هر دو در یک کامیت ثبت میشوند.
:::
خلاصه
git initپوشهٔ فعلی را مخزن میکند و تاریخچه در.gitذخیره میشود.git statusوضعیت فایلها را میگوید: untracked، آمادهشده یا ویرایششده.- چرخهٔ پایه این است: ویرایش کن،
git addکن،git commit -mبزن. git log --onelineتاریخچهٔ کوتاه وgit diffوgit diff --stagedتفاوتهای خطبهخط را نشان میدهند.
تا اینجا همهٔ کارها روی یک خط مستقیم تاریخچه انجام شد. در درس بعدی با شاخهها تاریخچه را منشعب میکنیم تا بدون بهخطر انداختن نسخهٔ اصلی، ریسک کنیم.