در این دوره Git را با اجرای دستورها در ترمینال یاد میگیرید و هر commit و شاخه را روی نمودار زندهٔ مخزن میبینید. issue، pull request و بازبینی کد را هم در یک GitHub شبیهسازیشده تمرین میکنید.
git init -q
echo "DinaShop" > README.md
git status --short
git add README.md
git commit -m "first commit"
git log --oneline
$ git init -q $ echo "DinaShop" > README.md $ git status --short ?? README.md $ git add README.md $ git commit -m "first commit" [main (root-commit) eac6791] first commit 1 file changed, 1 insertion(+) create mode 100644 README.md $ git log --oneline eac6791 first commit
پوشه به مخزن Git تبدیل میشود، یک فایل ثبت میشود و تاریخچه اولین commit را نشان میدهد. نمونههای دیگر
دوره داستان یک برنامهنویس تازه در تیم فروشگاه DinaShop است. هر فصل یک موقعیت تازه از کار تیمی را پیش میآورد.
مخزن میسازید، فایلها را commit میکنید و وضعیت را با status و log میخوانید. پشت صحنهٔ یک commit را هم با blob و tree میبینید.
فرق پوشهٔ کار، staging و HEAD را یاد میگیرید، فقط بخشی از تغییرها را stage میکنید و diff را میخوانید.
با یک فایل .gitignore رمزها و فایلهای اضافه را بیرون از مخزن نگه میدارید و پیام یا محتوای آخرین commit را درست میکنید.
روی شاخهٔ جدا کار میکنید، آن را به سه روش ادغام میکنید و با stash کار نیمهتمام را کنار میگذارید تا یک باگ فوری را درست کنید.
مخزن را به GitHub وصل میکنید، push، fetch، pull و clone را به کار میبرید و کارتان را با کار همکاران هماهنگ میکنید.
تعارض را حل میکنید، تاریخچه را با rebase مرتب میکنید و با reflog کاری را که از دست رفته به نظر میرسد برمیگردانید.
از issue تا شاخه و pull request پیش میروید، PR کوچک و پیشنویس میسازید، کد همکار را بازبینی میکنید و نتیجهٔ CI را میخوانید.
commit خراب را با bisect پیدا میکنید، رفع باگ را با cherry-pick به شاخهٔ انتشار میبرید، با revert تغییر را برمیگردانید و نسخه را تگ میزنید.
rebase تعاملی، hook، محافظت از شاخهٔ main، CODEOWNERS، fork و روشهای کار تیمی مثل GitHub Flow را یاد میگیرید.
در پایان سه بخش دوره یک مخزن بههمریخته تحویل میگیرید: تاریخچه را پیش از دمو تمیز میکنید، مخزنی خراب را نجات میدهید و در آخر کل چرخهٔ PR تا انتشار نسخه را اجرا میکنید.
این شش جلسهٔ کوتاه ترمینال را برای همین صفحه نوشتهایم. دستورها را در کد میبینید و خروجی Git را کنار آن.
پوشه به مخزن Git تبدیل میشود، یک فایل ثبت میشود و تاریخچه اولین commit را نشان میدهد.
git init -q
echo "DinaShop" > README.md
git status --short
git add README.md
git commit -m "first commit"
git log --oneline
$ git init -q $ echo "DinaShop" > README.md $ git status --short ?? README.md $ git add README.md $ git commit -m "first commit" [main (root-commit) eac6791] first commit 1 file changed, 1 insertion(+) create mode 100644 README.md $ git log --oneline eac6791 first commit
یک خط از فایل عوض میشود. diff همان تغییر را نشان میدهد و status میگوید تغییر کجاست: فقط در پوشهٔ کار، یا آمادهٔ commit.
git init -q
echo "body { color: black; }" > styles.css
git add . && git commit -qm "add styles"
echo "body { color: navy; }" > styles.css
git status --short
git diff
git add styles.css
git status --short
git commit -m "style: navy text"
$ git init -q
$ echo "body { color: black; }" > styles.css
$ git add . && git commit -qm "add styles"
$ echo "body { color: navy; }" > styles.css
$ git status --short
M styles.css
$ git diff
diff --git a/styles.css b/styles.css
index 6f5b686..7eca41b 100644
--- a/styles.css
+++ b/styles.css
@@ -1 +1 @@
-body { color: black; }
+body { color: navy; }
$ git add styles.css
$ git status --short
M styles.css
$ git commit -m "style: navy text"
[main 0ed1cf6] style: navy text
1 file changed, 1 insertion(+), 1 deletion(-)دکمهٔ سبد خرید روی شاخهٔ جدا ساخته میشود و همزمان main هم جلو میرود. merge دو مسیر را به هم میرساند و log نمودار آن را میکشد.
git init -q
echo "<h1>DinaShop</h1>" > index.html
git add . && git commit -qm "feat: storefront"
git switch -c cart
echo "<button>cart</button>" >> index.html
git commit -qam "feat: cart button"
git switch main
echo "body { margin: 0; }" > styles.css
git add . && git commit -qm "style: base css"
git merge --no-edit cart
git log --oneline --graph
$ git init -q
$ echo "<h1>DinaShop</h1>" > index.html
$ git add . && git commit -qm "feat: storefront"
$ git switch -c cart
Switched to a new branch 'cart'
$ echo "<button>cart</button>" >> index.html
$ git commit -qam "feat: cart button"
$ git switch main
Switched to branch 'main'
$ echo "body { margin: 0; }" > styles.css
$ git add . && git commit -qm "style: base css"
$ git merge --no-edit cart
Merge made by the 'ort' strategy.
index.html | 1 +
1 file changed, 1 insertion(+)
$ git log --oneline --graph
* b704c73 Merge branch 'cart'
|\
| * c29e7d6 feat: cart button
* | b2addbb style: base css
|/
* 7c0435d feat: storefrontیک مخزن خالی نقش GitHub را دارد. کار شما push میشود، همکارتان مریم آن را clone میکند و تغییری میفرستد، و pull آن تغییر را به رایانهٔ شما میآورد.
git init -q --bare ../github.git
git init -q
echo "DinaShop" > README.md
git add . && git commit -qm "first commit"
git remote add origin ../github.git
git push -u origin main
# مریم مخزن را میگیرد، خطی اضافه میکند و میفرستد
git clone -q ../github.git ../maryam
echo "Contact: hello@dinashop.ir" >> ../maryam/README.md
git -C ../maryam commit -qam "docs: contact"
git -C ../maryam push -q
git pull
cat README.md
$ git init -q --bare ../github.git $ git init -q $ echo "DinaShop" > README.md $ git add . && git commit -qm "first commit" $ git remote add origin ../github.git $ git push -u origin main To ../github.git * [new branch] main -> main branch 'main' set up to track 'origin/main'. $ git clone -q ../github.git ../maryam $ echo "Contact: hello@dinashop.ir" >> ../maryam/README.md $ git -C ../maryam commit -qam "docs: contact" $ git -C ../maryam push -q $ git pull From ../github eac6791..7baf691 main -> origin/main Updating eac6791..7baf691 Fast-forward README.md | 1 + 1 file changed, 1 insertion(+) $ cat README.md DinaShop Contact: hello@dinashop.ir
دو شاخه قیمت یک کالا را دو جور عوض کردهاند. Git جای تعارض را در فایل علامت میزند، قیمت نهایی نوشته میشود و merge تمام میشود.
git init -q
echo "price: 100" > product.txt
git add . && git commit -qm "add product"
git switch -qc sale
echo "price: 80" > product.txt
git commit -qam "sale price"
git switch -q main
echo "price: 120" > product.txt
git commit -qam "new price"
git merge sale
cat product.txt
# قیمت نهایی را مینویسیم و merge را تمام میکنیم
echo "price: 90" > product.txt
git add product.txt
git commit -q --no-edit
git log --oneline --graph
$ git init -q $ echo "price: 100" > product.txt $ git add . && git commit -qm "add product" $ git switch -qc sale $ echo "price: 80" > product.txt $ git commit -qam "sale price" $ git switch -q main $ echo "price: 120" > product.txt $ git commit -qam "new price" $ git merge sale Auto-merging product.txt CONFLICT (content): Merge conflict in product.txt Automatic merge failed; fix conflicts and then commit the result. $ cat product.txt <<<<<<< HEAD price: 120 ======= price: 80 >>>>>>> sale $ echo "price: 90" > product.txt $ git add product.txt $ git commit -q --no-edit $ git log --oneline --graph * c59e06f Merge branch 'sale' |\ | * ac5ac03 sale price * | a75dd07 new price |/ * 8492b1a add product
یک reset اشتباه commit آخر را از تاریخچه بیرون میاندازد. reflog هر جایی را که HEAD بوده است به خاطر دارد، پس commit گمشده با یک دستور برمیگردد.
git init -q
echo "v1" > app.txt
git add . && git commit -qm "v1"
echo "v2" > app.txt
git commit -qam "fix: payment bug"
git reset --hard HEAD~1
git log --oneline
git reflog
git reset --hard HEAD@{1}
git log --oneline
$ git init -q
$ echo "v1" > app.txt
$ git add . && git commit -qm "v1"
$ echo "v2" > app.txt
$ git commit -qam "fix: payment bug"
$ git reset --hard HEAD~1
HEAD is now at 54c0c4e v1
$ git log --oneline
54c0c4e v1
$ git reflog
54c0c4e HEAD@{0}: reset: moving to HEAD~1
4c2736b HEAD@{1}: commit: fix: payment bug
54c0c4e HEAD@{2}: commit (initial): v1
$ git reset --hard HEAD@{1}
HEAD is now at 4c2736b fix: payment bug
$ git log --oneline
4c2736b fix: payment bug
54c0c4e v1هر درس یک موقعیت از کار در تیم است و یک هدف مشخص دارد، مثل نجات یک commit یا حل یک تعارض.
هر دستور روی موتور Git داخل مرورگر اجرا میشود و نمودار commitها و شاخهها همان لحظه تغییر میکند.
وضعیت مخزن با هدف درس مقایسه میشود. اگر جایی گیر کردید، راهنمای همان تمرین قدمبهقدم کمکتان میکند.
| موضوع | دینا کد | آموزش ویدیویی |
|---|---|---|
| دستورها | خودتان در ترمینال اجرا میکنید. | اجرای آنها را تماشا میکنید. |
| شاخهها و commitها | روی نمودار زنده همان لحظه دیده میشوند. | باید از روی خروجی ترمینال مدرس تصورشان کنید. |
| تعارض و همکاری | همکاران داستان دوره کار push میکنند و شما با تعارض روبهرو میشوید. | برای تمرین یک همکار و یک مخزن مشترک لازم دارید. |
| یک اشتباه بزرگ | با «بازنشانی» مخزن تمرین به حالت اول برمیگردد. | مخزن را باید خودتان درست کنید. |
بعد از دوره، همین دستورها را روی رایانهٔ خودتان و در پروژهٔ واقعی به کار میبرید.
۲۴ سرفصل، ۱۲۵ درس، ۱۲۰ تمرین
درسهای اول رایگان است و برای شروع پرداختی لازم نیست. هر وقت خواستید ادامه دهید، همین دوره را بخرید یا با اشتراک پرو همهٔ دورهها را باز کنید.
۸ درس ابتدایی رایگان است. برای ادامه، اشتراک بگیرید یا دوره را بخرید.
بدون نیاز به پرداخت مبلغی برای شروع
اگر تاکنون نسخههای پروژه را با کپی کردن پوشه نگه داشتهاید و میخواهید مثل یک تیم نرمافزاری کار کنید.
Git ابزار روزمرهٔ تیمهای نرمافزاری است. این دوره شما را برای شاخه، pull request و بازبینی کد در تیم آماده میکند.
اگر add و commit را میدانید ولی با rebase، تعارض یا یک reset اشتباه گیر میکنید.
پیشنیاز: یک رایانه و یک مرورگر. آشنایی با برنامهنویسی کمک میکند، ولی لازم نیست.
اولین commit خودتان را همین امروز در مرورگر ثبت کنید. شروع رایگان است و در کمتر از دو دقیقه وارد محیط یادگیری میشوید.