Vivasoft-logo

৭.১৩ গিট টুলস – রিপ্লেস ( প্রতিস্থাপন )

গিটের ডাটাবেসের অবজেক্ট অন্যান্য অবজেক্ট সাথে প্রতিস্থাপন করার জন্য একটি উপায় আছে। সাধারণত গিটের ডাটাবেসে সংরক্ষিত অবজেক্টগুলো পরিবর্তন করা যায় না।

গিটের রিপ্লেস কম্যান্ড আপনাকে অবজেক্ট নির্দিষ্ট করতে দেয় এবং বুজায় যে “যতবার আপনি অবজেক্ট টি নিবেন মনে করবেন এটি একটি ভিন্ন অবজেক্ট”। এটি সাধারণত গিটের ফিল্টার ব্রাঞ্চ এর হিস্ট্রি তৈরী না করে একটু কমিট কে রিপ্লেস করার জন্য উপযোগী।

আপনি একটি কমিটকে অন্য কমিটের সাথে “প্রতিস্থাপন” করে নতুন লাইনের প্রথম দিকের হিস্টোরিকে পুরানোটির সাথে সর্বশেষ কমিট দিয়ে লিখতে পারেন৷ এটি ভালো উপায় কারণ এর মানে হল যে আপনাকে আসলে নতুন হিস্টোরিতে প্রতিটি কমিট পুনরায় লিখতে হবে না, যেমনটি আপনাকে সাধারণত তাদের একসাথে সংযুক্ত করতে হবে।

আসুন এটি চেষ্টা করে দেখি। একটি রিপোজিটরি নেই, তার পর এটিকে দুটি রিপোজিটরিতে বিভক্ত করি, একটি নতুন এবং একটি পুরাতন, এবং তারপরে আমরা দেখব কিভাবে আমরা রিপ্লেস এর মাধ্যমে সাম্প্রতিক রিপোজিটরি SHA-1 ভ্যালু পরিবর্তন না করেই সেগুলিকে পুনরায় একত্রিত করতে পারি।

আমরা পাঁচটি কমিট সহ একটি রিপোজিটরি ব্যবহার করব:

				
					$ git log --oneline
ef989d8 Fifth commit
c6e1e95 Fourth commit
9c68fdc Third commit
945704c Second commit
c1822cf First commit
				
			

আমরা হিস্টোরিকে দুটি লাইনে বিভক্ত করতে চাই। একটি লাইন কমিট ওয়ান থেকে কমিট চারে যায় – এটি হবে পুরাতন ইতিহাস। দ্বিতীয় লাইনটি হবে কমিট চার এবং পাঁচ – এটি সাম্প্রতিক ইতিহাস হবে।

replace1

পুরাতন হিস্টোরি তৈরি করা সহজ, আমরা হিস্টোরিতে একটি ব্রাঞ্চ রাখতে পারি এবং তারপর সেই ব্রাঞ্চটিকে একটি নতুন রিমোট রিপোজিটরির masterব্রাঞ্চ এ পুশ করে দিতে পারি।

				
					$ git branch history c6e1e95
$ git log --oneline --decorate
ef989d8 (HEAD, master) Fifth commit
c6e1e95 (history) Fourth commit
9c68fdc Third commit
945704c Second commit
c1822cf First commit
				
			
replace2

এখন আমরা নতুন history ব্রাঞ্চকে আমাদের নতুন রিপোজিটরিরmasterব্রাঞ্চ এ পুশ করতে পারি:

				
					$ git remote add project-history https://github.com/schacon/project-history
$ git push project-history history:master
Counting objects: 12, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (12/12), 907 bytes, done.
Total 12 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (12/12), done.
To git@github.com:schacon/project-history.git
 * [new branch]      history -> master
				
			

ঠিক আছে, আমাদের হিস্টোরি পাবলিশ হয়েছে। এখন আমাদের সাম্প্রতিক হিস্টোরিকে ছোট করা। আমাদের একটি ওভারল্যাপ দরকার যাতে আমরা

				
					$ git log --oneline --decorate
ef989d8 (HEAD, master) Fifth commit
c6e1e95 (history) Fourth commit
9c68fdc Third commit
945704c Second commit
c1822cf First commit
				
			

এই ক্ষেত্রে একটা কমিট তৈরী করা দরকার যাতে হিস্ট্রিকে কিভাবে প্রসারিত করা হয়েছে তার নির্দেশাবলী থাকে। সুতরাং, আমরা যা করতে যাচ্ছি তা হল নির্দেশাবলী সহ আমাদের বেস পয়েন্ট হিসাবে একটি প্রাথমিক কমিট অবজেক্ট তৈরি করা, তারপর এটির উপরে অবশিষ্ট কমিটগুলি (চার এবং পাঁচ) রিবেজ করা ।

এটি করার জন্য, আমাদেরকে বিভক্ত করার জন্য একটি বিন্দু বেছে নিতে হবে, যেটি আমাদের জন্য তৃতীয় কমিট, যার আইডি 9c68fdc। সুতরাং, আমাদের বেস কমিট সেই ট্রি উপর ভিত্তি করে হবে। আমরা commit-tree কমান্ড ব্যবহার করে আমাদের বেস কমিট তৈরি করতে পারি, যা শুধু একটি ট্রি নেয় এবং আমাদেরকে একটি একেবারে নতুন, প্যারেন্ট বিহীন কমিট অবজেক্ট SHA-1 ফিরিয়ে দেবে।

				
					$ echo 'Get history from blah blah blah' | git commit-tree 9c68fdc^{tree}
622e88e9cbfbacfb75b5279245b9fb38dfea10cf
				
			

নোট

একটি সংশোধিত কমিটে একটি সংশোধিত কমিট বার্তার প্রয়োজন হতে পারে  ( বা নাও হতে পারে )

 

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

 

অন্যদিকে, যদি আপনার সংশোধনগুলি উপযুক্তভাবে তুচ্ছ হয়  ( যেমন: একটি নির্বোধ টাইপো ঠিক করা বা আপনি স্টেজে ভুলে গেছেন এমন একটি ফাইল যোগ করা ) পূর্বের কমিট বার্তাটি ঠিক রেখে, আপনি কেবল পরিবর্তনগুলি করতে পারেন, সেগুলি স্টেজ করতে পারেন এবং নিম্নলিখিত কমান্ড দিয়ে সম্পূর্ণরূপে অপ্রয়োজনীয় এডিটর সেশন এড়িয়ে চলুন:

 

$ git commit –amend –no-edit

replace2

ঠিক আছে, এখন যে আমাদের একটি বেস কমিট আছে, আমরা আমাদের হিস্টোরিকে বাকি হিস্টোরির সাথে রিবেজ করতে পারি git rebase –onto দিয়ে। –onto আর্গুমেন্টটি হবে SHA-1। যা আমরা সবেমাত্র commit-tree থেকে এসেছি এবং রিবেজ পয়েন্টটি হবে তৃতীয় কমিট (প্রথম কমিটের প্যারেন্ট কমিট রাখতে চাই আইডি 9c68fdc):

				
					$ git rebase --onto 622e88 9c68fdc
First, rewinding head to replay your work on top of it...
Applying: fourth commit
Applying: fifth commit
				
			
replace4 Replace

আসুন এখন এমন একজনের ভূমিকায় যাবো যে প্রথমবারের মতো প্রজেক্টটি ক্লোন করেছেন এবং পুরো ইতিহাস চান। আমরা ক্লোন করার রিপোজিটরির হিস্টোরি ডাটা চাই এবং আরেকটি রিমোট রিপোজিটরি যোগ করতে চাই ।

				
					$ git clone https://github.com/schacon/project
$ cd project

$ git log --oneline master
e146b5f Fifth commit
81a708d Fourth commit
622e88e Get history from blah blah blah

$ git remote add project-history https://github.com/schacon/project-history
$ git fetch project-history
From https://github.com/schacon/project-history
 * [new branch]      master     -> project-history/master
				
			

এখন কোলাবোরেটরদের master ব্রাঞ্চে তাদের সাম্প্রতিক কমিটগুলো এবং project-history/master ব্রাঞ্চে পুরাতন কমিটগুলো

				
					$ git log --oneline master
e146b5f Fifth commit
81a708d Fourth commit
622e88e Get history from blah blah blah

$ git log --oneline project-history/master
c6e1e95 Fourth commit
9c68fdc Third commit
945704c Second commit
c1822cf First commit
				
			

এগুলিকে একত্রিত করার জন্য, আপনি যে কমিট রিপ্লেস করতে চান তার সাথে আপনি কেবল git replace কল করতে পারেন এবং তারপরে যে কমিট এর সাথে রিপ্লেস করতে চান।

				
					$ git replace 81a708d c6e1e95
				
			

এখন, আপনি যদি master ব্রাঞ্চের হিস্টোরি দেখেন তবে এটি এইরকম দেখায়:

				
					$ git log --oneline master
e146b5f Fifth commit
81a708d Fourth commit
9c68fdc Third commit
945704c Second commit
c1822cf First commit
				
			
replace5 Replace