git → গিট
Git (version control system)
সাধারণত কোডের রিভিশন রাখার জন্য গিট ব্যাবহার করা হয় । ভার্সন কন্টোল হচ্ছে এমন একটি পদ্ধতি যা আপনার প্রজেক্টের(project) বিভিন্ন সময়ের পরিবর্তনগুলো সংরক্ষণ করে রাখে। গিটে ডিরেক্টরিকেই ব্যাসিকালি রিপোজিটরি (Repository) বা শর্টকাটে অনেকে ‘রিপো (Repo)’ বলে।
ভার্সন কন্ট্রোল সিস্টেমের প্রকারভেদ :
- Centralized version control system(CVCS)
- Distributed version control system(DVCS)
CVCS :
একটি কেন্দ্রীয় সার্ভারে আপলোড করা থাকে সব ফাইল, ব্যাবহারকারির কাছে কোন কপি থাকে না । CVCS এর প্রধান অসুবিধা হল কোন কারণে কেন্দ্রীয় host ক্ষতিগ্রস্ত হলে পুরো প্রজেক্ট ক্ষতিগ্রস্ত হবে । জনপ্রিয় সার্ভার গুলো হল : একুরেভ, ক্লিয়ার কেস , সাব ার্সন , পারফরস ইত্যাদি
DVCS :
সকল ব্যাবহারকারী নিজ নিজ কম্পিউটারে পুরো প্রজেক্ট টি কপি করে নেয় এবং লোকাল কম্পিউটারে প্রয়োজনীয় এডিটিং এর কাজ করা হয় তারপর কেন্দ্রীয় সার্ভারে টা আপলোড করা হয় । এর প্রধান সুবিধা হল কেন্দ্রীয় সার্ভার বা কোন ব্যাবহারকারীর কম্পিউটারে থাকা প্রজেক্ট corrupt হয়ে গেলে অন্য কোন কম্পিউটারে থাকা প্রজেক্ট থেকে restore করা যায় । জনপ্রিয় DVCS গুলো হল গিট, মারকিউরেল, জিএনইউ বাজার, মিত, বিটবাকেট ইত্যাদি ।
গিট কমান্ড
git init
-একটি নতুন রিপোজিটরি(repository) তৈরি করার জন্য।git clone
– পূর্ব থেকে বিদ্যমান কোন রিপোজিটরির সম্পূর্ণ তথ্য ডাউনলোড করার জন্যgit commit
– অফলাইন(offline) রিপোজিটরিতে স্থায়ীভাবে কাজ সংযুক্ত করার জন্য অর্থাৎ যে কাজ করলাম সেটা রেজিস্টার বা রেকর্ড করা ।git pull
– রিমোট(remote) রিপোজিটরি থেকে ফাইল ডাউনলোড করে অফলাইন রিপোজিটরির সাথে merge করার জন্যgit push
– অফলাইন রিপোজিটরি থেকে ফাইল রিমোট রিপোজিটরিতে আপলোড করার জন্য
কাজের ধাপসমূহ :
আমরা যখন লোকাল(local) রিপোজিটরিতে কোন পরিবর্তন করি তখন আমরা working directory-তে থাকি। git add কমান্ড দেয়ার পর সেটা staging area তে যায় এবং git commit কমান্ড দেয়ার পর সেটা স্থায়িভাবে লোকাল রিপোজিটরিতে যুক্ত হয়। পরবর্তিতে চাইলে সেটা রিমোট রিপোজিটরিতে git push কমান্ড দিয়ে আপলোড করে দেয়া যায়।
গিট ইন্সটল :
sudo apt-get install git
গিট কনফিগারেশন :
গিট কনফিগার করার মূল উদ্দেশ্য হচ্ছে, আপনি যখন গিট এর মাধ্যমে কমিট(commit) করবেন তখন কমিটের সাথে সে আপনার তথ্য সংরক্ষণ করে রাখবে। কনফিগারেশনের সময় আপনাকে শুধু আপনার user name এবং email address বলে দিতে হবে।
git config --global user.name "Your Name Here"
git config --global user.email "your_email@youremail.com"
আপনি কোন একটি রিপজিটরির জন্য গিটের গ্লোবাল কনফিগারেশনকে পরিবর্তন অথবা ওভাররাইট করতে পারেন। আপনি যদি কোন একটি রিপজিটরির জন্য name এবং email পরিবর্তন করতে চান তাহলে terminal দিয়ে রিপজিটরিতে গিয়ে নিচের কমান্ডগুলো দেন।
git config --local user.name "Your Name Here"
git config --local user.email "your_email@youremail.com"
এখনে আপনি যে নাম এবং ইমেইল দিবেন তা শধুমাত্র এই রিপোজিটরির জন্য কনফিগার হবে। আপনার লোকাল কনফিগার .git/config ফাইল এ সংরক্ষিত হয়। Linux/Mac ব্যবহারকারীরা terminal-এ নিচের কমান্ড দিয়ে লোকাল কনফিগারেশন এর ফাইলটি দেখতে পারেন।
কিন্তু আপনি যদি চান একাধিক প্রজেক্টের জন্য একাধিক নাম ও ইমেইল থাকবে তাহলে global কীওয়ার্ড ও তার আগের হাইফেন দুটো কেটে দিন
git config user.name "Jahangir alam"
git config user.email "d**r@gmail.com"
আপনি নিচের কমান্ড দিয়ে আপনার গিট কনফিগারেশন একসাথে দেখতে পারবেন।
git config --list
vim
vim .git/config
গিটের ভার্সন দেখার জন্য নিচের কমান্ড ইউজ করা হয়
git --version
গিটের বর্তমান অবস্তা দেখার জন্য নিচের কমান্ড ইউজ হয়
git status
গিট এ সাধারণত unix/linux এর সব ধরনের কমান্ড সাপোর্ট করে
ls
- কোন ফোল্ডারের কি কি ফাইল আছে সে গুলো দেখার জন্য
ls -al
- hidden ফাইল, ফোল্ডার যাই থাকুক না কেনও সব দেখাবে
clear
- bash ক্লিয়ার করার জন্য ইউজ করা হয় এই কমান্ড
Repository র নাম সাধারণত ছোট হাতে অক্ষরে এবং একাধিক ওয়ার্ড থাকলে সাধারণত ড্যাশ(-) চিহ্ন দিয়ে আলাদা করা হয় (Conventional rule) কোন particular extention file গিটে অন্তর্ভুক্ত করতে না চাইলে .gitignore ফাইলে তা বলে দিতে হবে
touch .gitignore
এখন যে ফাইল এক্সটেনশন গিটে অন্তর্ভুক্ত করতে না চান সেটা এই ফাইলের মদ্ধে বলে দিতে হবে ।
gitinore website এ গিয়ে যে ফ্রেমওয়ার্ক নিয়ে কাজ করতে চাই সেটার নাম লিখে create বাটনে ক্লিক করলে ওরা নতুন একটা gitignore ফাইল বানিয়ে দিবে
ফাইল create :
echo "This is message" >> file-name.txt
যদি ভীম ইন্সটল থাকে তাহলে নিচের কমান্ড দিয়ে ফাইল এডিট করা যায়
vim <file-name>
অথবা touch \<file-name>
এই কমান্ড দিয়েও ফাইল ক্রিয়েট করা যায়
ফাইলের ভেতর কি আছে সেটা দেখার জন্য নিচের কমান্ড ইউজ হয়
cat simpletext.txt
ফাইল delete/remove :
ফাইল ডিলিট করার জন্য নিচের কমান্ড ইউজ হয়
git rm file-name.txt
git এর এই কমান্ড দিলে গিট থেকে ডিলিট হয়ে যায় এরপর কমিট দিতে হয়
rm -rf file-name.txt
আর bash এর মাধ্যমে এই কমান্ড দিলে লোকাল থেকে ডিলিট হয়ে যায় কিন্তু গিট সেটা জানে না তখন নিচের কমান্ড দিতে হয়
git add -u
এরপর কমিট দিতে হয় ।
Moving a file
git এর মাধ্যমে মুভ করতে হয় নিচের নিয়মে ।
কিন্তু আমরা যখন ম্যানুয়ালি কোন ফাইল বা ডিরেক্টরি মুভ করবো তখন কিন্তু গিট সেটা জানবে না, তাই সে একটু ভিন্ন আচরণ করবে । তখন আমাদেরকে কমিট করার পূর্বে নিচের কমান্ড দিয়ে অ্যাড করে এরপর কমিট করতে হবে ।
git add -u
add :
git add -A
- stages All (new, modified, deleted)
git add .
- stages new and modified without deleted
git add -u
- stages modified and deleted without new
particula কোন ফাইল এড করতে চাইলে নিচের মতো করে রেফারেন্স সহ দিয়ে দিতে হবে
git add file_name.txt
বা অন্য কোন ডিরেক্টরিতে থাকলে সেইটা বলে দিতে হবে । গিটে ফাইলে এড করা মানে হল স্টেজিং এরিয়াতে নিয়ে যাওয়া তারপরে ফাইল কমিট করতে হয় । স্টেজিং এরিয়া থেকে যে কোন ধরনের চেঞ্জ করা যায় সেটা git history কোন প্রভাব পরে না ।
commit :
commit:
git commit -m "First commit, this is a message about file"
add and commit in single command:
git commit -am "commit, this is a message about those file"
nano বা vim টেক্সট এডিটর ইন্সটল থাকলে শুধু git commit
লিখে ইন্টার দিলেই ঐ এডিটর ওপেন হবে, এখানেই ম্যাসেজ এডিট করতে পারবেন । মাল্টিপল ফাইল এড করার পড় কমিট দিলে সব ফাইলে একই কমিট এড হয়ে যাবে কিন্তু সিঙ্গেল ফাইল এড করার পড় শুধু সেই ফাইলে কমিট এড হবে ।
diff
immediate পূর্বের কমিটে কোন ফাইল কি অবস্থায় ছিল আর এখন কি অবস্তায় আছে অর্থাৎ কোন ফাইলে কি কি পরিবর্তন হয়েছে সেটা দেখার জন্য নিচের এই কমান্ড ইউজ করা হয় ।
git diff HEAD .
git diff <commit-log-number > <commit-log-number>
দুইটা কমিটের মদ্ধে কি কি পার্থক্য আছে সেইটা দেখাবে
git log --grep=”<pattern>”
এই pattern টেক্সট এর সাথে যে কমিট ম্যাসেজটা মিলবে সেই কমিটটা খুঁজে নিয়ে আসবে
ভুলে কোন কমিট দিয়ে ফেল্লে reset
করতে হয় কিন্তু ঐ কমিটটা যদি push
হয়ে যায় তাহলে আর ভুলেও reset
করা যাবে না ।
diff সাধারণভাবে ২ টা ফাইলের মধ্যে অথবা ২ টা কমিটের মধ্যে পার্থক্যটা দেখায়
log :
git log
existent কোন ফাইলকে মডিফাই করলে সেই ফাইলটা untrack হয়ে যায় তাই পুনরায় আবার স্টেজিং এরিয়াতে নিয়ে যেতে হয় অর্থাৎ add করতে হয় ।
git log
কমান্ডটা দিলে এ পর্যন্ত যতবার কমিট করা হয়েছে তার লিস্ট দেখাবে ।
git diff
কমান্ড এর মাদ্ধমে কি মিডিফাই হয়েছে সেটা দেখা যাবে (যদি staging বা add হয়ে যায় তাহলে এই কমান্ড কাজ করবে না )
git diff --staged
staging বা add হয়ে যাওয়ার পরও মডিফাইটা দেখাবে
git log --online
এটা দিলে লগ সংক্ষেপে দেখাবে
git show <commit-id-number>
দিলে ঐ particular কমিটে কি চেঞ্জ হয়েছে সেইটা দেখাবে
git diff <commit-1-id> <commit-2-id>
দিলে ঐ দুইটা কমিটে কি পার্থক্য সেটা দেখাবে
এখন আপনার বর্তমান ওয়ার্কিং ডিরেক্টরি আগের একটা ভার্শনে রয়েছে। কিন্তু আপনি যদি মাস্টার ব্রাঞ্চে যেতে চান তাহলে আবার চেক-আউট দিতে হবে এভাবে git checkout master
git log -<limit>
লিমিটের এইখানে ৫ দিলে লাস্ট ৫ টা কমিট দেখাবে
push :
যদি কোন ফোল্ডার git initialization করা না থাকে তাহলে নিচের কমান্ড টা ব্যাবহার করতে হবে
git clone <url>
আর যদি git initialize করা থাকে তাহলে শুধু রিমোটটা Add করতে হবে
git remote add origin <url>
origin এর জায়গান অন্য কোন নামেও রিমোট এড করা যেতে পারে । একটা প্রজেক্ট এ একাধিক রিমোট এড করা যায় । এর পড় কোন ফাইল কোন রিমোট এ পুশ করার জন্য নিচের কমান্ডটা ইউজ হয়
git push <remote-name> <branch-name>
এখানে remote_name এর জায়গায় সাধারণত origin হয় কারণ যে কোন রিমোট সাধারণত ডিফল্টভাবে অরিজিন নামেই সেভ হয় । আর branch_name এর জায়গায় সাধারণত master লিখতে হয়, তবে অন্য কোন ব্রাঞ্চ এ কাজ করলে সেই ব্রাঞ্চ এর নাম দিতে হয়
branching :
সাধারণত টিমে কাজ করার সময় ব্রাঞ্চে কাজ করে পরবর্তীতে মাস্টার ব্রাঞ্চে marge করে দেওয়ার জন্য এই branching টা ব্যাবহার করা হয় ।
git branch <branch-name>
নতুন কোন ব্রাঞ্চ তৈরি করতে গেলে এভাবে কমান্ড লিখতে হয়
git branch
কয়টা ব্রাঞ্চ আছে সেটা চেক করতে গেলে উপরের এই কমান্ড দিতে হয়
git checkout <branch-name>
অন্য কোন ব্রাঞ্চ এ যেতে চাইলে এভাবে কমান্ড দিতে হয়
git checkout -b <branch-name>
আমরা যদি চাই যে কোন ব্রাঞ্চ তৈরি করে সাথে সাথে ঐ ব্রাঞ্চ এ শিফট করতে তাহলে এই কমান্ড দিতে হয়
git branch -D <branch-name>
কোন ব্রাঞ্চ ডিলিট করার জন্য এই কমান্ড দিতে হয়
git checkout master
master branch
এ ফিরে যেতে এই কমান্ড দিতে হয়
git merge
অন্য কোন ব্রাঞ্চ এ মডিফাই করা কোড গুলো মাস্টার ব্রাঞ্চ এ merge করতে চাইলে এই কমান্ড দিতে হয়
stash
ব্রাঞ্চে কাজ করার সময় কোন ব্রাঞ্চের ফাইলে যদি কমিট না করা হয় তখন ঐ ফাইলটা অন্য সকল ব্রাঞ্চেই দেখাবে এমন কি মাস্টার ব্রাঞ্চের কোন ফাইল যদি অন্য কোন ব্রাঞ্চ থেকে মডিফাই করা হয় কিন্তু কমিট করা হয় নাই তখনও সকল ব্রাঞ্চে ঐ মডিফাইড ফাইলটা দেখাবে । আর এই সমস্যার জন্যই stash
ব্যাবহার করতে হয় ।
কোন ব্রাঞ্চে stash command দিলে সেই untrack ফাইলগুলা hide হয়ে যায় আবার যখন stash pop কমান্ড দেওয়া হয় তখন সেই ফাইলটা আবার শো করবে ।
git stash
git stash pop
এরপর ফাইলগুলোয় কাজ শেষ হয়ে গেলে ব্রাঞ্চে add করে commit দিতে হয় ।
revert
পূর্বের কমিটে ফিরে যাওয়ার জন্য এই কমান্ড ব্যাবহার করতে হয় ।
git revert <commit-id>
গিটের লগ থেকে এই লগ আইডি কালেক্ট করতে হয় । লগের প্রথম কয়েকটা লেটার নিলেই হয়ে যায় । git revert দিলে ঐ commit id র পজিশনে চলে যায় প্রজেক্ট । এখন আবার আমরা যদি চাই যে কি চেঞ্জ হয়েছিল ঐ কমিটে তাহলে নিচের এই কমান্ড দিলে দেখা যাবে ।
git checkout <commit-id>
Github SSH key
SSH key সেটআপ করলে প্রতিবার গিটহাবে কোড পুশ করার সময় পাসওয়ার্ড লাগে না ।
তিনটি ধাপে SSH key সেটআপ করতে হয় ।
- লোকাল কম্পিউটারে SSH key জেনারেট করতে হবে ।
- SSH Agent এ সেই key টা অ্যাড করতে হবে ।
- এরপর SSH public key টা Github account এ সেভ করে দিতে হবে ।
Step 1: Generate an SSH Key
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
টার্মিনালে এই কমান্ডটি দিলে প্রথমে কোথায় SSH key জেনারেট হবে সেই ডিরেক্টরিটি সেট করে দিতে হয় । কোন ডিরেক্টরি না দিয়ে শুধু Enter দিলে ডিফল্ট ডিরেক্টটিতে সেভ হয় ।
এরপর পাসওয়ার্ড চায় , পাসওয়ার্ড দিলে কি জেনারেট হয়ে যাবে ।
Step 2: Add Your SSH Key to your SSH Agent
প্রথমে লোকাল কম্পিউটারের SSH agent enable করে নিতে হয় ।
eval "$(ssh-agent -s)"
এরপর key ইউজ করার জন্য সেট করে নিতে হবে ।
ssh-add ~/.ssh/id_rsa
এখন আমাদের লোকাল কম্পিউটারের SSH agent জানে কোন SSH key ইউজ করতে হবে । এরপর সবকিছু সেটআপ হয়ে গেলে Github এ বলে দিতে হবে ।
Step 3: Add the SSH Key to GitHub
এখন টার্মিনালের ক্লিপবোর্ডে SSH key কপি করে গিটহাবের SSH সেকশনে পেস্ট করে দিতে হবে । কিন্তু লিনাক্সে ডিফল্ট কোন keyboard copy সিস্টেম নাই সেইজন্য xclip ইন্সটল করে নিতে হয় লিনাক্সে
sudo apt-get install xclip
copy in clipboard
xclip -sel clip < ~/.ssh/id_rsa.pub
MacOS
pbcopy < ~/.ssh/id_rsa.pub
Windows
clip < ~/.ssh/id_rsa.pub
কিবোর্ড এ ssh key কপি হয়ে গেলে গিটহাবের একাউন্টে গিয়ে ssh সেকশনে গিয়ে new SSH key ক্লিক করে সেটআপ করতে হবে ।
ssh -T git@github.com
create a new repository
echo "# django_rest_api" >> README.md
git init
git add README.md
git commit -m "for single file commit"
git commit -am "for multifile commit"git remote add origin git@github.com:droidjahangir/django_rest_api.git
git push -u origin master
or push an existing repository
git remote add origin git@github.com:droidjahangir/django_rest_api.gitgit push -u origin master