স্কোয়াশিং মানে গিট মানে কি। আমি কীভাবে গিথুব-এ স্কোয়াশ করবো?
আমি গিতে নতুন এবং আমি কোলা-বিশ্লেষককে নতুন আগত বাগে নিয়োগের জন্য অনুরোধ করেছি। আমি বাগটি ঠিক করেছি এবং এখন আমাকে আমার কমান্ডগুলি স্কোয়াশ করতে বলা হয়েছিল। আমি এটা কিভাবে করব?
স্কোয়াশিং মানে গিট মানে কি। আমি কীভাবে গিথুব-এ স্কোয়াশ করবো?
আমি গিতে নতুন এবং আমি কোলা-বিশ্লেষককে নতুন আগত বাগে নিয়োগের জন্য অনুরোধ করেছি। আমি বাগটি ঠিক করেছি এবং এখন আমাকে আমার কমান্ডগুলি স্কোয়াশ করতে বলা হয়েছিল। আমি এটা কিভাবে করব?
উত্তর:
আপনি গিটকে আপনার কার্যনির্বাহী ডিরেক্টরি (আইস) এর স্ন্যাপশটের একটি উন্নত ডাটাবেস হিসাবে ভাবতে পারেন।
গিটের একটি খুব সুন্দর বৈশিষ্ট্য হ'ল কমিটের ইতিহাস পুনরায় লেখার ক্ষমতা।
এটি করার মূল কারণটি হ'ল এই জাতীয় ইতিহাস কেবলমাত্র সেই বিকাশকারীই প্রযোজ্য যে এটি তৈরি করেছে, তাই এটি ভাগ করে নেওয়া ভান্ডারে জমা দেওয়ার আগে এটি সরল করা বা আরও সুন্দর করা উচিত।
একটি প্রতিশ্রুতিবদ্ধ স্কোয়াশ মানে হ'ল একটি প্রতিমুগ্ধকর দৃষ্টিকোণ থেকে, বর্ণিত পরিবর্তিত পরিবর্তনগুলিকে তার পিতামাতার মধ্যে সরিয়ে নেওয়া যাতে আপনি দুটি (বা আরও) এর পরিবর্তে একটি প্রতিশ্রুতি দিয়ে শেষ করেন।
আপনি যদি এই প্রক্রিয়া একাধিক বার পুনরাবৃত্তি থাকে, তাহলে আপনি কমে যায় এন একটি একক এক কমিট।
দৃশ্যরূপে, যদি আপনি কমিট বাঁধা এ আপনার কাজ শুরু স্টার্ট , আপনি এই চান
আপনি লক্ষ্য করতে পারেন যে নতুন কমিটের নীল রঙের কিছুটা গা dark় শেড রয়েছে। এটা ইচ্ছাকৃত।
গিট স্কোয়াশিংয়ের জন্য একটি রিবেস দিয়ে ইন্টারেক্টিভ রিবেস নামে একটি বিশেষ ফর্ম অর্জন করা হয় ।
আপনি যখন একটি শাখা বিতে কমিটের সেটগুলি রিবাজ করেন তখন সরলকরণ , আপনি সেই পূর্বসূরিগুলির পরিবর্তে বি থেকে শুরু করে এই কমিটগুলি দ্বারা প্রবর্তিত সমস্ত পরিবর্তনগুলি প্রয়োগ করেন ।
একটি ভিজ্যুয়াল ক্লু
আবার নীল বিভিন্ন শেড নোট করুন।
একটি ইন্টারেক্টিভ রিবেস আপনাকে কমিটগুলি কীভাবে পুনর্নির্মাণ করা উচিত তা চয়ন করতে দেয়। আপনি যদি এই আদেশটি চালান:
git rebase -i branch
আপনি এমন একটি ফাইল দিয়ে শেষ করবেন যা পুনর্বাসনের জন্য করা কমিটগুলির তালিকা করে
pick ae3...
pick ef6...
pick 1e0...
pick 341...
আমি করে নাম উল্লেখ করেননি, কিন্তু এই চার বেশী থেকে করে হতে উদ্দেশ্যে করা হয় স্টার্ট করার হেড
এই তালিকাটি সম্পর্কে সুন্দর জিনিসটি এটি সম্পাদনযোগ্য ।
আপনি কমিটগুলি বাদ দিতে পারেন বা এগুলি স্কোয়াশ করতে পারেন ।
আপনাকে যা করতে হবে তা হ'ল প্রথম শব্দটি স্কোয়াশে পরিবর্তন করা ।
pick ae3...
squash ef6...
squash 1e0...
squash 341...
যদি আপনি সম্পাদকটি বন্ধ করে দেন এবং কোনও মার্জ সংঘাতের সন্ধান না পান তবে আপনি এই ইতিহাসটি দিয়ে শেষ করবেন:
আপনার ক্ষেত্রে, আপনি অন্য কোনও শাখায় পুনরায় চালু করতে চান না, বরং আগের প্রতিশ্রুতিতে চান।
প্রথম উদাহরণে প্রদর্শিত ইতিহাসের রূপান্তর করতে আপনাকে এরকম কিছু চালাতে হবে
git rebase -i HEAD~4
প্রথম আদেশ ব্যতীত সমস্ত কমিটের জন্য "কমান্ডগুলি" স্কোয়াশে পরিবর্তন করুন এবং তারপরে আপনার সম্পাদককে বন্ধ করুন।
ইতিহাস পরিবর্তনের বিষয়ে নোট
গিট-এ, কমিটগুলি কখনই সম্পাদিত হয় না। এগুলি ছাঁটাই করা যায়, পৌঁছানো যায় না, ক্লোন করা যায় তবে পরিবর্তন করা যায় না।
আপনি যখন রিবেস করবেন, আপনি আসলে নতুন কমিট তৈরি করছেন।
পুরানোগুলি কোনও রেফ দ্বারা আর অ্যাক্সেসযোগ্য হয় না, তাই ইতিহাসে প্রদর্শিত হয় না তবে তারা এখনও আছে!
রিবেসের জন্য বাস্তবে এটিই পাবেন:
আপনি যদি ইতিমধ্যে তাদের অন্য কোথাও ঠেলাঠেলি করেন তবে ইতিহাসের পুনর্লিখন আসলে একটি শাখা তৈরি করবে!
man git rebase: ভাঁজ প্রতিশ্রুতিবদ্ধতার জন্য প্রস্তাবিত প্রতিশ্রুতি বার্তাটি প্রথম প্রতিশ্রুতিবদ্ধদের প্রতিশ্রুতিবদ্ধ বার্তা এবং "স্কোয়াশ" কমান্ডের
git diffকী ঘটেছে তা দেখাতে আপনাকে সহায়তা করতে পারে।
রিবাজ কমান্ডটিতে তার --interactive(বা -i) মোডে দুর্দান্ত কিছু অপশন পাওয়া যায় এবং সর্বাধিক ব্যবহৃত একটি হ'ল স্কোয়াশ করার ক্ষমতা। এটি যা করে তা হ'ল ছোট কমিটগুলি নেওয়া এবং সেগুলি বৃহত্তরগুলির সাথে একত্রিত করা, যা আপনি যদি দিনের কাজটি গুছিয়ে রাখেন বা আপনি যদি নিজের পরিবর্তনগুলি অন্যরকমভাবে প্যাকেজ করতে চান তবে তা কার্যকর হতে পারে। আপনি কীভাবে সহজে এটি করতে পারেন তা আমরা এগিয়ে যাব।
সাবধানতার একটি শব্দ: কেবলমাত্র এমন প্রতিশ্রুতিগুলিতে করুন যা কোনও বাহ্যিক ভাণ্ডার ঠেকানো হয়নি। যদি আপনি মুছে ফেলতে চলেছেন এমন কমিটগুলি অন্যের যদি ভিত্তিক কাজ বন্ধ করে দেয় তবে প্রচুর দ্বন্দ্ব দেখা দিতে পারে। আপনার ইতিহাস অন্যের সাথে ভাগ করা থাকলে এটি পুনরায় লিখবেন না।
সুতরাং আসুন আমরা বলি যে আপনি কয়েকটি ছোট ছোট কমিট করেছেন এবং আপনি সেগুলি থেকে একটি আরও বড় প্রতিশ্রুতিবদ্ধ করতে চান। আমাদের সংগ্রহশালার ইতিহাস বর্তমানে এর মতো দেখাচ্ছে:
শেষ 4 টি কমিটগুলি আরও সুখী হবে যদি সেগুলি একসাথে আবৃত করা হয়, সুতরাং আসুন কেবল এটি করা যাক ইন্টারেক্টিভ রিবেসিংয়ের মাধ্যমে:
$ git rebase -i HEAD~4
pick 01d1124 Adding license
pick 6340aaa Moving license into its own file
pick ebfd367 Jekyll has become self-aware.
pick 30e0ccb Changed the tagline in the binary, too.
# Rebase 60709da..30e0ccb onto 60709da
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
সুতরাং, এখানে কয়েকটি জিনিস ঘটেছে। প্রথমত, আমি গিটকে বলেছিলাম যে যেখানে হেড হেড ~ 4 এর সাথে রয়েছে সেখান থেকে আমি সর্বশেষ চারটি কমিট ব্যবহার করে রিবেস করতে চাই। গিট এখন আমাকে উপরের পাঠ্যটিতে একটি সম্পাদক এনেছে এবং এতে কী করা যায় তার একটি সামান্য ব্যাখ্যা। এই স্ক্রীন থেকে আপনার কাছে প্রচুর বিকল্প উপলব্ধ রয়েছে তবে এখনই আমরা কেবল সমস্ত কিছুকে একটি প্রতিশ্রুতিতে স্কোয়াশ করতে চলেছি। সুতরাং, ফাইলটির প্রথম চারটি লাইন এটিকে পরিবর্তন করা কৌশলটি করবে:
pick 01d1124 Adding license
squash 6340aaa Moving license into its own file
squash ebfd367 Jekyll has become self-aware.
squash 30e0ccb Changed the tagline in the binary, too.
মূলত এটি গিটকে চারটি কমিটকে তালিকার প্রথম কমিটের সাথে একত্রিত করতে বলে। এটি সম্পন্ন এবং সংরক্ষণ করা হয়ে গেলে, অন্য সম্পাদক নিম্নলিখিতগুলির সাথে পপ আপ করেন:
# This is a combination of 4 commits.
# The first commit's message is:
Adding license
# This is the 2nd commit message:
Moving license into its own file
# This is the 3rd commit message:
Jekyll has become self-aware.
# This is the 4th commit message:
Changed the tagline in the binary, too.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# Explicit paths specified without -i nor -o; assuming --only paths...
# Not currently on any branch.
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: LICENSE
# modified: README.textile
# modified: Rakefile
# modified: bin/jekyll
#
যেহেতু আমরা অনেকগুলি কমিটকে একত্রিত করছি, গিট আপনাকে প্রক্রিয়াতে জড়িত বাকী চুক্তির উপর ভিত্তি করে নতুন কমিটের বার্তাটি সংশোধন করার অনুমতি দেয়। আপনি উপযুক্ত দেখতে বার্তাটি সম্পাদনা করুন, তারপরে সংরক্ষণ করুন এবং প্রস্থান করুন। এটি শেষ হয়ে গেলে, আপনার কমিটগুলি সফলভাবে স্কোয়াশ হয়ে গেছে!
Created commit 0fc4eea: Creating license file, and making jekyll self-aware.
4 files changed, 27 insertions(+), 30 deletions(-)
create mode 100644 LICENSE
Successfully rebased and updated refs/heads/master.
এবং যদি আমরা আবার ইতিহাসের দিকে নজর দিই ...

সুতরাং, এটি এখন পর্যন্ত তুলনামূলকভাবে ব্যথাহীন হয়েছে। আপনি যদি রিবেস চলাকালীন দ্বন্দ্বের মধ্যে পড়ে থাকেন তবে এগুলি সমাধান করার জন্য সাধারণত বেশ সহজ এবং গিট আপনাকে যথাসম্ভব এগিয়ে নিয়ে যায়। এর মূল বিষয়গুলি হল প্রশ্নে দ্বন্দ্ব, git addফাইলটি ঠিক করা এবং তারপরে git rebase --continueপ্রক্রিয়াটি আবার শুরু করা হবে। অবশ্যই, একটি git rebase --abortকরতে চাইলে আপনি আপনার আগের অবস্থায় ফিরিয়ে আনবেন। যদি কোনও কারণে আপনি রিবেসে কোনও প্রতিশ্রুতি হারিয়ে ফেলেছেন তবে আপনি এটি পুনরুদ্ধার করতে রিফ্লগটি ব্যবহার করতে পারেন।
বিশদটি এই লিঙ্কে পাওয়া যাবে ।
এর অর্থ কয়েকটি কমিটকে এক সাথে সংযুক্ত করা। একটু দেখো :
https://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one/