৩.৫ গিট ব্রাঞ্চিং – রিমোট ব্রাঞ্চসমূহ
রিমোট ব্রাঞ্চসমূহ
রিমোট রেফারেন্স হল (পয়েন্টার) রিমোট রিপোজিটরির রেফারেন্সগুলো, যার মধ্যে রয়েছে ব্রাঞ্চসমূহ, ট্যাগ এবং আরও কিছু। আপনি রিমোট রেফারেন্সের একটি পুরো তালিকা পেতে পারেন git ls-remote <remote> ব্যবহারের মাধ্যমে, অথবা রিমোট ব্রাঞ্চের পাশাপাশি আরও বেশী তথ্যের জন্য git remote show <remote> চালাতে পারেন। তবুও, এর আরও একটি সাধারণ উপায় হল রিমোট-ট্র্যাকিং ব্রাঞ্চগুলোর সাহায্য নেওয়া।
রিমোট-ট্র্যাকিং ব্রাঞ্চগুলি মূলত রিমোট ব্রাঞ্চগুলির অবস্থার রেফারেন্স। তারা স্থানীয় রেফারেন্স যা আপনি সরাতে পারবেন না; আপনি যখনই কোনও নেটওয়ার্ক যোগাযোগ করেন তখনই গিট সেগুলিকে আপনার জন্য নিয়ে যায়, অবস্থায় আপনার রিমোট রিপোজিটরির ব্রাঞ্চগুলি, কোথায় ছিল এটি মনে করিয়ে দেয়ার জন্যে তাদের বুকমার্ক হিসেবে ভাবুন।
রিমোট-ট্র্যাকিং ব্রাঞ্চের নাম <remote>/<branch> ফর্মে হয়ে থাকে। উদাহরণস্বরূপ, যদি আপনি দেখতে চান যে আপনার origin রিমোটের master ব্রাঞ্চটি শেষবার যোগাযোগকালীনকেমন ছিল, আপনি origin/master ব্রাঞ্চটি পরীক্ষা করবেন। আপনি যদি একজন পার্টনার বা সঙ্গীর সাথে একটি সমস্যা নিয়ে কাজ করেন এবং তারা একটি iss53 ব্রাঞ্চকে পুশ করে দেয়, তাহলে আপনার নিজস্ব স্থানীয় বা লোকাল iss53 ব্রাঞ্চ থাকলেও সার্ভারের ব্রাঞ্চটি রিমোট-ট্র্যাকিং ব্রাঞ্চে origin/iss53 দ্বারা উপস্থাপিত হবে।
এটি কিছুটা বিভ্রান্তিকর হতে পারে, তাই আসুন একটি উদাহরণ দেখি। ধরা যাক git.ourcompany.com এ আপনার নেটওয়ার্কে আপনার একটি গিট সার্ভার রয়েছে। আপনি যদি এটি থেকে ক্লোন করেন, Git-এর ক্লোন কমান্ড স্বয়ংক্রিয়ভাবে আপনার জন্য এটির origin এর নাম দেয়, এর সমস্ত ডেটা পুল করে বা টেনে আনে, একটি পয়েন্টার তৈরি করে যেখানে এটির master ব্রাঞ্চ রয়েছে এবং স্থানীয়ভাবে এটির origin/master নাম দেয়। গিট আপনাকে আপনার নিজের স্থানীয় master ব্রাঞ্চ দেয় যেটি origin master ব্রাঞ্চের মতো একই জায়গায় শুরু হয়, যেখান থেকে আপনি কাজ করতে পারেন।
master/main/mainline/default এর মতো ব্রাঞ্চের নাম পরিবর্তন করলে আপনার রিপোজিটরিতে ব্যবহার করা ইন্টিগ্রেশন, পরিষেবা, হেল্পার ইউটিলিটি এবং বিল্ড/রিলিজ স্ক্রিপ্ট ভেঙে যাবে। আপনি এটি করার আগে, নিশ্চিত করুন যে আপনি আপনার সহযোগীদের সাথে পরামর্শ করেছেন৷ এছাড়াও, নিশ্চিত করুন যে আপনি আপনার রিপজিটরির মাধ্যমে একটি পুঙ্খানুপুঙ্খ অনুসন্ধান করেছেন এবং আপনার কোড এবং স্ক্রিপ্টগুলিতে পুরানো ব্রাঞ্চের নামের কোনও রেফারেন্স আপডেট করেছেন।
পুশিং
আপনি যখন বিশ্বের সাথে একটি ব্রাঞ্চ শেয়ার করতে চান, তখন আপনাকে এটিকে একটি রিমোটে পুশ দিতে হবে যেখানে আপনার লেখার অনুমতি রয়েছে। আপনার স্থানীয় ব্রাঞ্চগুলি আপনি যে রিমোটগুলিতে লেখেন তার সাথে স্বয়ংক্রিয়ভাবে সিঙ্ক্রোনাইজ হয় না — আপনি যে ব্রাঞ্চগুলি শেয়ার করতে চান সেগুলিকে বিশদভাবে পুশ করতে হবে৷ এইভাবে, আপনি যে কাজগুলি শেয়ার করতে চান না তার জন্য আপনি প্রাইভেট বা ব্যক্তিগত ব্রাঞ্চ ব্যবহার করতে পারেন এবং শুধুমাত্র যে বিষয়গুলির ব্রাঞ্চগুলিতে আপনি একসাথে কাজ করতে চান সেগুলোকে পুশ করতে পারেন৷
আপনার যদি serverfix নামে একটি ব্রাঞ্চ থাকে যাতে আপনি অন্যদের সাথে কাজ করতে চান তবে আপনি এটিকে পুশ করতে পারেন যেভাবে আপনি আপনার প্রথম ব্রাঞ্চটি পুশ করেছিলেন। এজন্যে git push <remote> <branch> চালানঃ
$ git push origin serverfix
Counting objects: 24, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (24/24), 1.91 KiB | 0 bytes/s, done.
Total 24 (delta 2), reused 0 (delta 0)
To https://github.com/schacon/simplegit
* [new branch] serverfix -> serverfix
এটি একটি শর্টকাট রয়েছে। গিট স্বয়ংক্রিয়ভাবে serverfix ব্রাঞ্চের নামটিকে refs/heads/serverfix:refs/heads/serverfix-এ প্রসারিত করে, যার অর্থ, “আমার serverfix এর স্থানীয় ব্রাঞ্চ নিন এবং রিমোটের serverfix ব্রাঞ্চ আপডেট করতে এটিকে পুশ করুন।” আমরা (অভ্যন্তরীণ গিট) -এ refs/heads/ অংশটি বিস্তারিতভাবে দেখব, কিন্তু আপনি সাধারণত এটি বাদ দিতে পারেন। আপনি git push origin serverfix:serverfix ও ব্যবহার করতে পারেন, যা একই কাজ করে — এটি বলে, “আমার serverfix নিন এবং এটিকে রিমোটের serverfix এ পরিণত করুন৷” আপনি একটি স্থানীয় ব্রাঞ্চকে একটি লোকাল ব্রাঞ্চে পুশ করে দিতে এই বিন্যাসটি ব্যবহার করতে পারেন যার নাম আলাদাভাবে দেওয়া হয়। আপনি যদি এটিকে রিমোটে serverfix বলতে না চান তবে এর পরিবর্তে git push origin serverfix:awesomebranch চালাতে পারেন: আপনার স্থানীয় serverfix ব্রাঞ্চটিকে রিমোট প্রজেক্টের awesomebranch ব্রাঞ্চে পুশ করে দিতে এটি করা যায়।
আপনি যদি পুশ করার জন্য একটি HTTPS URL ব্যবহার করেন তবে গিট সার্ভার আপনাকে অথেনটিকেশান এর জন্য আপনার ব্যবহারকারী নাম এবং পাসওয়ার্ড জিজ্ঞাসা করবে। ডিফল্টরূপে এটি আপনাকে এই তথ্যের জন্য টার্মিনালে প্রম্পট করবে যাতে সার্ভার আপনাকে পুশ দেওয়ার অনুমতি দেওয়া হয় কিনা তা বলতে পারে। আপনি যদি প্রতিবার পুশ করার সময় এটি টাইপ করতে না চান তবে আপনি একটি “credential cache” এ তা সেট আপ করতে পারেন। সবচেয়ে সহজ হল এটিকে কয়েক মিনিটের জন্য মেমরিতে রাখা, যা আপনি সহজেই git config –global credential.helper ক্যাশে চালিয়ে সেট আপ করতে পারেন। বিভিন্নরকম “credential cache” এর বিকল্প সম্পর্কে জানতে (credential সংরক্ষণ) দেখুন।
$ git fetch origin
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://github.com/schacon/simplegit
* [new branch] serverfix -> origin/serverfix
এই কাজটিকে আপনার বর্তমান কর্মরত ব্রাঞ্চে মার্জ করতে, আপনি git merge origin/serverfix চালাতে পারেন। আপনি যদি আপনার নিজস্ব serverfix ব্রাঞ্চ চান যেটিতে আপনি কাজ করতে পারেন, আপনি এটিকে আপনার রিমোট-ট্র্যাকিং ব্রাঞ্চ থেকে base এ পরিণত করতে পারেনঃ
$ git checkout -b serverfix origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
ব্রাঞ্চসমূহ অনুসরন করা
রিমোট-ট্র্যাকিং ব্রাঞ্চ থেকে একটি স্থানীয় ব্রাঞ্চ চেকাউট করা স্বয়ংক্রিয়ভাবে তৈরি “ট্র্যাকিং ব্রাঞ্চ” তৈরী করে (এবং এটি যে ব্রাঞ্চটিকে ট্র্যাক করে তাকে “আপস্ট্রিম ব্রাঞ্চ” বলা হয়)। ট্র্যাকিং ব্রাঞ্চগুলি হল স্থানীয় ব্রাঞ্চ যা একটি রিমোট ব্রাঞ্চ এর সাথে সরাসরি সম্পর্ক রাখে। আপনি যদি ট্র্যাকিং ব্রাঞ্চ এ থাকেন এবং git pull টাইপ করুন, গিট স্বয়ংক্রিয়ভাবে জানে কোন সার্ভার থেকে ফেচ করতে হবে এবং কোন ব্রাঞ্চে একত্রিত হবে।
আপনি যখন একটি রিপোজিটরি ক্লোন করেন, তখন এটি সাধারণত স্বয়ংক্রিয়ভাবে একটি master ব্রাঞ্চ তৈরি করে যা origin/master কে ট্র্যাক করে। যাইহোক, আপনি চাইলে অন্য ট্র্যাকিং ব্রাঞ্চগুলিও সেট আপ করতে পারেন—যেগুলি অন্য রিমোটে ব্রাঞ্চগুলিকে ট্র্যাক করে, অথবা master ব্রাঞ্চটিকে ট্র্যাক করে না৷ উদাহরণস্বরূপ সহজ কেসটি হল git checkout -b <branch> <remote>/<branch> রান করে যা আপনি এইমাত্র দেখেছেন। এটি একটি যথেষ্ট সাধারণ অপারেশন যে গিট –track শর্টহ্যান্ড প্রদান করেঃ
$ git checkout serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch serverfix from origin.
Switched to a new branch 'sf'
এখন, আপনার স্থানীয় ব্রাঞ্চ sf স্বয়ংক্রিয়ভাবে origin/serverfix থেকে পুল করবে।
আপনার যদি ইতিমধ্যেই একটি স্থানীয় ব্রাঞ্চ থাকে এবং এটিকে একটি রিমোট ব্রাঞ্চে সেট করতে চান যা আপনি এইমাত্র নামিয়েছেন, বা আপনি যে আপস্ট্রিম ব্রাঞ্চটি ট্র্যাক করছেন তা পরিবর্তন করতে চান, আপনি গিট এর -u বা —set-upstream-to কমান্ডটি ব্রাঞ্চটি স্পষ্টভাবে সেট করার জন্যে বিকল্প হিসেবে ব্যবহার করতে পারেন।
$ git branch -u origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
যখন আপনার একটি ট্র্যাকিং ব্রাঞ্চ এর সেটআপ রয়েছে, তখন আপনি @{upstream} বা @{u} শর্টহ্যান্ড দিয়ে এর আপস্ট্রিম ব্রাঞ্চের রেফারেন্স তৈরি করতে পারেন। তাই আপনি যদি master ব্রাঞ্চে থাকেন এবং এটি origin/master ট্র্যাক করে, তাহলে আপনি চাইলে git merge origin/master এর পরিবর্তে git merge @{u} এর মতো কিছু চালাতে পারেন।
$ git branch -vv
iss53 7e424c3 [origin/iss53: ahead 2] Add forgotten brackets
master 1ae2a45 [origin/master] Deploy index fix
* serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] This should do it
testing 5ea463a Try something new
এটা মনে রাখা গুরুত্বপূর্ণ যে এই সংখ্যাগুলি শুধুমাত্র শেষবার আপনি প্রতিটি সার্ভার থেকে ফেচ করে আনার পর থেকে এসেছে। এই কমান্ডটি সার্ভারগুলিতে পৌঁছায় না, এটি আপনাকে বলছে যে এটি স্থানীয়ভাবে এই সার্ভারগুলি থেকে কী ক্যাশ (cache) করেছে। আপনি যদি সামনে এবং পিছনের সংখ্যাগুলি সম্পূর্ণরূপে আপ টু ডেট চান তবে এটি চালানোর আগে আপনাকে আপনার সমস্ত রিমোট থেকে ফেচ করতে হবে। আপনি এটি এভাবে করতে পারেনঃ
$ git fetch --all; git branch -vv
$ git branch --all
* main
remotes/origin/HEAD -> origin/master
remotes/origin/main
remotes/origin/master
পুলিং
যদিও git fetch কমান্ড সার্ভারে সমস্ত পরিবর্তন আনবে যা আপনার এখনও নেই, এটি আপনার কার্যকারী ডিরেক্টরিকে মোটেও পরিবর্তন করবে না। এটি কেবল আপনার জন্য ডেটা নিয়ে আসবে এবং আপনাকে এটিকে মার্জ করতে দেবে। যাইহোক, git pull নামক একটি কমান্ড রয়েছে যা মূলত একটি git fetch যা বেশিরভাগ ক্ষেত্রেই একটি git merge দ্বারা অনুসরণ করা হয়। যদি আপনার কাছে শেষ সেকশানে প্রদর্শনের জন্যে একটি ট্র্যাকিং ব্রাঞ্চ সেট আপ করা থাকে, হয় স্পষ্টভাবে সেট করে নতুবা ক্লোন বা চেকআউট কমান্ড দ্বারা এটি আপনার জন্য তৈরি করে, git pull আপনার বর্তমান ব্রাঞ্চ কোন সার্ভার এবং ব্রাঞ্চ ট্র্যাক করছে তা সন্ধান করে আনবে। সেই সার্ভার থেকে ফেচ করুন এবং তারপর সেই রিমোট ব্রাঞ্চে মার্জ করার চেষ্টা করুন।সাধারনত সহজভাবে ফেচ এবং মার্জ কমান্ডগুলিকে স্পষ্টভাবে ব্যবহার করা ভাল কারণ git pull এর যাদু প্রায়শই বিভ্রান্তিকর হতে পারে।
রিমোট ব্রাঞ্চ ডিলিট করা
ধরুন আপনি একটি রিমোট ব্রাঞ্চের কাজ শেষ করেছেন —- ধরুন, আপনি এবং আপনার সহযোগীরা একটি ফিচার এর কাজ শেষ করেছেন এবং এটিকে আপনার রিমোট master ব্রাঞ্চে মার্জ করেছেন (অথবা আপনার স্থিতিশীল কোডলাইন যে শাখায় রয়েছে)। আপনি গিট পুশ করার জন্য –delete বিকল্পটি ব্যবহার করে একটি রিমোট ব্রাঞ্চ মুছে ফেলতে পারেন। আপনি যদি সার্ভার থেকে আপনার serverfix ব্রাঞ্চ মুছতে চান তবে আপনি নিম্নলিখিত কমান্ডগুলি চালানঃ
$ git push origin --delete serverfix
To https://github.com/schacon/simplegit
- [deleted] serverfix