এটি অর্জনের জন্য দুটি পদক্ষেপ রয়েছে:
- একটি নতুন ফাঁকা কমিট তৈরি করুন
- এই খালি প্রতিশ্রুতি থেকে শুরু করার জন্য ইতিহাস পুনরায় লেখুন
আমরা newroot
সুবিধার জন্য নতুন খালি প্রতিশ্রুতি অস্থায়ী শাখায় রেখে দেব ।
1. একটি নতুন ফাঁকা কমিট তৈরি করুন
আপনি এটি করতে পারেন এমন অনেকগুলি উপায় রয়েছে।
শুধু নদীর গভীরতানির্ণয় ব্যবহার
সবচেয়ে পরিষ্কার পদ্ধতিটি হ'ল গিটের নদীর গভীরতানির্ণয়টি কেবলমাত্র একটি প্রতিশ্রুতি তৈরি করতে ব্যবহার করা হয়, যা কার্যকরী অনুলিপি বা সূচককে স্পর্শ করা এড়ায় বা কোন শাখাটি পরীক্ষা করে আনা হয়, ইত্যাদি etc.
খালি ডিরেক্টরিতে একটি ট্রি অবজেক্ট তৈরি করুন:
tree=`git hash-object -wt tree --stdin < /dev/null`
এর চারপাশে একটি প্রতিশ্রুতি জড়ান:
commit=`git commit-tree -m 'root commit' $tree`
এটিতে একটি রেফারেন্স তৈরি করুন:
git branch newroot $commit
আপনি যদি নিজের শেলটি যথেষ্ট পরিমাণে জানেন তবে আপনি অবশ্যই পুরো পদ্ধতিটিকে ওয়ান-লাইনারে পুনর্বিন্যস্ত করতে পারেন।
নদীর গভীরতানির্ণয় ছাড়া
নিয়মিত চীনামাটির কমান্ডের সাহায্যে, আপনি newroot
কোনও উপযুক্ত কারণ ছাড়াই, শাখাটি পরীক্ষা করে এবং সূচকটি আপডেট না করে এবং বার বার অনুলিপি কার্য সম্পাদন করে খালি প্রতিশ্রুতি তৈরি করতে পারবেন না । তবে কারও কারও পক্ষে এটি বোঝা সহজ হতে পারে:
git checkout --orphan newroot
git rm -rf .
git clean -fd
git commit --allow-empty -m 'root commit'
নোট করুন যে গিটের খুব পুরানো সংস্করণগুলিতে যেটিতে --orphan
স্যুইচ নেই checkout
, আপনাকে প্রথম লাইনের সাথে এটি পরিবর্তন করতে হবে:
git symbolic-ref HEAD refs/heads/newroot
এই খালি প্রতিশ্রুতি থেকে শুরু করতে ইতিহাসের পুনর্লিখন করুন
আপনার কাছে এখানে দুটি বিকল্প রয়েছে: রিবেসিং, বা একটি পরিষ্কার ইতিহাস পুনর্লিখন।
Rebasing
git rebase --onto newroot --root master
এটি সরলতার গুণ আছে। যাইহোক, এটি শাখায় প্রতি শেষ প্রতিশ্রুতিবদ্ধদের প্রতিজ্ঞার নাম এবং তারিখ আপডেট করবে।
এছাড়াও, কিছু প্রান্তের মামলার ইতিহাস সহ, মার্জ কোন্দলের কারণে এটি ব্যর্থও হতে পারে - আপনি এমন কোনও প্রতিশ্রুতি দিচ্ছেন যাতে কিছুই নেই।
ইতিহাস পুনর্লিখন
ক্লিনার পদ্ধতির শাখাটি পুনরায় লেখার জন্য। এর বিপরীতে git rebase
, আপনাকে দেখতে হবে আপনার শাখাটি কখন থেকে শুরু করে প্রতিশ্রুতিবদ্ধ:
git replace <currentroot> --graft newroot
git filter-branch master
পুনর্লিখন দ্বিতীয় ধাপে ঘটে, স্পষ্টতই; এটি প্রথম পদক্ষেপ যার ব্যাখ্যা প্রয়োজন। git replace
এটি গিতকে কী বলে যে এটি যখনই আপনার প্রতিস্থাপন করতে চাইছে এমন কোনও সামগ্রীর রেফারেন্স দেখে, গিটের পরিবর্তে সেই বস্তুর প্রতিস্থাপনের দিকে নজর দেওয়া উচিত।
--graft
স্যুইচ দিয়ে আপনি এটিকে স্বাভাবিকের চেয়ে কিছুটা আলাদা বলছেন। আপনি বলছেন এখনো একটি প্রতিস্থাপন বস্তুর হবে না, কিন্তু আপনি প্রতিস্থাপন করতে চান <currentroot>
নিজেই একটি সঠিক অনুলিপি সঙ্গে বস্তুর কমিট ব্যতীত পিতা বা মাতা কমিট (গুলি) প্রতিস্থাপন এক (গুলি) আপনার যে তালিকাভুক্ত হওয়া উচিত (অর্থাত newroot
কমিট )। তারপরে git replace
এগিয়ে যায় এবং আপনার জন্য এই প্রতিশ্রুতি তৈরি করে এবং তারপরে সেই প্রতিশ্রুতিটিকে আপনার মূল প্রতিশ্রুতির প্রতিস্থাপন হিসাবে ঘোষণা করে।
এখন আপনি যদি এটি করেন git log
, আপনি দেখতে পাবেন যে জিনিসগুলি ইতিমধ্যে আপনি যেমন দেখতে চান তেমন দেখাচ্ছে: শাখাটি শুরু হয় newroot
।
তবে নোট করুন যা git replace
আসলে ইতিহাস পরিবর্তন করে না - এটি আপনার সংগ্রহশালার বাইরেও প্রচার করে না। এটি কেবলমাত্র আপনার রিপোজিটরিতে এক থেকে অন্য বস্তুতে স্থানীয় পুনর্নির্দেশকে যুক্ত করে। এর অর্থ হ'ল এই প্রতিস্থাপনের প্রভাব আর কেউ দেখেনি - কেবল আপনি।
এজন্য filter-branch
পদক্ষেপটি প্রয়োজনীয়। সঙ্গে git replace
আপনি রুট জন্য স্থায়ী পিতা বা মাতা করে দিয়ে একটি সঠিক অনুলিপি তৈরি কমিট; git filter-branch
তারপরে নিম্নলিখিত সমস্ত প্রতিশ্রুতিগুলির জন্যও এই প্রক্রিয়াটি পুনরাবৃত্তি করে। এইখানেই ইতিহাসটি পুনরায় লিখিত হয় যাতে আপনি এটি ভাগ করে নিতে পারেন।