একটি ভূমিকার পরিবর্তে
হ্যালো! আজ আমরা একটি ভার্সন কন্ট্রোল সিস্টেম সম্পর্কে কথা বলতে যাচ্ছি, নাম গিট।
গিট বেসিক
গিট আমাদের কোডের জন্য একটি বিতরণকৃত সংস্করণ নিয়ন্ত্রণ ব্যবস্থা। কেন এটা আমাদের দরকার? বিতরণ করা দলগুলির তাদের কাজ পরিচালনার জন্য কিছু ধরণের সিস্টেমের প্রয়োজন। সময়ের সাথে সাথে ঘটে যাওয়া পরিবর্তনগুলি ট্র্যাক করার জন্য এটি প্রয়োজন। অর্থাৎ, আমাদের ধাপে ধাপে দেখতে হবে কোন ফাইলগুলো পরিবর্তন হয়েছে এবং কিভাবে। এটি বিশেষভাবে গুরুত্বপূর্ণ যখন আপনি একটি একক কাজের পরিপ্রেক্ষিতে কী পরিবর্তন হয়েছে তা তদন্ত করছেন, পরিবর্তনগুলিকে ফিরিয়ে আনা সম্ভব করে তোলে।গিট ইনস্টল করা হচ্ছে
আপনার কম্পিউটারে জাভা ইন্সটল করা যাক।উইন্ডোজে ইনস্টল করা হচ্ছে
যথারীতি, আপনাকে একটি exe ফাইল ডাউনলোড এবং চালাতে হবে। এখানে সবকিছুই সহজ: প্রথম Google লিঙ্কে ক্লিক করুন , ইনস্টল করুন, এবং এটিই। এটি করার জন্য, আমরা উইন্ডোজ দ্বারা প্রদত্ত ব্যাশ কনসোল ব্যবহার করব। উইন্ডোজে, আপনাকে গিট ব্যাশ চালাতে হবে। স্টার্ট মেনুতে এটি কেমন দেখায় তা এখানে:

লিনাক্সে ইনস্টল করা হচ্ছে
সাধারণত গিট লিনাক্স ডিস্ট্রিবিউশনের অংশ এবং ইতিমধ্যেই ইনস্টল করা আছে, যেহেতু এটি একটি টুল যা মূলত লিনাক্স কার্নেল ডেভেলপমেন্টের জন্য লেখা হয়েছিল। কিন্তু এমন পরিস্থিতি আছে যখন তা হয় না। চেক করতে, আপনাকে একটি টার্মিনাল খুলতে হবে এবং লিখতে হবে: git --version। আপনি যদি একটি বোধগম্য উত্তর পান, তাহলে কিছুই ইনস্টল করার দরকার নেই। একটি টার্মিনাল খুলুন এবং উবুন্টুতে গিট ইনস্টল করুন । আমি উবুন্টুতে কাজ করছি, তাই আমি আপনাকে বলতে পারি এর জন্য কী লিখতে হবে: sudo apt-get install git।MacOS এ ইনস্টল করা হচ্ছে
এখানেও, আপনাকে প্রথমে পরীক্ষা করতে হবে যে গিট ইতিমধ্যে সেখানে আছে কিনা। যদি আপনার কাছে এটি না থাকে, তাহলে এটি পাওয়ার সবচেয়ে সহজ উপায় হল সর্বশেষ সংস্করণটি এখানে ডাউনলোড করা । যদি Xcode ইনস্টল করা থাকে, তাহলে Git অবশ্যই স্বয়ংক্রিয়ভাবে ইনস্টল হয়ে যাবে।গিট সেটিংস
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
একটু তত্ত্ব...
বিষয়টিতে ডুব দেওয়ার জন্য, আমাদের আপনাকে কয়েকটি নতুন শব্দ এবং কাজের সাথে পরিচয় করিয়ে দেওয়া উচিত...- git সংগ্রহস্থল
- কমিট
- শাখা
- একত্রিত করা
- দ্বন্দ্ব
- টান
- ধাক্কা
- কিভাবে কিছু ফাইল উপেক্ষা করবেন (.gitignore)
গিট-এ স্ট্যাটাস
গিটের বেশ কয়েকটি মূর্তি রয়েছে যা বোঝা এবং মনে রাখা দরকার:- আনট্র্যাক করা
- পরিবর্তিত
- মঞ্চস্থ
- প্রতিশ্রুতিবদ্ধ
কিভাবে আপনি এই বোঝা উচিত?
এগুলি এমন স্থিতি যা আমাদের কোড ধারণকারী ফাইলগুলিতে প্রযোজ্য:- একটি ফাইল যা তৈরি করা হয়েছে কিন্তু এখনও সংগ্রহস্থলে যোগ করা হয়নি তার "আনট্র্যাকড" অবস্থা রয়েছে।
- যখন আমরা ফাইলগুলিতে পরিবর্তন করি যেগুলি ইতিমধ্যে গিট সংগ্রহস্থলে যুক্ত করা হয়েছে, তখন তাদের স্থিতি "পরিবর্তিত" হয়।
- আমরা যে ফাইলগুলি পরিবর্তন করেছি তার মধ্যে, আমরা আমাদের প্রয়োজনীয় ফাইলগুলি নির্বাচন করি এবং এই ক্লাসগুলি "মঞ্চস্থিত" স্থিতিতে পরিবর্তিত হয়।
- স্টেজড স্টেটে প্রস্তুত করা ফাইল থেকে একটি কমিট তৈরি করা হয় এবং গিট রিপোজিটরিতে যায়। এর পরে, "মঞ্চস্থ" স্থিতি সহ কোনও ফাইল নেই। কিন্তু এখনও ফাইল থাকতে পারে যার স্থিতি "পরিবর্তিত"।

একটি কমিট কি?
সংস্করণ নিয়ন্ত্রণের ক্ষেত্রে একটি প্রতিশ্রুতি প্রধান ঘটনা। এতে কমিট শুরু হওয়ার পর থেকে করা সমস্ত পরিবর্তন রয়েছে। প্রতিশ্রুতিগুলি এককভাবে লিঙ্কযুক্ত তালিকার মতো একসাথে সংযুক্ত থাকে। আরও নির্দিষ্টভাবে: একটি প্রথম প্রতিশ্রুতি আছে। যখন দ্বিতীয় কমিট তৈরি করা হয়, এটি প্রথমটির পরে কী আসে তা জানে। এবং এই পদ্ধতিতে, তথ্য ট্র্যাক করা যেতে পারে. একটি কমিটের নিজস্ব তথ্য রয়েছে, তথাকথিত মেটাডেটা:- কমিট এর অনন্য শনাক্তকারী, যা এটি খুঁজে পেতে ব্যবহার করা যেতে পারে
- কমিটের লেখকের নাম, যিনি এটি তৈরি করেছেন
- প্রতিশ্রুতি তৈরি হওয়ার তারিখ
- একটি মন্তব্য যা কমিটের সময় কী করা হয়েছিল তা বর্ণনা করে

একটি শাখা কি?
একটি শাখা কিছু কমিট একটি নির্দেশক. কারণ একটি কমিট জানে কোন কমিট এর আগে, যখন একটি শাখা একটি প্রতিশ্রুতি নির্দেশ করে, সেই সমস্ত পূর্ববর্তী কমিটগুলিও এটিতে প্রযোজ্য। তদনুসারে, আমরা বলতে পারি যে আপনি একই কমিটের দিকে নির্দেশ করে যতগুলি চান ততগুলি শাখা থাকতে পারে। কাজটি শাখাগুলিতে ঘটে, তাই যখন একটি নতুন প্রতিশ্রুতি তৈরি করা হয়, তখন শাখাটি তার পয়েন্টারকে আরও সাম্প্রতিক প্রতিশ্রুতিতে নিয়ে যায়।গিট দিয়ে শুরু করা
আপনি একা স্থানীয় সংগ্রহস্থলের পাশাপাশি দূরবর্তী একটির সাথে কাজ করতে পারেন। প্রয়োজনীয় কমান্ড অনুশীলন করতে, আপনি স্থানীয় সংগ্রহস্থলে নিজেকে সীমাবদ্ধ করতে পারেন। এটি শুধুমাত্র .git ফোল্ডারে স্থানীয়ভাবে প্রকল্পের সমস্ত তথ্য সংরক্ষণ করে। যদি আমরা রিমোট রিপোজিটরি সম্পর্কে কথা বলি, তাহলে সমস্ত তথ্য রিমোট সার্ভারে কোথাও সংরক্ষণ করা হয়: শুধুমাত্র প্রকল্পের একটি অনুলিপি স্থানীয়ভাবে সংরক্ষণ করা হয়। আপনার স্থানীয় অনুলিপিতে করা পরিবর্তনগুলি দূরবর্তী সংগ্রহস্থলে পুশ করা যেতে পারে (গিট পুশ)। এখানে এবং নীচে আমাদের আলোচনায়, আমরা কনসোলে গিটের সাথে কাজ করার বিষয়ে কথা বলছি। অবশ্যই, আপনি কিছু ধরণের GUI-ভিত্তিক সমাধান ব্যবহার করতে পারেন (উদাহরণস্বরূপ, IntelliJ IDEA), তবে প্রথমে আপনাকে বুঝতে হবে কোন কমান্ডগুলি কার্যকর করা হচ্ছে এবং তাদের অর্থ কী।একটি স্থানীয় সংগ্রহস্থলে গিটের সাথে কাজ করা
এরপরে, আমি পরামর্শ দিচ্ছি যে আপনি অনুসরণ করুন এবং নিবন্ধটি পড়ার সাথে সাথে আমি যে সমস্ত পদক্ষেপগুলি করেছি তা সম্পাদন করুন। এটি আপনার বোধগম্যতা এবং উপাদানের আয়ত্তকে উন্নত করবে। ভাল, ক্ষুধা! :) একটি স্থানীয় সংগ্রহস্থল তৈরি করতে, আপনাকে লিখতে হবে:
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/
```
একবার দেখা যাক:
- প্রথম লাইন হল .class এক্সটেনশন সহ সমস্ত ফাইল উপেক্ষা করা
- দ্বিতীয় লাইনটি হল "টার্গেট" ফোল্ডার এবং এতে থাকা সবকিছু উপেক্ষা করা
- তৃতীয় লাইন হল .iml এক্সটেনশন সহ সমস্ত ফাইল উপেক্ষা করা
- চতুর্থ লাইনটি হল .idea ফোল্ডারটিকে উপেক্ষা করা
git status


git add .gitignore
git commit -m "added .gitignore file"
এবং এখন সত্যের মুহূর্ত: আমাদের কাছে একটি সংকলিত ক্লাস GitTest.class আছে যা "আনট্র্যাকড" যা আমরা গিট সংগ্রহস্থলে যোগ করতে চাইনি। এখন আমাদের .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 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" এবং "=======" এর মধ্যে পাওয়া যায়৷
- বৈশিষ্ট্য/অ্যাড-হেডার শাখায় যে পরিবর্তনগুলি ছিল তা "=======" এবং ">>>>>>> বৈশিষ্ট্য/অ্যাড-হেডার" এর মধ্যে পাওয়া যায়।

git status

git add *.txt

git commit

রিমোট রিপোজিটরি নিয়ে কাজ করা
শেষ ধাপ হল রিমোট রিপোজিটরির সাথে কাজ করার জন্য প্রয়োজনীয় আরও কয়েকটি কমান্ড বের করা। আমি যেমন বলেছি, রিমোট রিপোজিটরি এমন কিছু জায়গা যেখানে রিপোজিটরি সংরক্ষণ করা হয় এবং যেখান থেকে আপনি এটি ক্লোন করতে পারেন। রিমোট রিপোজিটরি কি ধরনের আছে? উদাহরণ:-
GitHub হল রিপোজিটরি এবং সহযোগী উন্নয়নের জন্য সবচেয়ে বড় স্টোরেজ প্ল্যাটফর্ম। আমি ইতিমধ্যে পূর্ববর্তী নিবন্ধগুলিতে এটি বর্ণনা করেছি। গিটহাবে
আমাকে অনুসরণ করুন । আমি প্রায়ই সেখানে আমার কাজ দেখাই যে এলাকায় আমি কাজের জন্য পড়াশোনা করছি। -
GitLab হল ওপেন সোর্স সহ DevOps লাইফসাইকেলের জন্য একটি ওয়েব-ভিত্তিক টুল । এটি একটি গিট -ভিত্তিক সিস্টেম যার নিজস্ব উইকি, বাগ ট্র্যাকিং সিস্টেম , CI/CD পাইপলাইন এবং অন্যান্য ফাংশন সহ কোড সংগ্রহস্থল পরিচালনার জন্য । মাইক্রোসফ্ট গিটহাব কিনেছে এমন খবরের পরে, কিছু বিকাশকারী গিটল্যাবে তাদের প্রকল্পগুলি নকল করেছে।
-
BitBucket হল মারকিউরিয়াল এবং গিট সংস্করণ নিয়ন্ত্রণ সিস্টেমের উপর ভিত্তি করে প্রকল্প হোস্টিং এবং সহযোগী উন্নয়নের জন্য একটি ওয়েব পরিষেবা। এক সময়ে এটি 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