৩.৫ গিট ব্রাঞ্চিং – রিমোট ব্রাঞ্চসমূহ

রিমোট ব্রাঞ্চসমূহ

রিমোট রেফারেন্স হল (পয়েন্টার) রিমোট রিপোজিটরির রেফারেন্সগুলো, যার মধ্যে রয়েছে ব্রাঞ্চসমূহ, ট্যাগ এবং আরও কিছু। আপনি রিমোট রেফারেন্সের একটি পুরো তালিকা পেতে পারেন 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 ব্রাঞ্চের মতো একই জায়গায় শুরু হয়, যেখান থেকে আপনি কাজ করতে পারেন।

নোট
“origin” বিশেষ কিছু নয়

master/main/mainline/default এর মতো ব্রাঞ্চের নাম পরিবর্তন করলে আপনার রিপোজিটরিতে ব্যবহার করা ইন্টিগ্রেশন, পরিষেবা, হেল্পার ইউটিলিটি এবং বিল্ড/রিলিজ স্ক্রিপ্ট ভেঙে যাবে। আপনি এটি করার আগে, নিশ্চিত করুন যে আপনি আপনার সহযোগীদের সাথে পরামর্শ করেছেন৷ এছাড়াও, নিশ্চিত করুন যে আপনি আপনার রিপজিটরির মাধ্যমে একটি পুঙ্খানুপুঙ্খ অনুসন্ধান করেছেন এবং আপনার কোড এবং স্ক্রিপ্টগুলিতে পুরানো ব্রাঞ্চের নামের কোনও রেফারেন্স আপডেট করেছেন।
চিত্র ৩০ঃ ক্লোনিং এর পর সার্ভার এবং স্থানীয়(local) রিপোজিটরি
আপনি যদি আপনার স্থানীয় master ব্রাঞ্চে কিছু কাজ করেন, এবং এর মধ্যে, অন্য কেউ git.ourcompany.com-এ পুশ দেয় এবং এর master ব্রাঞ্চ আপডেট করে, তাহলে আপনার history ভিন্নভাবে এগিয়ে যায়। এছাড়াও, যতক্ষণ আপনি আপনার origin সার্ভারের সাথে যোগাযোগের বাইরে থাকবেন, ততক্ষণ আপনার origin/master পয়েন্টার সরবে না।
চিত্র ৩১ঃ স্থানীয় এবং রিমোট কাজ ভিন্ন হতে পারে
একটি রিমোটের সাথে আপনার কাজ সিঙ্ক্রোনাইজ করতে, আপনি একটি git fetch কমান্ড চালান (আমাদের ক্ষেত্রে, git fetch origin)। এই কমান্ডটি কোন সার্ভারের “origin” তা সন্ধান করে (এই ক্ষেত্রে, এটি git.ourcompany.com), এটি থেকে এমন কোনও ডেটা নিয়ে আসে যা আপনার কাছে এখনও নেই এবং আপনার স্থানীয় ডাটাবেস আপডেট করে, আপনার origin/master পয়েন্টারকে নতুন, এবং আরো আপ-টু-ডেট অবস্থানে নিয়ে যায়।
চিত্র ৩২ঃ git fetch আপনার remote-tracking ব্রাঞ্চগুলোকে আপডেট করে
একাধিক রিমোট সার্ভার থাকা এবং সেই রিমোট প্রজেক্টগুলির জন্য রিমোর্ট ব্রাঞ্চগুলি কেমন দেখায় তা প্রদর্শন করতে, ধরুন আপনার কাছে অন্য একটি অভ্যন্তরীণ গিট সার্ভার রয়েছে যা শুধুমাত্র আপনার স্প্রিন্ট দলের দ্বারা ডেভেলাপ এর জন্য ব্যবহৃত হয়। এই সার্ভারটি git.team1.ourcompany.com এ রয়েছে। আপনি বর্তমানে যে প্রজেক্টে কাজ করছেন তার একটি নতুন রিমোট রেফারেন্স হিসাবে এটি যোগ করতে পারেন git remote add কমান্ডটি চালিয়ে যা আমরা (মৌলিক গিট) এ কভার করেছি। এই রিমোটটির teamone নাম দিন, যা সেই পুরো URL এর জন্য সংক্ষিপ্ত নাম হবে।
চিত্র ৩৩ঃ আরেকটি সার্ভারকে রিমোট হিসেবে যুক্ত করা
এখন, আপনি রিমোট teamone সার্ভারে যা কিছু এখনও নেই তা সব কিছু আনতে git fetch teamone চালাতে পারেন। যেহেতু এই সার্ভারে আপনার origin সার্ভারের এই মুহূর্তের ডেটার একটি উপসেট রয়েছে, গিট কোনও ডেটা আনে না কিন্তু একটি রিমোট-ট্র্যাকিং ব্রাঞ্চ সেট করে যার নাম teamone/master নামে, যা একটি কমিট নির্দেশ করার জন্য যেটি Teamone এর master ব্রাঞ্চ হিসাবে রয়েছে৷
চিত্র ৩৪ঃ teamone/master এর জন্যে রিমোট-ট্র্যাকিং ব্রাঞ্চ

পুশিং

আপনি যখন বিশ্বের সাথে একটি ব্রাঞ্চ শেয়ার করতে চান, তখন আপনাকে এটিকে একটি রিমোটে পুশ দিতে হবে যেখানে আপনার লেখার অনুমতি রয়েছে। আপনার স্থানীয় ব্রাঞ্চগুলি আপনি যে রিমোটগুলিতে লেখেন তার সাথে স্বয়ংক্রিয়ভাবে সিঙ্ক্রোনাইজ হয় না — আপনি যে ব্রাঞ্চগুলি শেয়ার করতে চান সেগুলিকে বিশদভাবে পুশ করতে হবে৷ এইভাবে, আপনি যে কাজগুলি শেয়ার করতে চান না তার জন্য আপনি প্রাইভেট বা ব্যক্তিগত ব্রাঞ্চ ব্যবহার করতে পারেন এবং শুধুমাত্র যে বিষয়গুলির ব্রাঞ্চগুলিতে আপনি একসাথে কাজ করতে চান সেগুলোকে পুশ করতে পারেন৷


আপনার যদি 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 সংরক্ষণ) দেখুন।
পরের বার আপনার সহযোগীদের মধ্যে একজন সার্ভার থেকে ফেচ করলে, তারা একটি রেফারেন্স পাবে যেখানে সার্ভারের serverfix সংস্করণটি রিমোট ব্রাঞ্চের origin/serverfix অধীনে রয়েছেঃ
				
					$ 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
				
			
এটা মনে রাখা গুরুত্বপূর্ণ যে আপনি যখন নতুন রিমোট-ট্র্যাকিং ব্রাঞ্চগুলি নিয়ে আসে এমন ফেচ করেন, তখন আপনার কাছে স্বয়ংক্রিয়ভাবে local, সম্পাদনাযোগ্য কপি থাকে না। অন্য কথায়, এই ক্ষেত্রে, আপনার কাছে একটি নতুন 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'
				
			
এটি আপনাকে একটি স্থানীয় ব্রাঞ্চ দেয় যেখানে আপনি আপনার origin/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} এর মতো কিছু চালাতে পারেন।
আপনি কোন ট্র্যাকিং ব্রাঞ্চগুলি সেট আপ করেছেন তা দেখতে চাইলে, -vv বিকল্পটি ব্যবহার করতে পারেন। প্রতিটি ব্রাঞ্চ কী ট্র্যাক করছে এবং আপনার স্থানীয় শাখা এগিয়ে, পিছনে বা উভয়ই আছে কিনা তা সহ আরও তথ্য এটি আপনার স্থানীয় ব্রাঞ্চগুলিতে তালিকাভুক্ত করবে।
				
					$ 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
				
			
সুতরাং এখানে আমরা দেখতে পাচ্ছি যে আমাদের iss53 ব্রাঞ্চটি ট্র্যাক করছে origin/iss53 এবং দুই এ এগিয়ে “আগে” আছে, যার অর্থ আমাদের স্থানীয়ভাবে দুটি কমিট রয়েছে যা সার্ভারে পুশদেয়া হয়নি। আমরা আরও দেখতে পাচ্ছি যে আমাদের master ব্রাঞ্চ origin/master ট্র্যাক করছে এবং আপ টু ডেট রয়েছে। এর পরে আমরা দেখতে পাচ্ছি যে আমাদের serverfix ব্রাঞ্চটি আমাদের teamone সার্ভারে server-fix-good ব্রাঞ্চটিকে ট্র্যাক করছে এবং তিন ধাপ এগিয়ে এবং এক ধাপ পিছিয়ে রয়েছে, যার অর্থ হল যে সার্ভারে একটি কমিট রয়েছে যা আমরা এখনও মার্জ করিনি এবং তিনটি কমিট স্থানীয়ভাবে আছে যেগুলো আমরা পুশ করিনি। অবশেষে আমরা দেখতে পাচ্ছি যে আমাদের টেস্টিং ব্রাঞ্চ কোনো রিমোট ব্রাঞ্চকে ট্র্যাক করছে না।

এটা মনে রাখা গুরুত্বপূর্ণ যে এই সংখ্যাগুলি শুধুমাত্র শেষবার আপনি প্রতিটি সার্ভার থেকে ফেচ করে আনার পর থেকে এসেছে। এই কমান্ডটি সার্ভারগুলিতে পৌঁছায় না, এটি আপনাকে বলছে যে এটি স্থানীয়ভাবে এই সার্ভারগুলি থেকে কী ক্যাশ (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
				
			
মূলত এই সব করে সার্ভার থেকে পয়েন্টার অপসারণ করা হয়। garbage collection রান না হওয়া পর্যন্ত গিট সার্ভার সাধারণত কিছুক্ষণের জন্য ডেটা সেখানে রেখে দেয়, তাই যদি এটি দুর্ঘটনাক্রমে মুছে ফেলা হলে পুনরুদ্ধার করা প্রায়শই সহজ।