تعارف کے بجائے
ہیلو! آج ہم ایک ورژن کنٹرول سسٹم کے بارے میں بات کرنے جا رہے ہیں، یعنی Git۔
گٹ کی بنیادی باتیں
گٹ ہمارے کوڈ کے لیے تقسیم شدہ ورژن کنٹرول سسٹم ہے۔ ہمیں اس کی ضرورت کیوں ہے؟ تقسیم شدہ ٹیموں کو اپنے کام کے انتظام کے لیے کسی قسم کے نظام کی ضرورت ہوتی ہے۔ وقت کے ساتھ رونما ہونے والی تبدیلیوں کو ٹریک کرنے کی ضرورت ہے۔ یعنی، ہمیں مرحلہ وار دیکھنے کے قابل ہونے کی ضرورت ہے کہ کون سی فائلیں بدلی ہیں اور کیسے۔ یہ خاص طور پر اہم ہے جب آپ اس بات کی تحقیقات کر رہے ہوں کہ کسی ایک کام کے تناظر میں کیا تبدیلی آئی ہے، تبدیلیوں کو واپس کرنا ممکن بناتا ہے۔Git انسٹال کرنا
آئیے آپ کے کمپیوٹر پر جاوا انسٹال کریں۔ونڈوز پر انسٹال کرنا
ہمیشہ کی طرح، آپ کو ایک exe فائل ڈاؤن لوڈ اور چلانے کی ضرورت ہے۔ یہاں سب کچھ آسان ہے: پہلے گوگل لنک پر کلک کریں ، انسٹال کریں، اور بس۔ ایسا کرنے کے لیے، ہم ونڈوز کے ذریعے فراہم کردہ باش کنسول استعمال کریں گے۔ ونڈوز پر، آپ کو گٹ باش چلانے کی ضرورت ہے۔ یہ اسٹارٹ مینو میں کیسا لگتا ہے:

لینکس پر انسٹال کرنا
عام طور پر گٹ لینکس کی تقسیم کا حصہ ہوتا ہے اور پہلے سے انسٹال ہوتا ہے، کیونکہ یہ ایک ایسا ٹول ہے جو اصل میں لینکس کرنل کی ترقی کے لیے لکھا گیا تھا۔ لیکن ایسے حالات ہوتے ہیں جب ایسا نہیں ہوتا۔ چیک کرنے کے لیے، آپ کو ٹرمینل کھول کر لکھنا ہوگا: git --version۔ اگر آپ کو ایک قابل فہم جواب ملتا ہے، تو کچھ بھی انسٹال کرنے کی ضرورت نہیں ہے. ٹرمینل کھولیں اور Ubuntu پر Git انسٹال کریں ۔ میں Ubuntu پر کام کر رہا ہوں، اس لیے میں آپ کو بتا سکتا ہوں کہ اس کے لیے کیا لکھنا ہے: sudo apt-get install git۔macOS پر انسٹال کرنا
یہاں بھی، آپ کو پہلے یہ چیک کرنے کی ضرورت ہے کہ آیا Git پہلے سے موجود ہے۔ اگر آپ کے پاس یہ نہیں ہے، تو اسے حاصل کرنے کا سب سے آسان طریقہ یہ ہے کہ یہاں سے تازہ ترین ورژن ڈاؤن لوڈ کریں ۔ اگر Xcode انسٹال ہے، تو Git یقینی طور پر خود بخود انسٹال ہو جائے گا۔گٹ کی ترتیبات
گٹ کے پاس اس صارف کے لیے صارف کی ترتیبات ہیں جو کام جمع کرائے گا۔ یہ سمجھ میں آتا ہے اور ضروری ہے، کیونکہ جب کمٹ بنایا جاتا ہے تو گٹ مصنف فیلڈ کے لیے یہ معلومات لیتا ہے۔ درج ذیل کمانڈز چلا کر اپنے تمام پروجیکٹس کے لیے صارف نام اور پاس ورڈ ترتیب دیں۔
git config --global user.name "Ivan Ivanov"
git config --global user.email ivan.ivanov@gmail.com
اگر آپ کو کسی مخصوص پروجیکٹ کے لیے مصنف کو تبدیل کرنے کی ضرورت ہے، تو آپ "--عالمی" کو ہٹا سکتے ہیں۔ یہ ہمیں مندرجہ ذیل دے گا:
git config user.name "Ivan Ivanov"
git config user.email ivan.ivanov@gmail.com
تھوڑا سا نظریہ...
موضوع میں غوطہ لگانے کے لیے، ہمیں آپ کو چند نئے الفاظ اور افعال سے متعارف کرانا چاہیے...- گٹ ذخیرہ
- عزم
- شاخ
- ضم
- تنازعات
- کھینچنا
- دھکا
- کچھ فائلوں کو کیسے نظر انداز کریں (.gitignore)
گٹ میں سٹیٹس
گٹ کے کئی مجسمے ہیں جنہیں سمجھنے اور یاد رکھنے کی ضرورت ہے:- ٹریک نہیں کیا گیا
- ترمیم شدہ
- اسٹیج کیا
- عزم
آپ کو یہ کیسے سمجھنا چاہئے؟
یہ وہ سٹیٹس ہیں جو ہمارے کوڈ پر مشتمل فائلوں پر لاگو ہوتے ہیں:- ایک فائل جو بنائی گئی ہے لیکن ابھی تک ذخیرہ میں شامل نہیں ہوئی ہے اس کی حیثیت "غیر ٹریک شدہ" ہے۔
- جب ہم ان فائلوں میں تبدیلیاں کرتے ہیں جو پہلے ہی گٹ ریپوزٹری میں شامل کی جا چکی ہیں، تو ان کی حیثیت "تبدیل" ہو جاتی ہے۔
- ہم نے جن فائلوں کو تبدیل کیا ہے ان میں سے، ہم ان کو منتخب کرتے ہیں جن کی ہمیں ضرورت ہے، اور ان کلاسوں کو "مرحلہ" کی حیثیت میں تبدیل کر دیا گیا ہے۔
- مرحلہ وار حالت میں تیار فائلوں سے ایک کمٹ بنایا جاتا ہے اور گٹ ریپوزٹری میں جاتا ہے۔ اس کے بعد، "مرحلے" کی حیثیت کے ساتھ کوئی فائلیں نہیں ہیں. لیکن پھر بھی ایسی فائلیں ہو سکتی ہیں جن کی حیثیت "ترمیم شدہ" ہے۔

عہد کیا ہے؟
جب ورژن کنٹرول کی بات آتی ہے تو کمٹ اہم واقعہ ہوتا ہے۔ اس میں کمٹ شروع ہونے کے بعد کی گئی تمام تبدیلیاں شامل ہیں۔ کمٹ ایک ساتھ منسلک فہرست کی طرح جڑے ہوئے ہیں۔ مزید خاص طور پر: پہلا عہد ہے۔ جب دوسرا عہد بنتا ہے، تو یہ جانتا ہے کہ پہلے کے بعد کیا آتا ہے۔ اور اس طریقے سے معلومات کو ٹریک کیا جا سکتا ہے۔ ایک کمٹ کی اپنی معلومات بھی ہوتی ہیں، نام نہاد میٹا ڈیٹا:- کمٹ کا منفرد شناخت کنندہ، جو اسے تلاش کرنے کے لیے استعمال کیا جا سکتا ہے۔
- کمٹ کے مصنف کا نام، جس نے اسے تخلیق کیا۔
- کمٹ کی تخلیق کی تاریخ
- ایک تبصرہ جو بیان کرتا ہے کہ کمٹ کے دوران کیا کیا گیا تھا۔

شاخ کیا ہے؟
ایک شاخ کچھ کمٹمنٹ کی طرف اشارہ کرتی ہے۔ کیونکہ ایک کمٹ جانتا ہے کہ کون سا کمٹ اس سے پہلے ہے، جب کوئی برانچ کسی کمٹ کی طرف اشارہ کرتی ہے تو وہ تمام پچھلی کمٹیں بھی اس پر لاگو ہوتی ہیں۔ اس کے مطابق، ہم یہ کہہ سکتے ہیں کہ آپ کے پاس جتنی شاخیں ہیں ایک ہی عہد کی طرف اشارہ کرنا چاہتے ہیں۔ کام شاخوں میں ہوتا ہے، اس لیے جب کوئی نیا کمٹ بنایا جاتا ہے، تو برانچ اپنے پوائنٹر کو حالیہ کمٹ کی طرف لے جاتی ہے۔Git کے ساتھ شروع کرنا
آپ اکیلے مقامی ذخیرہ کے ساتھ ساتھ ریموٹ کے ساتھ بھی کام کر سکتے ہیں۔ مطلوبہ احکامات پر عمل کرنے کے لیے، آپ اپنے آپ کو مقامی ذخیرہ تک محدود کر سکتے ہیں۔ یہ صرف پراجیکٹ کی تمام معلومات مقامی طور پر .git فولڈر میں محفوظ کرتا ہے۔ اگر ہم ریموٹ ریپوزٹری کے بارے میں بات کر رہے ہیں، تو تمام معلومات ریموٹ سرور پر کہیں محفوظ ہوتی ہیں: پروجیکٹ کی صرف ایک کاپی مقامی طور پر محفوظ کی جاتی ہے۔ آپ کی مقامی کاپی میں کی گئی تبدیلیوں کو ریموٹ ریپوزٹری میں (گٹ پش) دھکیل دیا جا سکتا ہے۔ یہاں اور نیچے ہماری بحث میں، ہم کنسول میں گٹ کے ساتھ کام کرنے کے بارے میں بات کر رہے ہیں۔ بلاشبہ، آپ کسی قسم کا GUI پر مبنی حل استعمال کر سکتے ہیں (مثال کے طور پر IntelliJ IDEA)، لیکن پہلے آپ کو یہ معلوم کرنا چاہیے کہ کون سے کمانڈز پر عمل درآمد ہو رہا ہے اور ان کا کیا مطلب ہے۔Git کے ساتھ مقامی ذخیرہ میں کام کرنا
اس کے بعد، میرا مشورہ ہے کہ آپ اس پر عمل کریں اور ان تمام اقدامات کو انجام دیں جو میں نے مضمون کو پڑھتے ہوئے کیے تھے۔ اس سے مواد کی آپ کی سمجھ اور مہارت میں بہتری آئے گی۔ ٹھیک ہے، بھوک! :) ایک مقامی ذخیرہ بنانے کے لیے، آپ کو لکھنا ہوگا:
git init

git status

- git add -A - تمام فائلوں کو "مرحلہ" کی حیثیت میں شامل کریں۔
- git شامل کریں. - اس فولڈر اور تمام ذیلی فولڈرز سے تمام فائلیں شامل کریں۔ بنیادی طور پر، یہ پچھلے ایک کے طور پر ایک ہی ہے
- git add <file name> - ایک مخصوص فائل شامل کرتا ہے۔ یہاں آپ کچھ پیٹرن کے مطابق فائلوں کو شامل کرنے کے لیے ریگولر ایکسپریشن استعمال کر سکتے ہیں۔ مثال کے طور پر، git add *.java: اس کا مطلب ہے کہ آپ صرف جاوا ایکسٹینشن کے ساتھ فائلیں شامل کرنا چاہتے ہیں۔
git add *.txt
اسٹیٹس چیک کرنے کے لیے، ہم پہلے سے معلوم کمانڈ استعمال کرتے ہیں:
git status

git commit -m "all txt files were added to the project"

git log

git status

git status

git diff

git add test_resource.txt
git commit -m "added hello word! to test_resource.txt"
تمام عہدوں کو دیکھنے کے لیے لکھیں:
git log

git add GitTest.java
git commit -m "added GitTest.java"
git status

.gitignore کے ساتھ کام کرنا
واضح طور پر، ہم صرف ماخذ کوڈ کو اکیلے رکھنا چاہتے ہیں، اور کچھ نہیں، ذخیرہ میں۔ تو اور کیا ہو سکتا ہے؟ کم از کم، مرتب شدہ کلاسز اور/یا فائلیں جو ترقیاتی ماحول سے تیار ہوتی ہیں۔ گٹ کو ان کو نظر انداز کرنے کے لیے بتانے کے لیے، ہمیں ایک خاص فائل بنانے کی ضرورت ہے۔ یہ کریں: پروجیکٹ کی جڑ میں .gitignore نامی فائل بنائیں۔ اس فائل میں ہر لائن نظر انداز کرنے کے پیٹرن کی نمائندگی کرتی ہے۔ اس مثال میں، .gitignore فائل اس طرح نظر آئے گی:
```
*.class
target/
*.iml
.idea/
```
آئیے ایک نظر ڈالتے ہیں:
- پہلی لائن یہ ہے کہ کلاس ایکسٹینشن کے ساتھ تمام فائلوں کو نظر انداز کیا جائے۔
- دوسری لائن "ٹارگٹ" فولڈر اور اس میں موجود ہر چیز کو نظر انداز کرنا ہے۔
- تیسری لائن .iml ایکسٹینشن والی تمام فائلوں کو نظر انداز کرنا ہے۔
- چوتھی لائن .idea فولڈر کو نظر انداز کرنا ہے۔
git status


git add .gitignore
git commit -m "added .gitignore file"
اور اب سچائی کا لمحہ: ہمارے پاس ایک مرتب شدہ کلاس GitTest.class ہے جو "untracked" ہے، جسے ہم Git repository میں شامل نہیں کرنا چاہتے تھے۔ اب ہمیں .gitignore فائل کے اثرات دیکھنا چاہئے:
git status

شاخوں وغیرہ کے ساتھ کام کرنا
قدرتی طور پر، صرف ایک برانچ میں کام کرنا تنہا ڈویلپرز کے لیے تکلیف دہ ہے، اور جب ایک ٹیم میں ایک سے زیادہ افراد ہوں تو یہ ناممکن ہے۔ یہی وجہ ہے کہ ہماری شاخیں ہیں۔ جیسا کہ میں نے پہلے کہا، ایک شاخ صرف کمٹ کرنے کے لیے ایک متحرک پوائنٹر ہے۔ اس حصے میں، ہم مختلف برانچوں میں کام کرنے کا جائزہ لیں گے: تبدیلیوں کو ایک برانچ سے دوسری میں کیسے ضم کیا جائے، کیا تنازعات پیدا ہو سکتے ہیں، اور بہت کچھ۔ ذخیرہ میں موجود تمام شاخوں کی فہرست دیکھنے اور یہ سمجھنے کے لیے کہ آپ کس میں ہیں، آپ کو لکھنا ہوگا:
git branch -a

- جس میں ہم ہیں اس کی بنیاد پر ایک نئی برانچ بنائیں (99% کیسز)
- ایک مخصوص عہد کی بنیاد پر ایک برانچ بنائیں (1% مقدمات)
آئیے ایک مخصوص عہد کی بنیاد پر ایک برانچ بنائیں
ہم کمٹ کے منفرد شناخت کنندہ پر بھروسہ کریں گے۔ اسے تلاش کرنے کے لیے ہم لکھتے ہیں:
git log

git checkout -b development 6c44e53d06228f888f2f454d3cb8c1c976dd73f8
ماسٹر برانچ سے صرف پہلے دو کمٹ کے ساتھ ایک برانچ بنائی جاتی ہے۔ اس کی توثیق کرنے کے لیے، ہم سب سے پہلے اس بات کو یقینی بناتے ہیں کہ کسی مختلف برانچ میں جائیں اور وہاں کمٹ کی تعداد دیکھیں:
git status
git log

git branch -a

آئیے موجودہ کی بنیاد پر ایک برانچ بنائیں
برانچ بنانے کا دوسرا طریقہ یہ ہے کہ اسے کسی اور سے بنایا جائے۔ میں ماسٹر برانچ پر مبنی برانچ بنانا چاہتا ہوں۔ سب سے پہلے، مجھے اس پر سوئچ کرنے کی ضرورت ہے، اور اگلا مرحلہ ایک نیا بنانا ہے۔ آئیے ایک نظر ڈالتے ہیں:- git checkout master — ماسٹر برانچ پر جائیں۔
- git status - تصدیق کریں کہ ہم اصل میں ماسٹر برانچ میں ہیں۔

git checkout -b feature/update-txt-files

تنازعات کے حل
اس سے پہلے کہ ہم یہ دریافت کریں کہ تنازعہ کیا ہے، ہمیں ایک شاخ کو دوسری شاخ میں ضم کرنے کے بارے میں بات کرنے کی ضرورت ہے۔ اس تصویر میں ایک شاخ کو دوسری میں ضم کرنے کے عمل کو دکھایا گیا ہے:

git add *.txt
git commit -m "updated txt files"
git log

git checkout master
git merge feature/update-txt-files
git log

git branch -D feature/update-txt-files
اب تک سب کچھ واضح ہے، ہاں؟ آئیے صورتحال کو پیچیدہ بناتے ہیں: اب ہم کہتے ہیں کہ آپ کو txt فائل کو دوبارہ تبدیل کرنے کی ضرورت ہے۔ لیکن اب یہ فائل ماسٹر برانچ میں بھی تبدیل کر دی جائے گی۔ دوسرے الفاظ میں، یہ متوازی طور پر تبدیل ہو جائے گا. گٹ یہ نہیں جان سکے گا کہ جب ہم اپنے نئے کوڈ کو ماسٹر برانچ میں ضم کرنا چاہتے ہیں تو کیا کرنا ہے۔ چلو! ہم ماسٹر کی بنیاد پر ایک نئی شاخ بنائیں گے، text_resource.txt میں تبدیلیاں کریں گے، اور اس کام کے لیے کمٹمنٹ بنائیں گے۔
git checkout -b feature/add-header
... we make changes to the file

git add *.txt
git commit -m "added header to txt"

git checkout master
… we updated test_resource.txt

git add test_resource.txt
git commit -m "added master header to txt"
اور اب سب سے دلچسپ نکتہ: ہمیں فیچر/ایڈ-ہیڈر برانچ سے ماسٹر میں تبدیلیاں ضم کرنے کی ضرورت ہے۔ ہم ماسٹر برانچ میں ہیں، لہذا ہمیں صرف لکھنے کی ضرورت ہے:
git merge feature/add-header
لیکن نتیجہ test_resource.txt فائل میں تصادم کی صورت میں نکلے گا: 

- ماسٹر برانچ میں جو تبدیلیاں اس لائن پر تھیں وہ "<<<<<<< HEAD" اور "=======" کے درمیان پائی جاتی ہیں۔
- جو تبدیلیاں فیچر/add-header برانچ میں تھیں وہ "=======" اور ">>>>>> فیچر/add-header" کے درمیان پائی جاتی ہیں۔

git status

git add *.txt

git commit

دور دراز کے ذخیروں کے ساتھ کام کرنا
آخری مرحلہ کچھ اور کمانڈز کا پتہ لگانا ہے جو ریموٹ ریپوزٹری کے ساتھ کام کرنے کے لیے درکار ہیں۔ جیسا کہ میں نے کہا، ریموٹ ریپوزٹری وہ جگہ ہوتی ہے جہاں ریپوزٹری کو محفوظ کیا جاتا ہے اور جہاں سے آپ اسے کلون کرسکتے ہیں۔ دور دراز کے ذخیرے کس قسم کے ہیں؟ مثالیں:-
GitHub ذخیرہ اندوزی اور تعاون پر مبنی ترقی کے لیے سب سے بڑا سٹوریج پلیٹ فارم ہے۔ میں نے پہلے ہی پچھلے مضامین میں اس کی وضاحت کی ہے۔
مجھے GitHub پر فالو کریں ۔ میں اکثر ان علاقوں میں اپنا کام دکھاتا ہوں جہاں میں کام کے لیے پڑھ رہا ہوں۔ -
GitLab اوپن سورس کے ساتھ DevOps لائف سائیکل کے لیے ایک ویب پر مبنی ٹول ہے ۔ یہ اپنے ویکی، بگ ٹریکنگ سسٹم ، CI/CD پائپ لائن، اور دیگر فنکشنز کے ساتھ کوڈ ریپوزٹری کے انتظام کے لیے گٹ پر مبنی نظام ہے۔ اس خبر کے بعد کہ مائیکروسافٹ نے گٹ ہب خریدا، کچھ ڈویلپرز نے اپنے پروجیکٹس کو گٹ لیب میں نقل کیا۔
-
BitBucket مرکیوریل اور گٹ ورژن کنٹرول سسٹمز پر مبنی پروجیکٹ کی میزبانی اور باہمی تعاون کے لیے ایک ویب سروس ہے۔ ایک وقت میں اسے GitHub پر ایک بڑا فائدہ تھا کہ اس نے مفت نجی ذخیروں کی پیشکش کی تھی۔ پچھلے سال، GitHub نے بھی یہ صلاحیت سب کے لیے مفت میں متعارف کرائی تھی۔
-
اور اسی طرح…
git clone https://github.com/romankh3/git-demo
اب اس منصوبے کی مکمل مقامی کاپی موجود ہے۔ اس بات کا یقین کرنے کے لیے کہ پروجیکٹ کی مقامی کاپی تازہ ترین ہے، آپ کو لکھ کر پروجیکٹ کو کھینچنا ہوگا:
git pull


git add test_resource.txt
git commit -m "prepared txt for pushing"
اسے ریموٹ ریپوزٹری میں دھکیلنے کا حکم ہے:
git push

مفید لنک
- سرکاری گٹ دستاویزات ۔ میں اسے بطور حوالہ تجویز کرتا ہوں۔
GO TO FULL VERSION